ERC-20
Overview
Max Total Supply
2,596,148,433,900,029.475358351316832627 bpt-sss
Holders
120
Market
Price
-
Onchain Market Cap
-
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xEcA0bc45...E6D3f09b3 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
ComposableStablePool
Compiler Version
v0.7.1+commit.f4a555be
Optimization Enabled:
Yes with 800 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;pragma experimental ABIEncoderV2;import "@balancer-labs/v2-interfaces/contracts/pool-stable/StablePoolUserData.sol";import "@balancer-labs/v2-interfaces/contracts/solidity-utils/helpers/BalancerErrors.sol";import "@balancer-labs/v2-interfaces/contracts/standalone-utils/IProtocolFeePercentagesProvider.sol";import "@balancer-labs/v2-interfaces/contracts/pool-utils/IRateProvider.sol";import "@balancer-labs/v2-interfaces/contracts/pool-utils/IVersion.sol";import "@balancer-labs/v2-solidity-utils/contracts/math/FixedPoint.sol";import "@balancer-labs/v2-solidity-utils/contracts/math/Math.sol";import "@balancer-labs/v2-solidity-utils/contracts/helpers/ERC20Helpers.sol";
12345678910111213141516171819202122232425// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity >=0.7.0 <0.9.0;/*** @notice Simple interface to retrieve the version of a deployed contract.*/interface IVersion {/*** @dev Returns a JSON representation of the contract version containing name, version number and task ID.*/function version() external view returns (string memory);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma experimental ABIEncoderV2;import "../solidity-utils/openzeppelin/IERC20.sol";import "../solidity-utils/helpers/IAuthentication.sol";import "../solidity-utils/helpers/ISignaturesValidator.sol";import "../solidity-utils/helpers/ITemporarilyPausable.sol";import "../solidity-utils/misc/IWETH.sol";import "./IAsset.sol";import "./IAuthorizer.sol";import "./IFlashLoanRecipient.sol";import "./IProtocolFeesCollector.sol";
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.7.0;/*** @dev Interface of the ERC20 standard as defined in the EIP.*/interface IERC20 {/*** @dev Returns the amount of tokens in existence.*/function totalSupply() external view returns (uint256);/*** @dev Returns the amount of tokens owned by `account`.*/function balanceOf(address account) external view returns (uint256);/*** @dev Moves `amount` tokens from the caller's account to `recipient`.** Returns a boolean value indicating whether the operation succeeded.** Emits a {Transfer} event.*/function transfer(address recipient, uint256 amount) external returns (bool);
12345678910111213141516171819202122// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;interface IAuthentication {/*** @dev Returns the action identifier associated with the external function described by `selector`.*/function getActionId(bytes4 selector) external view returns (bytes32);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;/*** @dev Interface for the SignatureValidator helper, used to support meta-transactions.*/interface ISignaturesValidator {/*** @dev Returns the EIP712 domain separator.*/function getDomainSeparator() external view returns (bytes32);/**
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;/*** @dev Interface for the TemporarilyPausable helper.*/interface ITemporarilyPausable {/*** @dev Emitted every time the pause state changes by `_setPaused`.*/event PausedStateChanged(bool paused);/**
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;import "../openzeppelin/IERC20.sol";/*** @dev Interface for WETH9.* See https://github.com/gnosis/canonical-weth/blob/0dd1ea3e295eef916d0c6223ec63141137d22d67/contracts/WETH9.sol*/interface IWETH is IERC20 {function deposit() external payable;function withdraw(uint256 amount) external;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;/*** @dev This is an empty interface used to represent either ERC20-conforming token contracts or ETH (using the zero* address sentinel value). We're just relying on the fact that `interface` can be used to declare new address-like* types.** This concept is unrelated to a Pool's Asset Managers.*/interface IAsset {// solhint-disable-previous-line no-empty-blocks}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;interface IAuthorizer {/*** @dev Returns true if `account` can perform the action described by `actionId` in the contract `where`.*/function canPerform(bytes32 actionId,address account,address where) external view returns (bool);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;// Inspired by Aave Protocol's IFlashLoanReceiver.import "../solidity-utils/openzeppelin/IERC20.sol";interface IFlashLoanRecipient {/*** @dev When `flashLoan` is called on the Vault, it invokes the `receiveFlashLoan` hook on the recipient.** At the time of the call, the Vault will have transferred `amounts` for `tokens` to the recipient. Before this* call returns, the recipient must have transferred `amounts` plus `feeAmounts` for each token back to the
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;pragma experimental ABIEncoderV2;import "../solidity-utils/openzeppelin/IERC20.sol";import "./IVault.sol";import "./IAuthorizer.sol";interface IProtocolFeesCollector {event SwapFeePercentageChanged(uint256 newSwapFeePercentage);event FlashLoanFeePercentageChanged(uint256 newFlashLoanFeePercentage);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;pragma experimental ABIEncoderV2;/*** @dev Source of truth for all Protocol Fee percentages, that is, how much the protocol charges certain actions. Some* of these values may also be retrievable from other places (such as the swap fee percentage), but this is the* preferred source nonetheless.*/interface IProtocolFeePercentagesProvider {// All fee percentages are 18-decimal fixed point numbers, so e.g. 1e18 = 100% and 1e16 = 1%.// Emitted when a new fee type is registered.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;// solhint-disable/*** @dev Reverts if `condition` is false, with a revert reason containing `errorCode`. Only codes up to 999 are* supported.* Uses the default 'BAL' prefix for the error code*/function _require(bool condition, uint256 errorCode) pure {if (!condition) _revert(errorCode);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;import "@balancer-labs/v2-interfaces/contracts/solidity-utils/helpers/BalancerErrors.sol";import "@balancer-labs/v2-interfaces/contracts/solidity-utils/helpers/IAuthentication.sol";/*** @dev Building block for performing access control on external functions.** This contract is used via the `authenticate` modifier (or the `_authenticateCaller` function), which can be applied* to external functions to only make them callable by authorized accounts.** Derived contracts must implement the `_canPerform` function, which holds the actual access control logic.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;library StablePoolUserData {enum JoinKind { INIT, EXACT_TOKENS_IN_FOR_BPT_OUT, TOKEN_IN_FOR_EXACT_BPT_OUT, ALL_TOKENS_IN_FOR_EXACT_BPT_OUT }enum ExitKind { EXACT_BPT_IN_FOR_ONE_TOKEN_OUT, BPT_IN_FOR_EXACT_TOKENS_OUT, EXACT_BPT_IN_FOR_ALL_TOKENS_OUT }function joinKind(bytes memory self) internal pure returns (JoinKind) {return abi.decode(self, (JoinKind));}function exitKind(bytes memory self) internal pure returns (ExitKind) {return abi.decode(self, (ExitKind));
1234567891011121314151617181920212223// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;interface IRateProvider {/*** @dev Returns an 18 decimal fixed point number that is the exchange rate of the token to some other underlying* token. The meaning of this rate depends on the context.*/function getRate() external view returns (uint256);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;import "@balancer-labs/v2-interfaces/contracts/solidity-utils/helpers/BalancerErrors.sol";import "./LogExpMath.sol";/* solhint-disable private-vars-leading-underscore */library FixedPoint {uint256 internal constant ONE = 1e18; // 18 decimal placesuint256 internal constant TWO = 2 * ONE;uint256 internal constant FOUR = 4 * ONE;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.7.0;import "@balancer-labs/v2-interfaces/contracts/solidity-utils/helpers/BalancerErrors.sol";/*** @dev Wrappers over Solidity's arithmetic operations with added overflow checks.* Adapted from OpenZeppelin's SafeMath library.*/library Math {/*** @dev Returns the absolute value of a signed integer.*/function abs(int256 a) internal pure returns (uint256) {return a > 0 ? uint256(a) : uint256(-a);}/*** @dev Returns the addition of two unsigned integers of 256 bits, reverting on overflow.*/function add(uint256 a, uint256 b) internal pure returns (uint256) {uint256 c = a + b;_require(c >= a, Errors.ADD_OVERFLOW);return c;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;import "@balancer-labs/v2-interfaces/contracts/solidity-utils/helpers/BalancerErrors.sol";import "@balancer-labs/v2-interfaces/contracts/solidity-utils/openzeppelin/IERC20.sol";import "@balancer-labs/v2-interfaces/contracts/vault/IAsset.sol";// solhint-disablefunction _asIAsset(IERC20[] memory tokens) pure returns (IAsset[] memory assets) {// solhint-disable-next-line no-inline-assemblyassembly {assets := tokens
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;import "@balancer-labs/v2-interfaces/contracts/solidity-utils/openzeppelin/IERC20.sol";import "@balancer-labs/v2-interfaces/contracts/solidity-utils/helpers/BalancerErrors.sol";library InputHelpers {function ensureInputLengthMatch(uint256 a, uint256 b) internal pure {_require(a == b, Errors.INPUT_LENGTH_MISMATCH);}function ensureInputLengthMatch(uint256 a,
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;pragma experimental ABIEncoderV2;import "@balancer-labs/v2-interfaces/contracts/vault/IGeneralPool.sol";import "./BasePool.sol";/*** @dev Extension of `BasePool`, adding a handler for `IGeneralPool.onSwap`.** Derived contracts must call `BasePool`'s constructor, and implement `_onSwapGivenIn` and `_onSwapGivenOut` along with* `BasePool`'s virtual functions. Inheriting from this contract lets derived contracts choose the General
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;import "@balancer-labs/v2-interfaces/contracts/solidity-utils/helpers/BalancerErrors.sol";import "@balancer-labs/v2-solidity-utils/contracts/helpers/WordCodec.sol";/*** Price rate caches are used to avoid querying the price rate for a token every time we need to work with it. It is* useful for slow changing rates, such as those that arise from interest-bearing tokens (e.g. waDAI into DAI).** The cache data is packed into a single bytes32 value with the following structure:* [ 32 bits | 32 bits | 96 bits | 96 bits ]
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;import "@balancer-labs/v2-interfaces/contracts/solidity-utils/helpers/BalancerErrors.sol";import "@balancer-labs/v2-interfaces/contracts/solidity-utils/openzeppelin/IERC20.sol";import "@balancer-labs/v2-interfaces/contracts/pool-utils/IRateProvider.sol";import "@balancer-labs/v2-pool-utils/contracts/BasePool.sol";import "./StableMath.sol";abstract contract ComposableStablePoolStorage is BasePool {using FixedPoint for uint256;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;import "@balancer-labs/v2-interfaces/contracts/solidity-utils/openzeppelin/IERC20.sol";import "@balancer-labs/v2-interfaces/contracts/pool-utils/IRateProvider.sol";import "@balancer-labs/v2-solidity-utils/contracts/helpers/ERC20Helpers.sol";import "@balancer-labs/v2-solidity-utils/contracts/helpers/InputHelpers.sol";import "@balancer-labs/v2-pool-utils/contracts/rates/PriceRateCache.sol";import "./ComposableStablePoolStorage.sol";abstract contract ComposableStablePoolRates is ComposableStablePoolStorage {
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;pragma experimental ABIEncoderV2;import "@balancer-labs/v2-solidity-utils/contracts/math/FixedPoint.sol";import "@balancer-labs/v2-solidity-utils/contracts/helpers/WordCodec.sol";import "@balancer-labs/v2-pool-utils/contracts/protocol-fees/ProtocolFeeCache.sol";import "@balancer-labs/v2-pool-utils/contracts/protocol-fees/InvariantGrowthProtocolSwapFees.sol";import "./ComposableStablePoolStorage.sol";import "./ComposableStablePoolRates.sol";import "./StableMath.sol";
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;import "@balancer-labs/v2-pool-utils/contracts/BasePoolAuthorization.sol";import "@balancer-labs/v2-solidity-utils/contracts/helpers/WordCodec.sol";import "./StableMath.sol";abstract contract StablePoolAmplification is BasePoolAuthorization {using WordCodec for bytes32;// This contract uses timestamps to slowly update its Amplification parameter over time. These changes must occur// over a minimum time period much larger than the blocktime, making timestamp manipulation a non-issue.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;import "@balancer-labs/v2-solidity-utils/contracts/math/FixedPoint.sol";import "@balancer-labs/v2-solidity-utils/contracts/math/Math.sol";// These functions start with an underscore, as if they were part of a contract and not a library. At some point this// should be fixed. Additionally, some variables have non mixed case names (e.g. P_D) that relate to the mathematical// derivations.// solhint-disable private-vars-leading-underscore, var-name-mixedcaselibrary StableMath {using FixedPoint for uint256;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated// documentation files (the “Software”), to deal in the Software without restriction, including without limitation the// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to// permit persons to whom the Software is furnished to do so, subject to the following conditions:// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the// Software.// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.pragma solidity ^0.7.0;import "@balancer-labs/v2-interfaces/contracts/solidity-utils/helpers/BalancerErrors.sol";/* solhint-disable *//*** @dev Exponentiation and logarithm functions for 18 decimal fixed point numbers (both base and exponent/argument).** Exponentiation and logarithm with arbitrary bases (x^y and log_x(y)) are implemented by conversion to natural* exponentiation and logarithm (where the base is Euler's number).*
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;pragma experimental ABIEncoderV2;import "./IBasePool.sol";/*** @dev IPools with the General specialization setting should implement this interface.** This is called by the Vault when a user calls `IVault.swap` or `IVault.batchSwap` to swap with this Pool.* Returns the number of tokens the Pool will grant to the user in a 'given in' swap, or that the user will* grant to the pool in a 'given out' swap.*
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;pragma experimental ABIEncoderV2;import "@balancer-labs/v2-interfaces/contracts/pool-utils/IAssetManager.sol";import "@balancer-labs/v2-interfaces/contracts/pool-utils/IControlledPool.sol";import "@balancer-labs/v2-interfaces/contracts/vault/IVault.sol";import "@balancer-labs/v2-interfaces/contracts/vault/IBasePool.sol";import "@balancer-labs/v2-solidity-utils/contracts/helpers/InputHelpers.sol";import "@balancer-labs/v2-solidity-utils/contracts/helpers/WordCodec.sol";import "@balancer-labs/v2-solidity-utils/contracts/helpers/TemporarilyPausable.sol";import "@balancer-labs/v2-solidity-utils/contracts/openzeppelin/ERC20.sol";
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;pragma experimental ABIEncoderV2;import "./IVault.sol";import "./IPoolSwapStructs.sol";/*** @dev Interface for adding and removing liquidity that all Pool contracts should implement. Note that this is not* the complete Pool contract interface, as it is missing the swap hooks. Pool contracts should also inherit from* either IGeneralPool or IMinimalSwapInfoPool*/interface IBasePool is IPoolSwapStructs {
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;pragma experimental ABIEncoderV2;import "../solidity-utils/openzeppelin/IERC20.sol";import "./IVault.sol";interface IPoolSwapStructs {// This is not really an interface - it just defines common structs used by other interfaces: IGeneralPool and// IMinimalSwapInfoPool.//// This data structure represents a request for a token swap, where `kind` indicates the swap type ('given in' or
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;pragma experimental ABIEncoderV2;import "../solidity-utils/openzeppelin/IERC20.sol";interface IAssetManager {/*** @notice Emitted when asset manager is rebalanced*/event Rebalance(bytes32 poolId);/**
1234567891011121314151617181920212223// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;import "../solidity-utils/openzeppelin/IERC20.sol";interface IControlledPool {function setSwapFeePercentage(uint256 swapFeePercentage) external;function setAssetManagerPoolConfig(IERC20 token, bytes memory poolConfig) external;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;import "@balancer-labs/v2-interfaces/contracts/solidity-utils/helpers/BalancerErrors.sol";import "../math/Math.sol";/*** @dev Library for encoding and decoding values stored inside a 256 bit word. Typically used to pack multiple values in* a single storage slot, saving gas by performing less storage accesses.** Each value is defined by its size and the least significant bit in the word, also known as offset. For example, two* 128 bit values may be encoded in a word by assigning one an offset of 0, and the other an offset of 128.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;import "@balancer-labs/v2-interfaces/contracts/solidity-utils/helpers/BalancerErrors.sol";import "@balancer-labs/v2-interfaces/contracts/solidity-utils/helpers/ITemporarilyPausable.sol";/*** @dev Allows for a contract to be paused during an initial period after deployment, disabling functionality. Can be* used as an emergency switch in case a security vulnerability or threat is identified.** The contract can only be paused during the Pause Window, a period that starts at deployment. It can also be* unpaused and repaused any number of times during this period. This is intended to serve as a safety measure: it lets* system managers react quickly to potentially dangerous situations, knowing that this action is reversible if careful
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.7.0;import "@balancer-labs/v2-interfaces/contracts/solidity-utils/helpers/BalancerErrors.sol";import "@balancer-labs/v2-interfaces/contracts/solidity-utils/openzeppelin/IERC20.sol";import "./SafeMath.sol";/*** @dev Implementation of the {IERC20} interface.** This implementation is agnostic to the way tokens are created. This means* that a supply mechanism has to be added in a derived contract using {_mint}.* For a generic mechanism see {ERC20PresetMinterPauser}.** TIP: For a detailed writeup see our guide* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How* to implement supply mechanisms].** We have followed general OpenZeppelin guidelines: functions revert instead* of returning `false` on failure. This behavior is nonetheless conventional* and does not conflict with the expectations of ERC20 applications.** Additionally, an {Approval} event is emitted on calls to {transferFrom}.* This allows applications to reconstruct the allowance for all accounts just
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;import "@balancer-labs/v2-interfaces/contracts/vault/IVault.sol";import "@balancer-labs/v2-solidity-utils/contracts/openzeppelin/ERC20Permit.sol";/*** @title Highly opinionated token implementation* @author Balancer Labs* @dev* - Includes functions to increase and decrease allowance as a workaround* for the well-known issue with `approve`:
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;import "@balancer-labs/v2-interfaces/contracts/vault/IAuthorizer.sol";import "@balancer-labs/v2-solidity-utils/contracts/helpers/Authentication.sol";/*** @dev Base authorization layer implementation for Pools.** The owner account can call some of the permissioned functions - access control of the rest is delegated to the* Authorizer. Note that this owner is immutable: more sophisticated permission schemes, such as multiple ownership,* granular roles, etc., could be built on top of this by making the owner a smart contract.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;import "@balancer-labs/v2-interfaces/contracts/solidity-utils/helpers/BalancerErrors.sol";import "@balancer-labs/v2-interfaces/contracts/pool-utils/BasePoolUserData.sol";import "@balancer-labs/v2-interfaces/contracts/pool-utils/IRecoveryMode.sol";import "@balancer-labs/v2-solidity-utils/contracts/math/FixedPoint.sol";import "./BasePoolAuthorization.sol";/*** @notice Handle storage and state changes for pools that support "Recovery Mode".
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.7.0;import "@balancer-labs/v2-interfaces/contracts/solidity-utils/helpers/BalancerErrors.sol";/*** @dev Wrappers over Solidity's arithmetic operations with added overflow* checks.** Arithmetic operations in Solidity wrap on overflow. This can easily result* in bugs, because programmers usually assume that an overflow raises an* error, which is the standard behavior in high level programming languages.* `SafeMath` restores this intuition by reverting the transaction when an* operation overflows.** Using this library instead of the unchecked operations eliminates an entire* class of bugs, so it's recommended to use it always.*/library SafeMath {/*** @dev Returns the addition of two unsigned integers, reverting on* overflow.** Counterpart to Solidity's `+` operator.*
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.7.0;import "@balancer-labs/v2-interfaces/contracts/solidity-utils/openzeppelin/IERC20Permit.sol";import "./ERC20.sol";import "../helpers/EOASignaturesValidator.sol";/*** @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].** Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by* presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't* need to send a transaction, and thus is not required to hold Ether at all.** _Available since v3.4._*/abstract contract ERC20Permit is ERC20, IERC20Permit, EOASignaturesValidator {// solhint-disable-next-line var-name-mixedcasebytes32 private constant _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");/**
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.7.0;/*** @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].** Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by* presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't* need to send a transaction, and thus is not required to hold Ether at all.*/interface IERC20Permit {/*** @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,* given `owner`'s signed approval.** IMPORTANT: The same issues {IERC20-approve} has related to transaction* ordering also apply here.** Emits an {Approval} event.** Requirements:** - `spender` cannot be the zero address.* - `deadline` must be a timestamp in the future.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;import "@balancer-labs/v2-interfaces/contracts/solidity-utils/helpers/BalancerErrors.sol";import "@balancer-labs/v2-interfaces/contracts/solidity-utils/helpers/ISignaturesValidator.sol";import "../openzeppelin/EIP712.sol";/*** @dev Utility for signing Solidity function calls.*/abstract contract EOASignaturesValidator is ISignaturesValidator, EIP712 {// Replay attack prevention for each account.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.7.0;/*** @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.** The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,* thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding* they need in their contracts using a combination of `abi.encode` and `keccak256`.** This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding* scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA* ({_hashTypedDataV4}).** The implementation of the domain separator was designed to be as efficient as possible while still properly updating* the chain id to protect against replay attacks on an eventual fork of the chain.** NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method* https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].** _Available since v3.4._*/abstract contract EIP712 {/* solhint-disable var-name-mixedcase */bytes32 private immutable _HASHED_NAME;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;library BasePoolUserData {// Special ExitKind for all pools, used in Recovery Mode. Use the max 8-bit value to prevent conflicts// with future additions to the ExitKind enums (or any front-end code that maps to existing values)uint8 public constant RECOVERY_MODE_EXIT_KIND = 255;// Return true if this is the special exit kind.function isRecoveryModeExitKind(bytes memory self) internal pure returns (bool) {// Check for the "no data" case, or abi.decode would revertreturn self.length > 0 && abi.decode(self, (uint8)) == RECOVERY_MODE_EXIT_KIND;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;/*** @dev Interface for the RecoveryMode module.*/interface IRecoveryMode {/*** @dev Emitted when the Recovery Mode status changes.*/event RecoveryModeStateChanged(bool enabled);/**
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;import "@balancer-labs/v2-interfaces/contracts/solidity-utils/helpers/BalancerErrors.sol";import "@balancer-labs/v2-interfaces/contracts/standalone-utils/IProtocolFeePercentagesProvider.sol";import "@balancer-labs/v2-solidity-utils/contracts/openzeppelin/SafeCast.sol";import "../RecoveryMode.sol";/*** @dev The Vault does not provide the protocol swap fee percentage in swap hooks (as swaps don't typically need this* value), so for swaps that need this value, we would have to to fetch it ourselves from the
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;import "@balancer-labs/v2-solidity-utils/contracts/math/FixedPoint.sol";import "@balancer-labs/v2-solidity-utils/contracts/math/Math.sol";import "./ProtocolFees.sol";library InvariantGrowthProtocolSwapFees {using FixedPoint for uint256;function getProtocolOwnershipPercentage(uint256 invariantGrowthRatio,uint256 supplyGrowthRatio,
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.7.0;import "@balancer-labs/v2-interfaces/contracts/solidity-utils/helpers/BalancerErrors.sol";/*** @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow* checks.** Downcasting from uint256/int256 in Solidity does not revert on overflow. This can* easily result in undesired exploitation or bugs, since developers usually* assume that overflows raise errors. `SafeCast` restores this intuition by* reverting the transaction when such an operation overflows.** Using this library instead of the unchecked operations eliminates an entire* class of bugs, so it's recommended to use it always.** Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing* all math on `uint256` and `int256` and then downcasting.*/library SafeCast {/*** @dev Converts an unsigned uint256 into a signed int256.** Requirements:
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-3.0-or-later// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.pragma solidity ^0.7.0;import "@balancer-labs/v2-solidity-utils/contracts/math/FixedPoint.sol";import "@balancer-labs/v2-solidity-utils/contracts/math/Math.sol";library ProtocolFees {using FixedPoint for uint256;/*** @dev Calculates the amount of BPT necessary to give ownership of a given percentage of the Pool.* Note that this function reverts if `poolPercentage` >= 100%, it's expected that the caller will enforce this.* @param totalSupply - The total supply of the pool prior to minting BPT.
12345678910111213141516171819{"optimizer": {"enabled": true,"runs": 800},"outputSelection": {"*": {"*": ["evm.bytecode","evm.deployedBytecode","devdoc","userdoc","metadata","abi"]}},"libraries": {}}
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"components":[{"internalType":"contract IVault","name":"vault","type":"address"},{"internalType":"contract IProtocolFeePercentagesProvider","name":"protocolFeeProvider","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"},{"internalType":"contract IRateProvider[]","name":"rateProviders","type":"address[]"},{"internalType":"uint256[]","name":"tokenRateCacheDurations","type":"uint256[]"},{"internalType":"bool","name":"exemptFromYieldProtocolFeeFlag","type":"bool"},{"internalType":"uint256","name":"amplificationParameter","type":"uint256"},{"internalType":"uint256","name":"swapFeePercentage","type":"uint256"},{"internalType":"uint256","name":"pauseWindowDuration","type":"uint256"},{"internalType":"uint256","name":"bufferPeriodDuration","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"version","type":"string"}],"internalType":"struct ComposableStablePool.NewPoolParams","name":"params","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"AmpUpdateStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"currentValue","type":"uint256"}],"name":"AmpUpdateStopped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"PausedStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"feeType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"protocolFeePercentage","type":"uint256"}],"name":"ProtocolFeePercentageCacheUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"RecoveryModeStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"swapFeePercentage","type":"uint256"}],"name":"SwapFeePercentageChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rate","type":"uint256"}],"name":"TokenRateCacheUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenIndex","type":"uint256"},{"indexed":true,"internalType":"contract IRateProvider","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"cacheDuration","type":"uint256"}],"name":"TokenRateProviderSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATE_PROTOCOL_SWAP_FEES_SENTINEL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableRecoveryMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableRecoveryMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"getActionId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getActualSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAmplificationParameter","outputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bool","name":"isUpdating","type":"bool"},{"internalType":"uint256","name":"precision","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAuthorizer","outputs":[{"internalType":"contract IAuthorizer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBptIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastJoinExitData","outputs":[{"internalType":"uint256","name":"lastJoinExitAmplification","type":"uint256"},{"internalType":"uint256","name":"lastPostJoinExitInvariant","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinimumBpt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getNextNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPausedState","outputs":[{"internalType":"bool","name":"paused","type":"bool"},{"internalType":"uint256","name":"pauseWindowEndTime","type":"uint256"},{"internalType":"uint256","name":"bufferPeriodEndTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPoolId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"feeType","type":"uint256"}],"name":"getProtocolFeePercentageCache","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProtocolFeesCollector","outputs":[{"internalType":"contract IProtocolFeesCollector","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProtocolSwapFeeDelegation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRateProviders","outputs":[{"internalType":"contract IRateProvider[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getScalingFactors","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSwapFeePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"getTokenRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"getTokenRateCache","outputs":[{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"oldRate","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"expires","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVault","outputs":[{"internalType":"contract IVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inRecoveryMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isExemptFromYieldProtocolFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"isTokenExemptFromYieldProtocolFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"poolId","type":"bytes32"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"balances","type":"uint256[]"},{"internalType":"uint256","name":"lastChangeBlock","type":"uint256"},{"internalType":"uint256","name":"protocolSwapFeePercentage","type":"uint256"},{"internalType":"bytes","name":"userData","type":"bytes"}],"name":"onExitPool","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"poolId","type":"bytes32"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"balances","type":"uint256[]"},{"internalType":"uint256","name":"lastChangeBlock","type":"uint256"},{"internalType":"uint256","name":"protocolSwapFeePercentage","type":"uint256"},{"internalType":"bytes","name":"userData","type":"bytes"}],"name":"onJoinPool","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"enum IVault.SwapKind","name":"kind","type":"uint8"},{"internalType":"contract IERC20","name":"tokenIn","type":"address"},{"internalType":"contract IERC20","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"poolId","type":"bytes32"},{"internalType":"uint256","name":"lastChangeBlock","type":"uint256"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"userData","type":"bytes"}],"internalType":"struct IPoolSwapStructs.SwapRequest","name":"swapRequest","type":"tuple"},{"internalType":"uint256[]","name":"balances","type":"uint256[]"},{"internalType":"uint256","name":"indexIn","type":"uint256"},{"internalType":"uint256","name":"indexOut","type":"uint256"}],"name":"onSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"poolId","type":"bytes32"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"balances","type":"uint256[]"},{"internalType":"uint256","name":"lastChangeBlock","type":"uint256"},{"internalType":"uint256","name":"protocolSwapFeePercentage","type":"uint256"},{"internalType":"bytes","name":"userData","type":"bytes"}],"name":"queryExit","outputs":[{"internalType":"uint256","name":"bptIn","type":"uint256"},{"internalType":"uint256[]","name":"amountsOut","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"poolId","type":"bytes32"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"balances","type":"uint256[]"},{"internalType":"uint256","name":"lastChangeBlock","type":"uint256"},{"internalType":"uint256","name":"protocolSwapFeePercentage","type":"uint256"},{"internalType":"bytes","name":"userData","type":"bytes"}],"name":"queryJoin","outputs":[{"internalType":"uint256","name":"bptOut","type":"uint256"},{"internalType":"uint256[]","name":"amountsIn","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"bytes","name":"poolConfig","type":"bytes"}],"name":"setAssetManagerPoolConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"swapFeePercentage","type":"uint256"}],"name":"setSwapFeePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"setTokenRateCacheDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rawEndValue","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"startAmplificationParameterUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopAmplificationParameterUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateProtocolFeePercentageCache","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"updateTokenRateCache","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6104e06040523480156200001257600080fd5b5060405162007dcc38038062007dcc833981016040819052620000359162001a28565b6020810151600019620000488362000ca1565b620000538462000cda565b8461010001518560000151600087604001518860600151620000808a608001513062000d2560201b60201c565b8a60800151516001016001600160401b03811180156200009f57600080fd5b50604051908082528060200260200182016040528015620000ca578160200160208202803683370190505b508b61012001518c61014001518d61016001518e6101800151828289898d85336001600160a01b031660001b8480604051806040016040528060018152602001603160f81b815250878781600390805190602001906200012c92919062001711565b5080516200014290600490602084019062001711565b50506005805460ff19166012179055508151602092830120608052805191012060a052507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c05260e0526001600160601b0319606091821b81166101005291901b166101205250620001c19050630966018083111561019462000ebf565b620001d66301e1338082111561019562000ebf565b4290910161014081905201610160528551620001f8906002111560c862000ebf565b620002126200020662000ed4565b8751111560c962000ebf565b620002288662000ed960201b620015b01760201c565b620002338462000ee5565b6040516309b2760f60e01b81526000906001600160a01b038c16906309b2760f9062000264908d9060040162001c9c565b602060405180830381600087803b1580156200027f57600080fd5b505af115801562000294573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ba9190620019f0565b604051633354e3e960e11b81529091506001600160a01b038c16906366a9c7d290620002ef9084908b908b9060040162001c00565b600060405180830381600087803b1580156200030a57600080fd5b505af11580156200031f573d6000803e3d6000fd5b505050508061018081815250508a6001600160a01b031663d2946c2b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200036657600080fd5b505afa1580156200037b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a1919062001a09565b60601b6001600160601b0319166101a05250620003d3995050506001891015965061012c955062000ebf945050505050565b620003e661138882111561012d62000ebf565b600062000401826103e862000f7960201b620015ba1760201c565b90506200040e8162000fa8565b5050805151620004236002821160c862000ebf565b620004426001820383602001515162000fe760201b620015e51760201c565b6101c0819052815180516000906200045657fe5b60200260200101516001600160a01b0316610200816001600160a01b031660601b8152505081600001516001815181106200048d57fe5b60200260200101516001600160a01b0316610220816001600160a01b031660601b815250508160000151600281518110620004c457fe5b60200260200101516001600160a01b0316610240816001600160a01b031660601b8152505060038111620004fa57600062000513565b8151805160039081106200050a57fe5b60200260200101515b60601b6001600160601b0319166102605260048111620005355760006200054e565b8151805160049081106200054557fe5b60200260200101515b60601b6001600160601b03191661028052600581116200057057600062000589565b8151805160059081106200058057fe5b60200260200101515b60601b6001600160601b0319166102a05281518051620005c29190600090620005ae57fe5b602002602001015162000ff660201b60201c565b6102c05281518051620005dc91906001908110620005ae57fe5b6102e05281518051620005f691906002908110620005ae57fe5b61030052600381116200060b57600062000621565b620006218260000151600381518110620005ae57fe5b6103205260048111620006365760006200064c565b6200064c8260000151600481518110620005ae57fe5b61034052600581116200066157600062000677565b620006778260000151600581518110620005ae57fe5b61036052815151600019015b600081118015620006b457508251805130919083908110620006a157fe5b60200260200101516001600160a01b0316115b15620006c4576000190162000683565b6101e08190528251516060906001600160401b0381118015620006e657600080fd5b5060405190808252806020026020018201604052801562000711578160200160208202803683370190505b5090506000805b8551518110156200084d57838110156200077857856020015181815181106200073d57fe5b60200260200101518382815181106200075257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506200079a565b8381146200079457856020015160018203815181106200073d57fe5b62000844565b620007e360006001600160a01b0316848381518110620007b657fe5b60200260200101516001600160a01b031614158260060184620010c560201b620015f2179092919060201c565b9150856040015180156200081e575060006001600160a01b03168382815181106200080a57fe5b60200260200101516001600160a01b031614155b1562000844576200084160018284620010c560201b620015f2179092919060201c565b91505b60010162000718565b506040850151151560f81b61046052815182906000906200086a57fe5b60200260200101516001600160a01b0316610380816001600160a01b031660601b81525050816001815181106200089d57fe5b60200260200101516001600160a01b03166103a0816001600160a01b031660601b8152505081600281518110620008d057fe5b60200260200101516001600160a01b03166103c0816001600160a01b031660601b815250506003825111620009075760006200091e565b816003815181106200091557fe5b60200260200101515b60601b6001600160601b0319166103e05281516004106200094157600062000958565b816004815181106200094f57fe5b60200260200101515b60601b6001600160601b0319166104005281516005106200097b57600062000992565b816005815181106200098957fe5b60200260200101515b60601b6001600160601b0319166104205261044052505082515160208085015151604086015151620009d395509293509190620010ee811b6200161917901c565b8051606090620009e4903062000d25565b8051909150600019015b60008111801562000a245750306001600160a01b031682828151811062000a1157fe5b60200260200101516001600160a01b0316115b1562000a345760001901620009ee565b6000805b84515181101562000b4d578281141562000a5157600191505b60208501518051828401916000918490811062000a6a57fe5b60200260200101516001600160a01b03161462000b435762000ac4818760200151848151811062000a9757fe5b60200260200101518860400151858151811062000ab057fe5b60200260200101516200110e60201b60201c565b8560200151828151811062000ad557fe5b60200260200101516001600160a01b0316817fdd6d1c9badb346de6925b358a472c937b41698d2632696759e43fd6527feeec48860400151858151811062000b1957fe5b602002602001015160405162000b30919062001cb1565b60405180910390a362000b438162001209565b5060010162000a38565b5050505050600019811460f881901b6104a0526001600160601b0319606084901b166104805262000b8083600262001248565b62000b8d83600362001248565b801562000ba75762000ba183600062001248565b62000c66565b60405163178b2b9360e21b815262000c3b906001600160a01b03851690635e2cae4c9062000bdb9060009060040162001cb1565b60206040518083038186803b15801562000bf457600080fd5b505afa15801562000c09573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000c2f9190620019f0565b83111561025862000ebf565b600060008051602062007dac8339815191528360405162000c5d919062001cb1565b60405180910390a25b8062000c73578162000c76565b60005b6104c0525050506101a0810151805162000c9991600d9160209091019062001711565b505062001d23565b62000cab62001792565b6040518060600160405280836080015181526020018360a0015181526020018360c0015181525090505b919050565b62000ce4620017b3565b604051806060016040528062000d0584608001513062000d2560201b60201c565b81526020018360a0015181526020018360e0015115158152509050919050565b606082516001016001600160401b038111801562000d4257600080fd5b5060405190808252806020026020018201604052801562000d6d578160200160208202803683370190505b50905082516000141562000db057818160008151811062000d8a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505062000eb9565b82515b60008111801562000dec5750826001600160a01b031684600183038151811062000dd957fe5b60200260200101516001600160a01b0316115b1562000e395783600182038151811062000e0257fe5b602002602001015182828151811062000e1757fe5b6001600160a01b03909216602092830291909101909101526000190162000db3565b60005b8181101562000e885784818151811062000e5257fe5b602002602001015183828151811062000e6757fe5b6001600160a01b039092166020928302919091019091015260010162000e3c565b508282828151811062000e9757fe5b60200260200101906001600160a01b031690816001600160a01b031681525050505b92915050565b8162000ed05762000ed081620013f3565b5050565b600690565b8062000ed08162001408565b62000efe62000ef36200148f565b82101560cb62000ebf565b62000f1762000f0c62001498565b82111560ca62000ebf565b62000f398160c0603f600854620014a460201b6200163617909392919060201c565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc9062000f6e90839062001cb1565b60405180910390a150565b600082820262000fa184158062000f9957508385838162000f9657fe5b04145b600362000ebf565b9392505050565b62000fb681804280620014c9565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a02338160405162000f6e919062001cb1565b62000ed0828214606762000ebf565b60006001600160a01b0382163014156200101a5750670de0b6b3a764000062000cd5565b6000826001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200105657600080fd5b505afa1580156200106b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001091919062001bdd565b60ff1690506000620010b06012836200153c60201b6200165e1760201c565b600a0a670de0b6b3a764000002949350505050565b60006001821b1984168284620010dd576000620010e0565b60015b60ff16901b17949350505050565b6200110982841480156200110157508183145b606762000ebf565b505050565b6000826001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200114a57600080fd5b505afa1580156200115f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620011859190620019f0565b6000858152600a6020908152604090912054919250620011b4908290849086906200167462001554821b17901c565b6000868152600a602052604090819020919091555185907fb77a83204ca282e08dc3a65b0a1ca32ea4e6875c38ef0bf5bf75e52a67354fac90620011fa90859062001cb1565b60405180910390a25050505050565b6000818152600a60209081526040909120549062001232908290620016ac620015b0821b17901c565b6000928352600a60205260409092209190915550565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c3263906200127990859060040162001cb1565b60206040518083038186803b1580156200129257600080fd5b505afa158015620012a7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012cd9190620019f0565b9050816200131157620012eb81620015db60201b620016c41760201c565b600b80546001600160401b0319166001600160401b0392909216919091179055620013c5565b600282141562001367576200133181620015db60201b620016c41760201c565b600b80546001600160401b03929092166801000000000000000002600160401b600160801b0319909216919091179055620013c5565b6003821415620013b8576200138781620015db60201b620016c41760201c565b600b80546001600160401b0392909216600160801b02600160801b600160c01b0319909216919091179055620013c5565b620013c56101bb620013f3565b8160008051602062007dac83398151915282604051620013e6919062001cb1565b60405180910390a2505050565b62001405816210905360ea1b620015f9565b50565b600281511015620014195762001405565b6000816000815181106200142957fe5b602002602001015190506000600190505b8251811015620011095760008382815181106200145357fe5b6020026020010151905062001484816001600160a01b0316846001600160a01b031610606562000ebf60201b60201c565b91506001016200143a565b64e8d4a5100090565b67016345785d8a000090565b6000620014b38484846200165a565b506001901b60001901811b1992909216911b1790565b620014e38160c06040620016b560201b620016e11760201c565b620014fd8360806040620016b560201b620016e11760201c565b6200151685604080620016b560201b620016e11760201c565b620015308760006040620016b560201b620016e11760201c565b17171760095550505050565b60006200154e83831115600162000ebf565b50900390565b600062001569606084901c1561014962000ebf565b620015a842830160e06020620015928660c083838c8c6000606062001636620014a4871b17861c565b620014a460201b6200163617909392919060201c565b949350505050565b600062000eb9620015c183620016ca565b60608085620014a460201b6200163617909392919060201c565b6000620015f56001600160401b038311156101ba62000ebf565b5090565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b6200166b6101008310606462000ebf565b620016a4600182101580156200169c57506200169860ff8461010003620016ea60201b620016f41760201c565b8211155b606462000ebf565b6200110983821c156101b462000ebf565b6000620016c48484846200165a565b50501b90565b600062000eb960006060846200170260201b6200170a179092919060201c565b6000818310620016fb578162000fa1565b5090919050565b6001901b6000190191901c1690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200175457805160ff191683800117855562001784565b8280016001018555821562001784579182015b828111156200178457825182559160200191906001019062001767565b50620015f5929150620017d6565b60405180606001604052806060815260200160608152602001606081525090565b604051806060016040528060608152602001606081526020016000151581525090565b5b80821115620015f55760008155600101620017d7565b805162000eb98162001d0d565b600082601f8301126200180b578081fd5b8151620018226200181c8262001ce1565b62001cba565b8181529150602080830190848101818402860182018710156200184457600080fd5b60005b84811015620018705781516200185d8162001d0d565b8452928201929082019060010162001847565b505050505092915050565b600082601f8301126200188c578081fd5b81516200189d6200181c8262001ce1565b818152915060208083019084810181840286018201871015620018bf57600080fd5b60005b8481101562001870578151620018d88162001d0d565b84529282019290820190600101620018c2565b600082601f830112620018fc578081fd5b81516200190d6200181c8262001ce1565b8181529150602080830190848101818402860182018710156200192f57600080fd5b60005b84811015620018705781518452928201929082019060010162001932565b8051801515811462000eb957600080fd5b600082601f83011262001972578081fd5b81516001600160401b0381111562001988578182fd5b60206200199e601f8301601f1916820162001cba565b92508183528481838601011115620019b557600080fd5b60005b82811015620019d5578481018201518482018301528101620019b8565b82811115620019e75760008284860101525b50505092915050565b60006020828403121562001a02578081fd5b5051919050565b60006020828403121562001a1b578081fd5b815162000fa18162001d0d565b60006020828403121562001a3a578081fd5b81516001600160401b038082111562001a51578283fd5b81840191506101c080838703121562001a68578384fd5b62001a738162001cba565b905062001a818684620017ed565b815262001a928660208501620017ed565b602082015260408301518281111562001aa9578485fd5b62001ab78782860162001961565b60408301525060608301518281111562001acf578485fd5b62001add8782860162001961565b60608301525060808301518281111562001af5578485fd5b62001b0387828601620017fa565b60808301525060a08301518281111562001b1b578485fd5b62001b29878286016200187b565b60a08301525060c08301518281111562001b41578485fd5b62001b4f87828601620018eb565b60c08301525062001b648660e0850162001950565b60e0820152610100838101519082015261012080840151908201526101408084015190820152610160808401519082015261018062001ba687828601620017ed565b908201526101a0838101518381111562001bbe578586fd5b62001bcc8882870162001961565b918301919091525095945050505050565b60006020828403121562001bef578081fd5b815160ff8116811462000fa1578182fd5b60006060820185835260206060818501528186518084526080860191508288019350845b8181101562001c4c5762001c39855162001d01565b8352938301939183019160010162001c24565b505084810360408601528551808252908201925081860190845b8181101562001c8e5762001c7b835162001d01565b8552938301939183019160010162001c66565b509298975050505050505050565b602081016003831062001cab57fe5b91905290565b90815260200190565b6040518181016001600160401b038111828210171562001cd957600080fd5b604052919050565b60006001600160401b0382111562001cf7578081fd5b5060209081020190565b6001600160a01b031690565b6001600160a01b03811681146200140557600080fd5b60805160a05160c05160e0516101005160601c6101205160601c6101405161016051610180516101a05160601c6101c0516101e0516102005160601c6102205160601c6102405160601c6102605160601c6102805160601c6102a05160601c6102c0516102e051610300516103205161034051610360516103805160601c6103a05160601c6103c05160601c6103e05160601c6104005160601c6104205160601c610440516104605160f81c6104805160601c6104a05160f81c6104c051615ed862001ed460003980610e4052508061091d52508061089d52806108c852806108f3525080610fef5280611277525080612b23525080611c87525080611c57525080611c27525080611bf7525080611bc7525080611b97525080612fb6525080612f86525080612f56525080612f26525080612ef6525080612ec6525080611f82525080611f40525080611efe525080611ebc525080611e7a525080611e385250806110805250806117395250806112d3525080610bff525080611b6b525080611b4752508061118052508061115c5250806110b8525080612d34525080612d76525080612d555250615ed86000f3fe608060405234801561001057600080fd5b50600436106103835760003560e01c806370464016116101de57806395d89b411161010f578063d2946c2b116100ad578063ddf4627b1161007c578063ddf4627b146106f6578063eb0f24d6146106fe578063ed24911d14610706578063f4b7964d1461070e57610383565b8063d2946c2b146106b5578063d505accf146106bd578063d5c096c4146106d0578063dd62ed3e146106e357610383565b8063aaabadc5116100e9578063aaabadc51461068a578063ab7759f114610692578063b35056b8146106a5578063b7b814fc146106ad57610383565b806395d89b411461065c578063a457c2d714610664578063a9059cbb1461067757610383565b80638456cb591161017c57806387ec68171161015657806387ec681714610619578063893d20e81461062c5780638d928af81461064157806390193b7c1461064957610383565b80638456cb59146105f6578063851c1bb3146105fe578063876f303b1461061157610383565b806377151bee116101b857806377151bee146105b05780637ecebe00146105b85780637f1260d1146105cb57806382687a56146105ee57610383565b8063704640161461056957806370a082311461057c57806374f3b0091461058f57610383565b80633644e515116102b857806354a844ba1161025657806355c676281161023057806355c67628146105215780636028bfd414610529578063679aefce1461054a5780636daccffa1461055257610383565b806354a844ba146104fe57806354dea00a1461050657806354fd4d501461051957610383565b8063395093511161029257806339509351146104ba5780633c975d51146104cd5780633f4ba83a146104e357806350dd6ed9146104eb57610383565b80633644e5151461049757806338e9922e1461049f57806338fff2d0146104b257610383565b80631c0de0511161032557806323b872dd116102ff57806323b872dd146104495780632df2c7c01461045c5780632f1a0bc91461046f578063313ce5671461048257610383565b80631c0de051146104085780631dd746ea1461041f578063238a2d591461043457610383565b8063095ea7b311610361578063095ea7b3146103ce5780630da0669c146103ee57806315b0015b146103f857806318160ddd1461040057610383565b806301ec954a1461038857806304842d4c146103b157806306fdde03146103b9575b600080fd5b61039b6103963660046158c7565b610721565b6040516103a89190615ce8565b60405180910390f35b61039b6107c7565b6103c16107d6565b6040516103a89190615dbe565b6103e16103dc366004615504565b61086c565b6040516103a89190615cc5565b6103f6610883565b005b6103e161091b565b61039b61093f565b610410610945565b6040516103a893929190615cd0565b61042761096e565b6040516103a89190615c8d565b61043c610978565b6040516103a89190615ba9565b6103e1610457366004615454565b610a13565b6103f661046a366004615400565b610a87565b6103f661047d366004615a16565b610aeb565b61048a610bce565b6040516103a89190615e29565b61039b610bd7565b6103f66104ad3660046159e6565b610be1565b61039b610bfd565b6103e16104c8366004615504565b610c21565b6104d5610c5c565b6040516103a8929190615e00565b6103f6610c87565b6103f66104f9366004615702565b610c99565b6103f6610cb7565b61039b610514366004615400565b610cc9565b6103c1610ce4565b61039b610d45565b61053c61053736600461561b565b610d58565b6040516103a8929190615dd1565b61039b610d8f565b61055a610dfb565b6040516103a893929190615dea565b61039b6105773660046159e6565b610e16565b61039b61058a366004615400565b610ecf565b6105a261059d36600461561b565b610eea565b6040516103a8929190615ca0565b6103e1610fed565b61039b6105c6366004615400565b611011565b6105de6105d9366004615400565b61101c565b6040516103a89493929190615e0e565b61039b61107e565b6103f66110a2565b61039b61060c3660046156be565b6110b4565b61039b611106565b61053c61062736600461561b565b611134565b61063461115a565b6040516103a89190615b95565b61063461117e565b61039b610657366004615400565b6111a2565b6103c16111bd565b6103e1610672366004615504565b61121e565b6103e1610685366004615504565b61125c565b610634611269565b6103e16106a0366004615400565b611273565b6103e16112ae565b6103f66112bf565b6106346112d1565b6103f66106cb366004615494565b6112f5565b6105a26106de36600461561b565b611380565b61039b6106f136600461541c565b6114a3565b61039b6114e0565b6103f66114e6565b61039b611512565b6103f661071c366004615504565b61151c565b6000846080015161074e61073361117e565b6001600160a01b0316336001600160a01b03161460cd611719565b610763610759610bfd565b82146101f4611719565b61076b611727565b61077d8484610778611737565b61175b565b6060610787611773565b905060008751600181111561079857fe5b146107af576107aa878787878561180c565b6107bc565b6107bc8787878785611865565b979650505050505050565b60006107d16118a0565b905090565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108625780601f1061083757610100808354040283529160200191610862565b820191906000526020600020905b81548152906001019060200180831161084557829003601f168201915b5050505050905090565b60006108793384846118a7565b5060015b92915050565b61088b61190f565b61089361091b565b156108c3576108c37f00000000000000000000000000000000000000000000000000000000000000006000611984565b6108ee7f00000000000000000000000000000000000000000000000000000000000000006002611984565b6109197f00000000000000000000000000000000000000000000000000000000000000006003611984565b565b7f000000000000000000000000000000000000000000000000000000000000000090565b60025490565b6000806000610952611b28565b15925061095d611b45565b9150610967611b69565b9050909192565b60606107d1611773565b60606000610984611737565b905060608167ffffffffffffffff8111801561099f57600080fd5b506040519080825280602002602001820160405280156109c9578160200160208202803683370190505b50905060005b82811015610a0c576109e081611b8d565b8282815181106109ec57fe5b6001600160a01b03909216602092830291909101909101526001016109cf565b5091505090565b600080610a2085336114a3565b9050610a44336001600160a01b0387161480610a3c5750838210155b61019e611719565b610a4f858585611cb6565b336001600160a01b03861614801590610a6a57506000198114155b15610a7c57610a7c85338584036118a7565b506001949350505050565b610a8f611d96565b6000610a9a82611e34565b90506000610aa782611b8d565b9050610ac06001600160a01b0382161515610155611719565b6000828152600a6020526040812054610ad890611fc2565b9050610ae5838383611fd1565b50505050565b610af36120b4565b610b03600183101561012c611719565b610b1461138883111561012d611719565b6000610b20824261165e565b9050610b346201518082101561013d611719565b600080610b3f6120e2565b91509150610b50811561013e611719565b6000610b5e866103e86115ba565b90506000838211610b8d57610b88610b7962015180866115ba565b610b8384886115ba565b612156565b610ba7565b610ba7610b9d62015180846115ba565b610b8386886115ba565b9050610bb9600282111561013f611719565b610bc584834289612189565b50505050505050565b60055460ff1690565b60006107d1611512565b610be96120b4565b610bf16121d8565b610bfa816121eb565b50565b7f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610879918590610c579086612264565b6118a7565b600c546000908190610c718160e9601761170a565b9250610c8081600060e961170a565b9150509091565b610c8f6120b4565b6109196000612276565b610ca16120b4565b610ca96121d8565b610cb382826122e9565b5050565b610cbf6120b4565b61091960016123de565b6000610cdc610cd783611e34565b612435565b90505b919050565b600d8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108625780601f1061083757610100808354040283529160200191610862565b6008546000906107d19060c0603f61170a565b60006060610d6e8651610d69611737565b6115e5565b610d83898989898989896124886124aa612513565b97509795505050505050565b60006060600080600080610da161263d565b9398509196509450925090506000610db98585612264565b90506000610dc56120e2565b5090506000848214610de057610ddb828961272d565b610de2565b835b9050610dee818461288f565b9850505050505050505090565b6000806000610e086120e2565b90949093506103e892509050565b6000610e206112ae565b15610e2d57506000610cdf565b81610e7957610e3a61091b565b610e64577f0000000000000000000000000000000000000000000000000000000000000000610e72565b600b5467ffffffffffffffff165b9050610cdf565b6002821415610ea15750600b5468010000000000000000900467ffffffffffffffff16610cdf565b6003821415610ec45750600b54600160801b900467ffffffffffffffff16610cdf565b610cdf6101bb6128e0565b6001600160a01b031660009081526020819052604090205490565b60608088610ef961073361117e565b610f04610759610bfd565b60606000610f11866128f0565b15610f3957610f1e61291f565b610f3089610f2a61093f565b88612932565b92509050610f8b565b610f41611727565b6060610f4b611773565b9050610f578a82612977565b610f7b8d8d8d8d8d610f676112ae565b610f71578d610f74565b60005b878e612488565b93509150610f8983826124aa565b505b610f958b826129e0565b81895167ffffffffffffffff81118015610fae57600080fd5b50604051908082528060200260200182016040528015610fd8578160200160208202803683370190505b509450945050505b5097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610cdc826111a2565b6000806000806000600a600061103188611e34565b81526020810191909152604001600020549050611052811515610155611719565b61105b816129ea565b9450611066816129f8565b935061107181612a06565b9597949650949392505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6110aa6120b4565b6109196001612276565b60007f0000000000000000000000000000000000000000000000000000000000000000826040516020016110e9929190615b52565b604051602081830303815290604052805190602001209050919050565b600080600061111361263d565b5050925092505061112d818361226490919063ffffffff16565b9250505090565b600060606111458651610d69611737565b610d8389898989898989612a28612a39612513565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108625780601f1061083757610100808354040283529160200191610862565b60008061122b33856114a3565b905080831061124557611240338560006118a7565b611252565b61125233858584036118a7565b5060019392505050565b6000610879338484611cb6565b60006107d1612aa2565b60007f00000000000000000000000000000000000000000000000000000000000000008015610cdc5750610cdc6112a983611e34565b612b1c565b6008546000906107d19060ff612b47565b6112c76120b4565b61091960006123de565b7f000000000000000000000000000000000000000000000000000000000000000090565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886113248c6111a2565b8960405160200161133a96959493929190615d10565b60405160208183030381529060405280519060200120905061136b8882611362878787612b51565b886101f8612b90565b6113768888886118a7565b5050505050505050565b6060808861138f61073361117e565b61139a610759610bfd565b6113a2611727565b60606113ac611773565b90506113b661093f565b61146357600060606113cb8d8d8d868b612be7565b915091506113e46113da6118a0565b83101560cc611719565b6113f660006113f16118a0565b612cc0565b6114098b6114026118a0565b8403612cc0565b6114138184612a39565b808a5167ffffffffffffffff8111801561142c57600080fd5b50604051908082528060200260200182016040528015611456578160200160208202803683370190505b5095509550505050610fe0565b61146d8882612977565b600060606114958d8d8d8d8d6114816112ae565b61148b578d61148e565b60005b898e612a28565b915091506114098b83612cc0565b60006114ad61117e565b6001600160a01b0316826001600160a01b031614156114cf575060001961087d565b6114d98383612cca565b905061087d565b60001981565b6114ee6120b4565b6000806114f96120e2565b9150915061150981610140611719565b610cb382612cf5565b60006107d1612d30565b6115246120b4565b61152c611d96565b600061153783611e34565b9050600061154482611b8d565b905061155d6001600160a01b0382161515610155611719565b611568828285611fd1565b806001600160a01b0316827fdd6d1c9badb346de6925b358a472c937b41698d2632696759e43fd6527feeec4856040516115a29190615ce8565b60405180910390a350505050565b80610cb381612dcd565b60008282026115de8415806115d75750838583816115d457fe5b04145b6003611719565b9392505050565b610cb38183146067611719565b60006001821b198416828461160857600061160b565b60015b60ff16901b17949350505050565b611631828414801561162a57508183145b6067611719565b505050565b6000611643848484612e46565b5082821b6000196001831b01831b198516175b949350505050565b600061166e838311156001611719565b50900390565b6000611687606084901c15610149611719565b61165642830160e060206116a48660c083838c8c60006060611636565b929190611636565b6000610cdc6116ba836129ea565b8390606080611636565b60006116dd67ffffffffffffffff8311156101ba611719565b5090565b60006116ee848484612e46565b50501b90565b600081831061170357816115de565b5090919050565b6001901b6000190191901c1690565b81610cb357610cb3816128e0565b61172f612e8c565b610919612e94565b7f000000000000000000000000000000000000000000000000000000000000000090565b611631818410801561176c57508183105b6064611719565b6060600061177f611737565b905060608167ffffffffffffffff8111801561179a57600080fd5b506040519080825280602002602001820160405280156117c4578160200160208202803683370190505b50905060005b82811015610a0c576117ed6117de82612435565b6117e783612ebc565b90612fda565b8282815181106117f957fe5b60209081029190910101526001016117ca565b60208501516000906001600160a01b0316301480611836575060408601516001600160a01b031630145b61184c576118478686868686613006565b611859565b6118598686868686613070565b90505b95945050505050565b60208501516000906001600160a01b031630148061188f575060408601516001600160a01b031630145b61184c576118478686868686613174565b620f424090565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611902908590615ce8565b60405180910390a3505050565b611917611d96565b61191f6121d8565b6060600080600061192e61263d565b945094509450509350600083111561194957611949836131cb565b60006119536120e2565b509050600083821461196e57611969828761272d565b611970565b825b905061197c82826131dc565b505050505050565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c3263906119b3908590600401615ce8565b60206040518083038186803b1580156119cb57600080fd5b505afa1580156119df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0391906159fe565b905081611a3a57611a13816116c4565b600b805467ffffffffffffffff191667ffffffffffffffff92909216919091179055611aeb565b6002821415611a8857611a4c816116c4565b600b805467ffffffffffffffff9290921668010000000000000000026fffffffffffffffff000000000000000019909216919091179055611aeb565b6003821415611ae057611a9a816116c4565b600b805467ffffffffffffffff92909216600160801b027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff909216919091179055611aeb565b611aeb6101bb6128e0565b817f6bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a82604051611b1b9190615ce8565b60405180910390a2505050565b6000611b32611b69565b4211806107d157505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000000000000000000000000000000000000000000090565b600081611bbb57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160011415611beb57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160021415611c1b57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160031415611c4b57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160041415611c7b57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160051415611cab57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b610cdf6101356128e0565b611ccd6001600160a01b0384161515610198611719565b611ce46001600160a01b0383161515610199611719565b611cef838383611631565b6001600160a01b038316600090815260208190526040902054611d1590826101a0613202565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611d449082612264565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611902908590615ce8565b60408051600080825260208201909252606091611dc9565b611db661526c565b815260200190600190039081611dae5790505b509050611dd461117e565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b8152600401611dff9190615bf6565b600060405180830381600087803b158015611e1957600080fd5b505af1158015611e2d573d6000803e3d6000fd5b5050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611e7857506000610cdf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611eba57506001610cdf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611efc57506002610cdf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611f3e57506003610cdf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611f8057506004610cdf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611cab57506005610cdf565b6000610cdc8260c0602061170a565b6000826001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b15801561200c57600080fd5b505afa158015612020573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204491906159fe565b6000858152600a6020526040902054909150612061818385611674565b6000868152600a602052604090819020919091555185907fb77a83204ca282e08dc3a65b0a1ca32ea4e6875c38ef0bf5bf75e52a67354fac906120a5908590615ce8565b60405180910390a25050505050565b60006120cb6000356001600160e01b0319166110b4565b9050610bfa6120da8233613218565b610191611719565b6000806000806000806120f3613301565b93509350935093508042101561214657600194508383111561212a57818103824203858503028161212057fe5b0484019550612141565b818103824203848603028161213b57fe5b04840395505b61214e565b600094508295505b505050509091565b60006121658215156004611719565b826121725750600061087d565b81600184038161217e57fe5b04600101905061087d565b61219584848484613360565b7f1835882ee7a34ac194f717a35e09bb1d24c82a3b9d854ab6c9749525b714cdf2848484846040516121ca9493929190615e0e565b60405180910390a150505050565b6109196121e3611b28565b610192611719565b6122006121f661339f565b82101560cb611719565b61221561220b6133a8565b82111560ca611719565b600854612226908260c0603f611636565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90612259908390615ce8565b60405180910390a150565b60008282016115de8482101583611719565b801561229657612291612287611b45565b4210610193611719565b6122ab565b6122ab6122a1611b69565b42106101a9611719565b6007805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490612259908390615cc5565b60006122f3610bfd565b905060006122ff61117e565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b815260040161232c929190615d89565b60806040518083038186803b15801561234457600080fd5b505afa158015612358573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237c9190615a37565b604051630639cdb560e21b81529094506001600160a01b03851693506318e736d492506123b0915085908790600401615d70565b600060405180830381600087803b1580156123ca57600080fd5b505af1158015611376573d6000803e3d6000fd5b6008546123ed908260ff6115f2565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890612420908390615cc5565b60405180910390a180610bfa57610bfa6133b4565b600061243f61107e565b8214156124555750670de0b6b3a7640000610cdf565b6000828152600a6020526040902054801561247857612473816129ea565b6115de565b670de0b6b3a76400009392505050565b60006060612499600088868661348e565b915091509850989650505050505050565b815181516124b99082906115e5565b60005b81811015610ae5576124f48482815181106124d357fe5b60200260200101518483815181106124e757fe5b602002602001015161288f565b84828151811061250057fe5b60209081029190910101526001016124bc565b3330146125d1576000306001600160a01b0316600036604051612537929190615b6a565b6000604051808303816000865af19150503d8060008114612574576040519150601f19603f3d011682016040523d82523d6000602084013e612579565b606091505b50509050806000811461258857fe5b60046000803e6000516001600160e01b0319166343adbafb60e01b81146125b3573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b6125d9611727565b60606125e3611773565b90506125ef8782612977565b600060606126078c8c8c8c8c8c898d8d63ffffffff16565b9150915061261981848663ffffffff16565b8051601f1982018390526343adbafb603f1983015260200260231982016044820181fd5b6060600080600080606061264f61117e565b6001600160a01b031663f94d4668612665610bfd565b6040518263ffffffff1660e01b81526004016126819190615ce8565b60006040518083038186803b15801561269957600080fd5b505afa1580156126ad573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126d5919081019061552f565b509150506126ea816126e5611773565b612977565b6126f38161353c565b965094506000612701610c5c565b90945090506000612713888684613575565b9450905061272187826135f1565b95505050509091929394565b80516000908190815b8181101561276e5761276485828151811061274d57fe5b60200260200101518461226490919063ffffffff16565b9250600101612736565b508161277f5760009250505061087d565b600082868302825b60ff811015612878578260005b868110156127d5576127cb6127a983876115ba565b6127c68c84815181106127b857fe5b60200260200101518a6115ba565b613609565b9150600101612794565b5083945061282e61280d6128076127ec848a6115ba565b6128016127f9888d6115ba565b6103e8613609565b90612264565b866115ba565b6127c661281d89600101856115ba565b6128016127f96103e889038a6115ba565b93508484111561285657600185850311612851578397505050505050505061087d565b61286f565b60018486031161286f578397505050505050505061087d565b50600101612787565b506128846101416128e0565b505050505092915050565b600061289e8215156004611719565b826128ab5750600061087d565b670de0b6b3a7640000838102906128ce908583816128c557fe5b04146005611719565b8281816128d757fe5b0491505061087d565b610bfa816210905360ea1b613629565b6000808251118015610cdc575060ff8016828060200190518101906129159190615a77565b60ff161492915050565b61091961292a6112ae565b6101b6611719565b60006060600060606129438761353c565b915091506000606061295683858961368a565b91509150816129668260006136b6565b95509550505050505b935093915050565b815181516129869082906115e5565b60005b81811015610ae5576129c18482815181106129a057fe5b60200260200101518483815181106129b457fe5b6020026020010151612fda565b8482815181106129cd57fe5b6020908102919091010152600101612989565b610cb38282613773565b6000610cdc8282606061170a565b6000610cdc8260608061170a565b600080612a1283611fc2565b9150612a218360e0602061170a565b9050915091565b60006060612499600188868661348e565b81518151612a489082906115e5565b60005b81811015610ae557612a83848281518110612a6257fe5b6020026020010151848381518110612a7657fe5b602002602001015161383f565b848281518110612a8f57fe5b6020908102919091010152600101612a4b565b6000612aac61117e565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015612ae457600080fd5b505afa158015612af8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d191906156e6565b6000610cdc7f0000000000000000000000000000000000000000000000000000000000000000600684015b1c60019081161490565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b6000612b9b8561388d565b9050612bb1612bab8783876138a9565b83611719565b612bc0428410156101b8611719565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606000612bf684613958565b9050612c116000826003811115612c0957fe5b1460ce611719565b6060612c1c8561396e565b9050612c2a815187516115e5565b612c348187612977565b6000612c3e6120e2565b5090506060612c4c83613984565b90506000612c5a838361272d565b9050806000612c776d80000000000000000000000000008361165e565b9050612c838d82612cc0565b8086612c8d61107e565b81518110612c9757fe5b602002602001018181525050612cad85846131dc565b509c939b50929950505050505050505050565b610cb38282613a26565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b612d0181824242613360565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a0233816040516122599190615ce8565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612d9d613ab3565b30604051602001612db2959493929190615d44565b60405160208183030381529060405280519060200120905090565b600281511015612ddc57610bfa565b600081600081518110612deb57fe5b602002602001015190506000600190505b8251811015611631576000838281518110612e1357fe5b60200260200101519050612e3c816001600160a01b0316846001600160a01b0316106065611719565b9150600101612dfc565b612e5561010083106064611719565b612e7d6001821015801561176c5750612e7360ff84610100036116f4565b8211156064611719565b61163183821c156101b4611719565b6109196121d8565b6000612e9e611737565b905060005b81811015610cb357612eb481613ab7565b600101612ea3565b600081612eea57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160011415612f1a57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160021415612f4a57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160031415612f7a57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160041415612faa57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160051415611cab57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b6000828202612ff48415806115d75750838583816115d457fe5b670de0b6b3a764000090049392505050565b60006130128583612977565b613033866060015183858151811061302657fe5b6020026020010151613b0b565b6060870152600061304687878787613b17565b90506130658184878151811061305857fe5b6020026020010151613b2b565b90506107bc81613b37565b600080808751600181111561308157fe5b14905061308e8684612977565b6130ae876060015184836130a257866130a4565b875b8151811061302657fe5b876060018181525050600060606000806130c78a613b53565b93509350935093506000806130da61107e565b8a14613100576130fb878e60600151876130f38e613bbc565b888b89613bf1565b61311b565b61311b878e60600151876131138f613bbc565b888b89613c2a565b9150915061312c8486858985613c4e565b8661314657613141828a8d8151811061305857fe5b613163565b613163828a8c8151811061315657fe5b6020026020010151613cce565b9d9c50505050505050505050505050565b60006131838660600151613cda565b60608701526131928583612977565b6131a6866060015183868151811061302657fe5b606087015260006131b987878787613cfb565b90506107bc8184868151811061315657fe5b610bfa6131d66112d1565b82612cc0565b6131e981600060e96116e1565b6131f68360e960176116e1565b17600c55610cb3613d0f565b60006132118484111583611719565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b61323761115a565b6001600160a01b031614158015613252575061325283613d45565b1561327a5761325f61115a565b6001600160a01b0316336001600160a01b031614905061087d565b613282612aa2565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016132b193929190615cf1565b60206040518083038186803b1580156132c957600080fd5b505afa1580156132dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d991906155fb565b6000806000806133206000604060095461170a9092919063ffffffff16565b6009549094506133329060408061170a565b600954909350613345906080604061170a565b6009549092506133589060c0604061170a565b905090919293565b61336d8160c060406116e1565b61337a83608060406116e1565b613386856040806116e1565b61339387600060406116e1565b17171760095550505050565b64e8d4a5100090565b67016345785d8a000090565b6133bc611d96565b60606133c661117e565b6001600160a01b031663f94d46686133dc610bfd565b6040518263ffffffff1660e01b81526004016133f89190615ce8565b60006040518083038186803b15801561341057600080fd5b505afa158015613424573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261344c919081019061552f565b5091505061345c816126e5611773565b606061346782613984565b905060006134736120e2565b5090506000613482828461272d565b9050610ae582826131dc565b60006060600060606000806134a289613b53565b935093509350935061529c8a6134ba57613d506134be565b613de55b9050600060606134d6868689878f8f8963ffffffff16565b9150915061529c8d6134ea5761165e6134ee565b6122645b90506134fb878383613e63565b600061350b89858463ffffffff16565b905061351a8789888c85613c4e565b836135268460006136b6565b9a509a5050505050505050505094509492505050565b600060606135638361354c61107e565b8151811061355657fe5b6020026020010151613ed0565b61356c84613984565b91509150915091565b6000806000806000613588888888613ee4565b9250925092508581116135a35760009450925061296f915050565b85830383830360006135c16135b782610e16565b6117e7858761288f565b905060006135dc6135d26002610e16565b6117e7858861288f565b919091019b939a509298505050505050505050565b60006115de61360084846115ba565b6127c684613f55565b60006136188215156004611719565b81838161362157fe5b049392505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60006060600061369984613f7b565b905060606136a8878784613f91565b919791965090945050505050565b6060825160010167ffffffffffffffff811180156136d357600080fd5b506040519080825280602002602001820160405280156136fd578160200160208202803683370190505b50905060005b815181101561376c5761371461107e565b811461374b578361372361107e565b82106137325760018203613734565b815b8151811061373e57fe5b602002602001015161374d565b825b82828151811061375957fe5b6020908102919091010152600101613703565b5092915050565b61378a6001600160a01b038316151561019b611719565b61379682600083611631565b6001600160a01b0382166000908152602081905260409020546137bc90826101b2613202565b6001600160a01b0383166000908152602081905260409020556137ef6137ea826137e461093f565b90614040565b61404e565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516138339190615ce8565b60405180910390a35050565b600061384e8215156004611719565b8261385b5750600061087d565b670de0b6b3a764000083810290613875908583816128c557fe5b82600182038161388157fe5b0460010191505061087d565b6000613897612d30565b826040516020016110e9929190615b7a565b60006138bb82516041146101b9611719565b60208281015160408085015160608601518251600080825295019283905292939092811a916001906138f4908990859088908890615da0565b6020604051602081039080840390855afa158015613916573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061394c5750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b600081806020019051810190610cdc9190615811565b6060818060200190518101906115de919061582c565b606080600183510367ffffffffffffffff811180156139a257600080fd5b506040519080825280602002602001820160405280156139cc578160200160208202803683370190505b50905060005b815181101561376c57836139e461107e565b82106139f357816001016139f5565b815b815181106139ff57fe5b6020026020010151828281518110613a1357fe5b60209081029190910101526001016139d2565b613a3260008383611631565b613a416137ea8261280161093f565b6001600160a01b038216600090815260208190526040902054613a649082612264565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613833908590615ce8565b4690565b613abf61107e565b811415613acb57610bfa565b6000818152600a60205260409020548015610cb357600080613aec83612a06565b9150915080421115610ae557610ae584613b0586611b8d565b84611fd1565b60006115de8383612fda565b600061185c60008660600151868686614053565b60006115de838361383f565b6000610cdc613b4c613b47610d45565b613f55565b839061383f565b60006060600080600080613b65610c5c565b91509150600060606000613b7a8a86866140c5565b9250925092506000613b8a6120e2565b5090506000868214613ba557613ba0828561272d565b613ba7565b825b949c939b509099509297509095505050505050565b6000613bd3613bc961107e565b8314156064611719565b613bdb61107e565b82106116dd57613bec82600161165e565b610cdc565b60008088613c0c57613c0788888888888861411d565b613c1a565b613c1a8888888888886141f4565b9150915097509795505050505050565b60008088613c4057613c07888888888888614255565b613c1a8888888888886142bb565b6000613c5a868661272d565b90506000613c68838561288f565b90506000613c768683612fda565b905080831115613cc4578083036000613ca0613c9a83613c9584610e16565b6115ba565b86613609565b90508015613cc1576000613cb487836135f1565b9050613cbf816131cb565b505b50505b61137688846131dc565b60006115de838361288f565b600080613cef613ce8610d45565b849061436a565b90506115de838261165e565b600061185c60018660600151868686614053565b6000613d19611737565b905060005b81811015610cb357613d2f81612b1c565b15613d3d57613d3d816143a6565b600101613d1e565b6000610cdc826143d4565b600060606000613d5f846143df565b90506001816002811115613d6f57fe5b1415613d8d57613d8387878a8c89896143f5565b9250925050613dda565b6002816002811115613d9b57fe5b1415613dac57613d83878a86614454565b6000816002811115613dba57fe5b1415613dcd57613d8387878a8c88614472565b613dd86101506128e0565b505b965096945050505050565b600060606000613df484613958565b90506001816003811115613e0457fe5b1415613e1857613d8387878a8c8989614513565b6003816003811115613e2657fe5b1415613e3757613d83878a86614562565b6002816003811115613e4557fe5b1415613e5857613d8387878a8c88614580565b613dd86101366128e0565b82518251613e729082906115e5565b60005b81811015611e2d57613eb1858281518110613e8c57fe5b6020026020010151858381518110613ea057fe5b60200260200101518563ffffffff16565b858281518110613ebd57fe5b6020908102919091010152600101613e75565b6000610cdc82613ede61093f565b9061165e565b6000806000613ef3858761272d565b9050838111613f0757808192509250613f4c565b613f1985613f14886145fa565b61272d565b9250613f2581846116f4565b9250613f3184846146eb565b9250613f3b610fed565b15613f4857829150613f4c565b8091505b93509350939050565b6000670de0b6b3a76400008210613f6d576000610cdc565b50670de0b6b3a76400000390565b6000818060200190518101906115de9190615a93565b60606000613f9f838561288f565b9050845167ffffffffffffffff81118015613fb957600080fd5b50604051908082528060200260200182016040528015613fe3578160200160208202803683370190505b50915060005b8551811015614037576140188287838151811061400257fe5b6020026020010151612fda90919063ffffffff16565b83828151811061402457fe5b6020908102919091010152600101613fe9565b50509392505050565b60006115de83836001613202565b600255565b6000606061406085613984565b9050600061406d85613bbc565b9050600061407a85613bbc565b905060006140866120e2565b5090506000614095828661272d565b90508a156140b7576140ab828686868e866146fb565b9550505050505061185c565b6140ab828686868e86614786565b6000606060008060606140d78861353c565b915091506000806140e9838a8a613575565b9150915060006140f985846135f1565b9050801561410a5761410a816131cb565b9390930199919850919650945050505050565b6000806060875167ffffffffffffffff8111801561413a57600080fd5b50604051908082528060200260200182016040528015614164578160200160208202803683370190505b5090508881888151811061417457fe5b6020026020010181815250506000614197878a848989614192610d45565b614819565b90506141bf8a8a8a815181106141a957fe5b602002602001015161165e90919063ffffffff16565b8989815181106141cb57fe5b602090810291909101015260006141e2878361165e565b919b919a509098505050505050505050565b600080600061420f8689898c898961420a610d45565b614aa9565b9050614221818989815181106141a957fe5b88888151811061422d57fe5b60209081029190910101526000614244868b61165e565b919a91995090975050505050505050565b60008060006142708689898c898961426b610d45565b614b98565b90506142988189898151811061428257fe5b602002602001015161226490919063ffffffff16565b8888815181106142a457fe5b60209081029190910101526000614244868b612264565b6000806060875167ffffffffffffffff811180156142d857600080fd5b50604051908082528060200260200182016040528015614302578160200160208202803683370190505b5090508881888151811061431257fe5b6020026020010181815250506000614335878a848989614330610d45565b614c65565b90506143478a8a8a8151811061428257fe5b89898151811061435357fe5b602090810291909101015260006141e28783612264565b60008282026143848415806115d75750838583816115d457fe5b8061439357600091505061087d565b670de0b6b3a76400006000198201613881565b6000818152600a60205260409020546143be816116ac565b6000928352600a60205260409092209190915550565b6000610cdc82614ecf565b600081806020019051810190610cdc9190615750565b6000606080600061440585614ef2565b91509150614415825188516115e5565b614422826126e588613984565b60006144348989858e8e614192610d45565b90506144448282111560cf611719565b9a91995090975050505050505050565b60006060600061446384614f15565b905060606136a8868884613f91565b6000606060008061448285614f2b565b91509150614494865182106064611719565b6060865167ffffffffffffffff811180156144ae57600080fd5b506040519080825280602002602001820160405280156144d8578160200160208202803683370190505b5090506144ec888884868e8e61420a610d45565b8183815181106144f857fe5b60209081029190910101529199919850909650505050505050565b6000606080600061452385614f42565b91509150614533875183516115e5565b614540826126e588613984565b60006145528989858e8e614330610d45565b90506144448282101560d0611719565b60006060600061457184614f5a565b905060606136a8868389614f70565b600060606000806145908561500c565b915091506145a2865182106064611719565b6060865167ffffffffffffffff811180156145bc57600080fd5b506040519080825280602002602001820160405280156145e6578160200160208202803683370190505b5090506144ec888884868e8e61426b610d45565b8051606090818167ffffffffffffffff8111801561461757600080fd5b50604051908082528060200260200182016040528015614641578160200160208202803683370190505b50905060005b828110156146e357600061465961107e565b821015614666578161466b565b816001015b905061467681612b1c565b6146935785828151811061468657fe5b60200260200101516146c3565b6146c38683815181106146a257fe5b6020026020010151600a600084815260200190815260200160002054615023565b8383815181106146cf57fe5b602090810291909101015250600101614647565b509392505050565b60008183101561170357816115de565b600061470d8387878151811061428257fe5b86868151811061471957fe5b60200260200101818152505060006147338888858861503e565b90508387878151811061474257fe5b60200260200101510387878151811061475757fe5b6020026020010181815250506147786001613ede838a89815181106141a957fe5b9150505b9695505050505050565b6000614798838786815181106141a957fe5b8685815181106147a457fe5b60200260200101818152505060006147be8888858961503e565b9050838786815181106147cd57fe5b6020026020010151018786815181106147e257fe5b602002602001018181525050614778600161280189898151811061480257fe5b60200260200101518461165e90919063ffffffff16565b600080805b87518110156148575761484d88828151811061483657fe5b60200260200101518361226490919063ffffffff16565b915060010161481e565b506060865167ffffffffffffffff8111801561487257600080fd5b5060405190808252806020026020018201604052801561489c578160200160208202803683370190505b5090506000805b89518110156149695760006148d4858c84815181106148be57fe5b602002602001015161383f90919063ffffffff16565b90506149168b83815181106148e557fe5b60200260200101516149108c85815181106148fc57fe5b60200260200101518e86815181106141a957fe5b9061383f565b84838151811061492257fe5b60200260200101818152505061495e6149578286858151811061494157fe5b602002602001015161436a90919063ffffffff16565b8490612264565b9250506001016148a3565b506060895167ffffffffffffffff8111801561498457600080fd5b506040519080825280602002602001820160405280156149ae578160200160208202803683370190505b50905060005b8a51811015614a795760008482815181106149cb57fe5b6020026020010151841115614a325760006149f46149e886613f55565b8e858151811061400257fe5b90506000614a08828e86815181106141a957fe5b9050614a29614a2282670de0b6b3a76400008d900361383f565b8390612264565b92505050614a49565b8a8281518110614a3e57fe5b602002602001015190505b614a59818d84815181106141a957fe5b838381518110614a6557fe5b6020908102919091010152506001016149b4565b506000614a868c8361272d565b90506000614a94828a61288f565b9050613163614aa282613f55565b8b9061436a565b600080614ac484614abe87614910818b61165e565b9061436a565b90506000614ad48a8a848b61503e565b90506000614ae8828b8b815181106141a957fe5b90506000805b8b51811015614b1057614b068c828151811061483657fe5b9150600101614aee565b506000614b39828d8d81518110614b2357fe5b602002602001015161288f90919063ffffffff16565b90506000614b4682613f55565b90506000614b54858361436a565b90506000614b62868361165e565b9050614b83614b7c83670de0b6b3a76400008d9003612fda565b8290612264565b98505050505050505050979650505050505050565b600080614bad84614abe87614910818b612264565b90506000614bbd8a8a848b61503e565b90506000614be78a8a81518110614bd057fe5b60200260200101518361165e90919063ffffffff16565b90506000805b8b51811015614c0f57614c058c828151811061483657fe5b9150600101614bed565b506000614c22828d8d81518110614b2357fe5b90506000614c2f82613f55565b90506000614c3d858361436a565b90506000614c4b868361165e565b9050614b83614b7c83670de0b6b3a76400008d900361383f565b600080805b8751811015614c8c57614c8288828151811061483657fe5b9150600101614c6a565b506060865167ffffffffffffffff81118015614ca757600080fd5b50604051908082528060200260200182016040528015614cd1578160200160208202803683370190505b5090506000805b8951811015614d6b576000614cf3858c8481518110614b2357fe5b9050614d358b8381518110614d0457fe5b6020026020010151614d2f8c8581518110614d1b57fe5b60200260200101518e868151811061428257fe5b9061288f565b848381518110614d4157fe5b602002602001018181525050614d606149578286858151811061400257fe5b925050600101614cd8565b506060895167ffffffffffffffff81118015614d8657600080fd5b50604051908082528060200260200182016040528015614db0578160200160208202803683370190505b50905060005b8a51811015614e7157600083858381518110614dce57fe5b60200260200101511115614e2a576000614df36149e886670de0b6b3a764000061165e565b90506000614e07828e86815181106141a957fe5b9050614e21614a2282670de0b6b3a76400008d9003612fda565b92505050614e41565b8a8281518110614e3657fe5b602002602001015190505b614e51818d848151811061428257fe5b838381518110614e5d57fe5b602090810291909101015250600101614db6565b506000614e7e8c8361272d565b90506000614e8c828a61288f565b9050670de0b6b3a7640000811115614ec057614eb38a670de0b6b3a763ffff198301612fda565b965050505050505061477c565b6000965050505050505061477c565b6000614ee163f4b7964d60e01b6110b4565b821480610cdc5750610cdc826151fb565b6060600082806020019051810190614f0a919061576b565b909590945092505050565b6000818060200190518101906115de91906157b0565b60008082806020019051810190614f0a91906157dc565b6060600082806020019051810190614f0a919061586f565b6000818060200190518101906115de919061588d565b60606000614f7e848461383f565b90506060855167ffffffffffffffff81118015614f9a57600080fd5b50604051908082528060200260200182016040528015614fc4578160200160208202803683370190505b50905060005b865181101561500257614fe38388838151811061494157fe5b828281518110614fef57fe5b6020908102919091010152600101614fca565b5095945050505050565b60008082806020019051810190614f0a91906158a9565b60006115de61503584613c95856129f8565b6127c6846129ea565b60008084518602905060008560008151811061505657fe5b60200260200101519050600086518760008151811061507157fe5b60200260200101510290506000600190505b87518110156150d7576150bc6150b66150af848b85815181106150a257fe5b60200260200101516115ba565b8a516115ba565b88613609565b91506150cd88828151811061274d57fe5b9250600101615083565b508685815181106150e457fe5b60200260200101518203915060006150fc87886115ba565b9050600061512861511c61511484610b8389886115ba565b6103e86115ba565b8a89815181106150a257fe5b9050600061514361513c6151148b89613609565b8690612264565b905060008061515f6151558686612264565b610b838d86612264565b905060005b60ff8110156151df578192506151946151818661280185866115ba565b610b838e613ede886128018860026115ba565b9150828211156151bd576001838303116151b8575097506116569650505050505050565b6151d7565b6001828403116151d7575097506116569650505050505050565b600101615164565b506151eb6101426128e0565b5050505050505050949350505050565b600061520d632f1a0bc960e01b6110b4565b8214806152285750615225637587926b60e11b6110b4565b82145b80610cdc5750610cdc826000615244631c74c91760e11b6110b4565b82148061525f575061525c6350dd6ed960e01b6110b4565b82145b80610cdc57506000610cdc565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565bfe5b803561087d81615e7e565b600082601f8301126152b9578081fd5b81356152cc6152c782615e5e565b615e37565b8181529150602080830190848101818402860182018710156152ed57600080fd5b60005b84811015612884578135845292820192908201906001016152f0565b600082601f83011261531c578081fd5b815161532a6152c782615e5e565b81815291506020808301908481018184028601820187101561534b57600080fd5b60005b848110156128845781518452928201929082019060010161534e565b600082601f83011261537a578081fd5b813567ffffffffffffffff811115615390578182fd5b6153a3601f8201601f1916602001615e37565b91508082528360208285010111156153ba57600080fd5b8060208401602084013760009082016020015292915050565b80516003811061087d57600080fd5b80516004811061087d57600080fd5b80356002811061087d57600080fd5b600060208284031215615411578081fd5b81356115de81615e7e565b6000806040838503121561542e578081fd5b823561543981615e7e565b9150602083013561544981615e7e565b809150509250929050565b600080600060608486031215615468578081fd5b833561547381615e7e565b9250602084013561548381615e7e565b929592945050506040919091013590565b600080600080600080600060e0888a0312156154ae578283fd5b87356154b981615e7e565b965060208801356154c981615e7e565b9550604088013594506060880135935060808801356154e781615e93565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215615516578182fd5b823561552181615e7e565b946020939093013593505050565b600080600060608486031215615543578081fd5b835167ffffffffffffffff8082111561555a578283fd5b818601915086601f83011261556d578283fd5b815161557b6152c782615e5e565b80828252602080830192508086018b82838702890101111561559b578788fd5b8796505b848710156155c65780516155b281615e7e565b84526001969096019592810192810161559f565b5089015190975093505050808211156155dd578283fd5b506155ea8682870161530c565b925050604084015190509250925092565b60006020828403121561560c578081fd5b815180151581146115de578182fd5b600080600080600080600060e0888a031215615635578081fd5b87359650602088013561564781615e7e565b9550604088013561565781615e7e565b9450606088013567ffffffffffffffff80821115615673578283fd5b61567f8b838c016152a9565b955060808a0135945060a08a0135935060c08a01359150808211156156a2578283fd5b506156af8a828b0161536a565b91505092959891949750929550565b6000602082840312156156cf578081fd5b81356001600160e01b0319811681146115de578182fd5b6000602082840312156156f7578081fd5b81516115de81615e7e565b60008060408385031215615714578182fd5b823561571f81615e7e565b9150602083013567ffffffffffffffff81111561573a578182fd5b6157468582860161536a565b9150509250929050565b600060208284031215615761578081fd5b6115de83836153d3565b60008060006060848603121561577f578081fd5b61578985856153d3565b9250602084015167ffffffffffffffff8111156157a4578182fd5b6155ea8682870161530c565b600080604083850312156157c2578182fd5b6157cc84846153d3565b9150602083015190509250929050565b6000806000606084860312156157f0578081fd5b6157fa85856153d3565b925060208401519150604084015190509250925092565b600060208284031215615822578081fd5b6115de83836153e2565b6000806040838503121561583e578182fd5b61584884846153e2565b9150602083015167ffffffffffffffff811115615863578182fd5b6157468582860161530c565b600080600060608486031215615883578081fd5b61578985856153e2565b6000806040838503121561589f578182fd5b6157cc84846153e2565b6000806000606084860312156158bd578081fd5b6157fa85856153e2565b600080600080608085870312156158dc578182fd5b843567ffffffffffffffff808211156158f3578384fd5b818701915061012080838a031215615909578485fd5b61591281615e37565b905061591e89846153f1565b815261592d896020850161529e565b602082015261593f896040850161529e565b6040820152606083013560608201526080830135608082015260a083013560a082015261596f8960c0850161529e565b60c08201526159818960e0850161529e565b60e08201526101008084013583811115615999578687fd5b6159a58b82870161536a565b8284015250508096505060208701359150808211156159c2578384fd5b506159cf878288016152a9565b949794965050505060408301359260600135919050565b6000602082840312156159f7578081fd5b5035919050565b600060208284031215615a0f578081fd5b5051919050565b60008060408385031215615a28578182fd5b50508035926020909101359150565b60008060008060808587031215615a4c578182fd5b8451935060208501519250604085015191506060850151615a6c81615e7e565b939692955090935050565b600060208284031215615a88578081fd5b81516115de81615e93565b60008060408385031215615aa5578182fd5b8251615ab081615e93565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015615afc57815187529582019590820190600101615ae0565b509495945050505050565b60008151808452815b81811015615b2c57602081850181015186830182015201615b10565b81811115615b3d5782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b81811015615bea5783516001600160a01b031683529284019291840191600101615bc5565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015615c80578151805160048110615c2957fe5b855280870151615c3b88870182615ac0565b508581015186860152606080820151615c5682880182615ac0565b505060809081015190615c6b86820183615ac0565b505060a0939093019290850190600101615c13565b5091979650505050505050565b6000602082526115de6020830184615acd565b600060408252615cb36040830185615acd565b828103602084015261185c8185615acd565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000838252604060208301526116566040830184615b07565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526115de6020830184615b07565b6000838252604060208301526116566040830184615acd565b9283529015156020830152604082015260600190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615e5657600080fd5b604052919050565b600067ffffffffffffffff821115615e74578081fd5b5060209081020190565b6001600160a01b0381168114610bfa57600080fd5b60ff81168114610bfa57600080fdfea26469706673582212203b5b656ee3e573b26e590f7b9c281c1eadb4e8c6727d83219cd25a216280131b64736f6c634300070100336bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c80000000000000000000000004d4ddc3e4479e42c4288f6b61554cad9e41f414600000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000000000000000000000000000000000e8d4a51000000000000000000000000000000000000000000000000000000000000783eab50000000000000000000000000000000000000000000000000000000000ed4e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003800000000000000000000000000000000000000000000000000000000000000028444f204e4f5420555345202d204d6f636b20436f6d706f7361626c6520537461626c6520506f6f6c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000454455354000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad380000000000000000000000001e5fe95fb90ac0530f581c617272cd0864626795000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005d7b226e616d65223a22436f6d706f7361626c65537461626c65506f6f6c222c2276657273696f6e223a362c226465706c6f796d656e74223a2232303234303232332d636f6d706f7361626c652d737461626c652d706f6f6c2d7636227d000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103835760003560e01c806370464016116101de57806395d89b411161010f578063d2946c2b116100ad578063ddf4627b1161007c578063ddf4627b146106f6578063eb0f24d6146106fe578063ed24911d14610706578063f4b7964d1461070e57610383565b8063d2946c2b146106b5578063d505accf146106bd578063d5c096c4146106d0578063dd62ed3e146106e357610383565b8063aaabadc5116100e9578063aaabadc51461068a578063ab7759f114610692578063b35056b8146106a5578063b7b814fc146106ad57610383565b806395d89b411461065c578063a457c2d714610664578063a9059cbb1461067757610383565b80638456cb591161017c57806387ec68171161015657806387ec681714610619578063893d20e81461062c5780638d928af81461064157806390193b7c1461064957610383565b80638456cb59146105f6578063851c1bb3146105fe578063876f303b1461061157610383565b806377151bee116101b857806377151bee146105b05780637ecebe00146105b85780637f1260d1146105cb57806382687a56146105ee57610383565b8063704640161461056957806370a082311461057c57806374f3b0091461058f57610383565b80633644e515116102b857806354a844ba1161025657806355c676281161023057806355c67628146105215780636028bfd414610529578063679aefce1461054a5780636daccffa1461055257610383565b806354a844ba146104fe57806354dea00a1461050657806354fd4d501461051957610383565b8063395093511161029257806339509351146104ba5780633c975d51146104cd5780633f4ba83a146104e357806350dd6ed9146104eb57610383565b80633644e5151461049757806338e9922e1461049f57806338fff2d0146104b257610383565b80631c0de0511161032557806323b872dd116102ff57806323b872dd146104495780632df2c7c01461045c5780632f1a0bc91461046f578063313ce5671461048257610383565b80631c0de051146104085780631dd746ea1461041f578063238a2d591461043457610383565b8063095ea7b311610361578063095ea7b3146103ce5780630da0669c146103ee57806315b0015b146103f857806318160ddd1461040057610383565b806301ec954a1461038857806304842d4c146103b157806306fdde03146103b9575b600080fd5b61039b6103963660046158c7565b610721565b6040516103a89190615ce8565b60405180910390f35b61039b6107c7565b6103c16107d6565b6040516103a89190615dbe565b6103e16103dc366004615504565b61086c565b6040516103a89190615cc5565b6103f6610883565b005b6103e161091b565b61039b61093f565b610410610945565b6040516103a893929190615cd0565b61042761096e565b6040516103a89190615c8d565b61043c610978565b6040516103a89190615ba9565b6103e1610457366004615454565b610a13565b6103f661046a366004615400565b610a87565b6103f661047d366004615a16565b610aeb565b61048a610bce565b6040516103a89190615e29565b61039b610bd7565b6103f66104ad3660046159e6565b610be1565b61039b610bfd565b6103e16104c8366004615504565b610c21565b6104d5610c5c565b6040516103a8929190615e00565b6103f6610c87565b6103f66104f9366004615702565b610c99565b6103f6610cb7565b61039b610514366004615400565b610cc9565b6103c1610ce4565b61039b610d45565b61053c61053736600461561b565b610d58565b6040516103a8929190615dd1565b61039b610d8f565b61055a610dfb565b6040516103a893929190615dea565b61039b6105773660046159e6565b610e16565b61039b61058a366004615400565b610ecf565b6105a261059d36600461561b565b610eea565b6040516103a8929190615ca0565b6103e1610fed565b61039b6105c6366004615400565b611011565b6105de6105d9366004615400565b61101c565b6040516103a89493929190615e0e565b61039b61107e565b6103f66110a2565b61039b61060c3660046156be565b6110b4565b61039b611106565b61053c61062736600461561b565b611134565b61063461115a565b6040516103a89190615b95565b61063461117e565b61039b610657366004615400565b6111a2565b6103c16111bd565b6103e1610672366004615504565b61121e565b6103e1610685366004615504565b61125c565b610634611269565b6103e16106a0366004615400565b611273565b6103e16112ae565b6103f66112bf565b6106346112d1565b6103f66106cb366004615494565b6112f5565b6105a26106de36600461561b565b611380565b61039b6106f136600461541c565b6114a3565b61039b6114e0565b6103f66114e6565b61039b611512565b6103f661071c366004615504565b61151c565b6000846080015161074e61073361117e565b6001600160a01b0316336001600160a01b03161460cd611719565b610763610759610bfd565b82146101f4611719565b61076b611727565b61077d8484610778611737565b61175b565b6060610787611773565b905060008751600181111561079857fe5b146107af576107aa878787878561180c565b6107bc565b6107bc8787878785611865565b979650505050505050565b60006107d16118a0565b905090565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108625780601f1061083757610100808354040283529160200191610862565b820191906000526020600020905b81548152906001019060200180831161084557829003601f168201915b5050505050905090565b60006108793384846118a7565b5060015b92915050565b61088b61190f565b61089361091b565b156108c3576108c37f0000000000000000000000004d4ddc3e4479e42c4288f6b61554cad9e41f41466000611984565b6108ee7f0000000000000000000000004d4ddc3e4479e42c4288f6b61554cad9e41f41466002611984565b6109197f0000000000000000000000004d4ddc3e4479e42c4288f6b61554cad9e41f41466003611984565b565b7f000000000000000000000000000000000000000000000000000000000000000190565b60025490565b6000806000610952611b28565b15925061095d611b45565b9150610967611b69565b9050909192565b60606107d1611773565b60606000610984611737565b905060608167ffffffffffffffff8111801561099f57600080fd5b506040519080825280602002602001820160405280156109c9578160200160208202803683370190505b50905060005b82811015610a0c576109e081611b8d565b8282815181106109ec57fe5b6001600160a01b03909216602092830291909101909101526001016109cf565b5091505090565b600080610a2085336114a3565b9050610a44336001600160a01b0387161480610a3c5750838210155b61019e611719565b610a4f858585611cb6565b336001600160a01b03861614801590610a6a57506000198114155b15610a7c57610a7c85338584036118a7565b506001949350505050565b610a8f611d96565b6000610a9a82611e34565b90506000610aa782611b8d565b9050610ac06001600160a01b0382161515610155611719565b6000828152600a6020526040812054610ad890611fc2565b9050610ae5838383611fd1565b50505050565b610af36120b4565b610b03600183101561012c611719565b610b1461138883111561012d611719565b6000610b20824261165e565b9050610b346201518082101561013d611719565b600080610b3f6120e2565b91509150610b50811561013e611719565b6000610b5e866103e86115ba565b90506000838211610b8d57610b88610b7962015180866115ba565b610b8384886115ba565b612156565b610ba7565b610ba7610b9d62015180846115ba565b610b8386886115ba565b9050610bb9600282111561013f611719565b610bc584834289612189565b50505050505050565b60055460ff1690565b60006107d1611512565b610be96120b4565b610bf16121d8565b610bfa816121eb565b50565b7feca0bc45fc02ab59941bdb0bc3718efe6d3f09b300000000000000000000000190565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610879918590610c579086612264565b6118a7565b600c546000908190610c718160e9601761170a565b9250610c8081600060e961170a565b9150509091565b610c8f6120b4565b6109196000612276565b610ca16120b4565b610ca96121d8565b610cb382826122e9565b5050565b610cbf6120b4565b61091960016123de565b6000610cdc610cd783611e34565b612435565b90505b919050565b600d8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108625780601f1061083757610100808354040283529160200191610862565b6008546000906107d19060c0603f61170a565b60006060610d6e8651610d69611737565b6115e5565b610d83898989898989896124886124aa612513565b97509795505050505050565b60006060600080600080610da161263d565b9398509196509450925090506000610db98585612264565b90506000610dc56120e2565b5090506000848214610de057610ddb828961272d565b610de2565b835b9050610dee818461288f565b9850505050505050505090565b6000806000610e086120e2565b90949093506103e892509050565b6000610e206112ae565b15610e2d57506000610cdf565b81610e7957610e3a61091b565b610e64577f0000000000000000000000000000000000000000000000000000000000000000610e72565b600b5467ffffffffffffffff165b9050610cdf565b6002821415610ea15750600b5468010000000000000000900467ffffffffffffffff16610cdf565b6003821415610ec45750600b54600160801b900467ffffffffffffffff16610cdf565b610cdf6101bb6128e0565b6001600160a01b031660009081526020819052604090205490565b60608088610ef961073361117e565b610f04610759610bfd565b60606000610f11866128f0565b15610f3957610f1e61291f565b610f3089610f2a61093f565b88612932565b92509050610f8b565b610f41611727565b6060610f4b611773565b9050610f578a82612977565b610f7b8d8d8d8d8d610f676112ae565b610f71578d610f74565b60005b878e612488565b93509150610f8983826124aa565b505b610f958b826129e0565b81895167ffffffffffffffff81118015610fae57600080fd5b50604051908082528060200260200182016040528015610fd8578160200160208202803683370190505b509450945050505b5097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000090565b6000610cdc826111a2565b6000806000806000600a600061103188611e34565b81526020810191909152604001600020549050611052811515610155611719565b61105b816129ea565b9450611066816129f8565b935061107181612a06565b9597949650949392505050565b7f000000000000000000000000000000000000000000000000000000000000000290565b6110aa6120b4565b6109196001612276565b60007f000000000000000000000000993767e29726ddb7f5e8a751faf54d4b83f3fc62826040516020016110e9929190615b52565b604051602081830303815290604052805190602001209050919050565b600080600061111361263d565b5050925092505061112d818361226490919063ffffffff16565b9250505090565b600060606111458651610d69611737565b610d8389898989898989612a28612a39612513565b7f000000000000000000000000000000000000000000000000000000000000000090565b7f000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c890565b6001600160a01b031660009081526006602052604090205490565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108625780601f1061083757610100808354040283529160200191610862565b60008061122b33856114a3565b905080831061124557611240338560006118a7565b611252565b61125233858584036118a7565b5060019392505050565b6000610879338484611cb6565b60006107d1612aa2565b60007f00000000000000000000000000000000000000000000000000000000000000008015610cdc5750610cdc6112a983611e34565b612b1c565b6008546000906107d19060ff612b47565b6112c76120b4565b61091960006123de565b7f000000000000000000000000ce88686553686da562ce7cea497ce749da109f9f90565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886113248c6111a2565b8960405160200161133a96959493929190615d10565b60405160208183030381529060405280519060200120905061136b8882611362878787612b51565b886101f8612b90565b6113768888886118a7565b5050505050505050565b6060808861138f61073361117e565b61139a610759610bfd565b6113a2611727565b60606113ac611773565b90506113b661093f565b61146357600060606113cb8d8d8d868b612be7565b915091506113e46113da6118a0565b83101560cc611719565b6113f660006113f16118a0565b612cc0565b6114098b6114026118a0565b8403612cc0565b6114138184612a39565b808a5167ffffffffffffffff8111801561142c57600080fd5b50604051908082528060200260200182016040528015611456578160200160208202803683370190505b5095509550505050610fe0565b61146d8882612977565b600060606114958d8d8d8d8d6114816112ae565b61148b578d61148e565b60005b898e612a28565b915091506114098b83612cc0565b60006114ad61117e565b6001600160a01b0316826001600160a01b031614156114cf575060001961087d565b6114d98383612cca565b905061087d565b60001981565b6114ee6120b4565b6000806114f96120e2565b9150915061150981610140611719565b610cb382612cf5565b60006107d1612d30565b6115246120b4565b61152c611d96565b600061153783611e34565b9050600061154482611b8d565b905061155d6001600160a01b0382161515610155611719565b611568828285611fd1565b806001600160a01b0316827fdd6d1c9badb346de6925b358a472c937b41698d2632696759e43fd6527feeec4856040516115a29190615ce8565b60405180910390a350505050565b80610cb381612dcd565b60008282026115de8415806115d75750838583816115d457fe5b04145b6003611719565b9392505050565b610cb38183146067611719565b60006001821b198416828461160857600061160b565b60015b60ff16901b17949350505050565b611631828414801561162a57508183145b6067611719565b505050565b6000611643848484612e46565b5082821b6000196001831b01831b198516175b949350505050565b600061166e838311156001611719565b50900390565b6000611687606084901c15610149611719565b61165642830160e060206116a48660c083838c8c60006060611636565b929190611636565b6000610cdc6116ba836129ea565b8390606080611636565b60006116dd67ffffffffffffffff8311156101ba611719565b5090565b60006116ee848484612e46565b50501b90565b600081831061170357816115de565b5090919050565b6001901b6000190191901c1690565b81610cb357610cb3816128e0565b61172f612e8c565b610919612e94565b7f000000000000000000000000000000000000000000000000000000000000000390565b611631818410801561176c57508183105b6064611719565b6060600061177f611737565b905060608167ffffffffffffffff8111801561179a57600080fd5b506040519080825280602002602001820160405280156117c4578160200160208202803683370190505b50905060005b82811015610a0c576117ed6117de82612435565b6117e783612ebc565b90612fda565b8282815181106117f957fe5b60209081029190910101526001016117ca565b60208501516000906001600160a01b0316301480611836575060408601516001600160a01b031630145b61184c576118478686868686613006565b611859565b6118598686868686613070565b90505b95945050505050565b60208501516000906001600160a01b031630148061188f575060408601516001600160a01b031630145b61184c576118478686868686613174565b620f424090565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611902908590615ce8565b60405180910390a3505050565b611917611d96565b61191f6121d8565b6060600080600061192e61263d565b945094509450509350600083111561194957611949836131cb565b60006119536120e2565b509050600083821461196e57611969828761272d565b611970565b825b905061197c82826131dc565b505050505050565b604051631a7c326360e01b81526000906001600160a01b03841690631a7c3263906119b3908590600401615ce8565b60206040518083038186803b1580156119cb57600080fd5b505afa1580156119df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a0391906159fe565b905081611a3a57611a13816116c4565b600b805467ffffffffffffffff191667ffffffffffffffff92909216919091179055611aeb565b6002821415611a8857611a4c816116c4565b600b805467ffffffffffffffff9290921668010000000000000000026fffffffffffffffff000000000000000019909216919091179055611aeb565b6003821415611ae057611a9a816116c4565b600b805467ffffffffffffffff92909216600160801b027fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff909216919091179055611aeb565b611aeb6101bb6128e0565b817f6bfb689528fa96ec1ad670ad6d6064be1ae96bfd5d2ee35c837fd0fe0c11959a82604051611b1b9190615ce8565b60405180910390a2505050565b6000611b32611b69565b4211806107d157505060075460ff161590565b7f000000000000000000000000000000000000000000000000000000006ee1137890565b7f000000000000000000000000000000000000000000000000000000006fce617890565b600081611bbb57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160011415611beb57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160021415611c1b57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160031415611c4b57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160041415611c7b57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160051415611cab57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b610cdf6101356128e0565b611ccd6001600160a01b0384161515610198611719565b611ce46001600160a01b0383161515610199611719565b611cef838383611631565b6001600160a01b038316600090815260208190526040902054611d1590826101a0613202565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611d449082612264565b6001600160a01b0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611902908590615ce8565b60408051600080825260208201909252606091611dc9565b611db661526c565b815260200190600190039081611dae5790505b509050611dd461117e565b6001600160a01b0316630e8e3e84826040518263ffffffff1660e01b8152600401611dff9190615bf6565b600060405180830381600087803b158015611e1957600080fd5b505af1158015611e2d573d6000803e3d6000fd5b5050505050565b60007f000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad386001600160a01b0316826001600160a01b03161415611e7857506000610cdf565b7f0000000000000000000000001e5fe95fb90ac0530f581c617272cd08646267956001600160a01b0316826001600160a01b03161415611eba57506001610cdf565b7f000000000000000000000000eca0bc45fc02ab59941bdb0bc3718efe6d3f09b36001600160a01b0316826001600160a01b03161415611efc57506002610cdf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611f3e57506003610cdf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611f8057506004610cdf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415611cab57506005610cdf565b6000610cdc8260c0602061170a565b6000826001600160a01b031663679aefce6040518163ffffffff1660e01b815260040160206040518083038186803b15801561200c57600080fd5b505afa158015612020573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204491906159fe565b6000858152600a6020526040902054909150612061818385611674565b6000868152600a602052604090819020919091555185907fb77a83204ca282e08dc3a65b0a1ca32ea4e6875c38ef0bf5bf75e52a67354fac906120a5908590615ce8565b60405180910390a25050505050565b60006120cb6000356001600160e01b0319166110b4565b9050610bfa6120da8233613218565b610191611719565b6000806000806000806120f3613301565b93509350935093508042101561214657600194508383111561212a57818103824203858503028161212057fe5b0484019550612141565b818103824203848603028161213b57fe5b04840395505b61214e565b600094508295505b505050509091565b60006121658215156004611719565b826121725750600061087d565b81600184038161217e57fe5b04600101905061087d565b61219584848484613360565b7f1835882ee7a34ac194f717a35e09bb1d24c82a3b9d854ab6c9749525b714cdf2848484846040516121ca9493929190615e0e565b60405180910390a150505050565b6109196121e3611b28565b610192611719565b6122006121f661339f565b82101560cb611719565b61221561220b6133a8565b82111560ca611719565b600854612226908260c0603f611636565b6008556040517fa9ba3ffe0b6c366b81232caab38605a0699ad5398d6cce76f91ee809e322dafc90612259908390615ce8565b60405180910390a150565b60008282016115de8482101583611719565b801561229657612291612287611b45565b4210610193611719565b6122ab565b6122ab6122a1611b69565b42106101a9611719565b6007805460ff19168215151790556040517f9e3a5e37224532dea67b89face185703738a228a6e8a23dee546960180d3be6490612259908390615cc5565b60006122f3610bfd565b905060006122ff61117e565b6001600160a01b031663b05f8e4883866040518363ffffffff1660e01b815260040161232c929190615d89565b60806040518083038186803b15801561234457600080fd5b505afa158015612358573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237c9190615a37565b604051630639cdb560e21b81529094506001600160a01b03851693506318e736d492506123b0915085908790600401615d70565b600060405180830381600087803b1580156123ca57600080fd5b505af1158015611376573d6000803e3d6000fd5b6008546123ed908260ff6115f2565b6008556040517feff3d4d215b42bf0960be9c6d5e05c22cba4df6627a3a523e2acee733b5854c890612420908390615cc5565b60405180910390a180610bfa57610bfa6133b4565b600061243f61107e565b8214156124555750670de0b6b3a7640000610cdf565b6000828152600a6020526040902054801561247857612473816129ea565b6115de565b670de0b6b3a76400009392505050565b60006060612499600088868661348e565b915091509850989650505050505050565b815181516124b99082906115e5565b60005b81811015610ae5576124f48482815181106124d357fe5b60200260200101518483815181106124e757fe5b602002602001015161288f565b84828151811061250057fe5b60209081029190910101526001016124bc565b3330146125d1576000306001600160a01b0316600036604051612537929190615b6a565b6000604051808303816000865af19150503d8060008114612574576040519150601f19603f3d011682016040523d82523d6000602084013e612579565b606091505b50509050806000811461258857fe5b60046000803e6000516001600160e01b0319166343adbafb60e01b81146125b3573d6000803e3d6000fd5b506020600460003e604060205260243d03602460403e601c3d016000f35b6125d9611727565b60606125e3611773565b90506125ef8782612977565b600060606126078c8c8c8c8c8c898d8d63ffffffff16565b9150915061261981848663ffffffff16565b8051601f1982018390526343adbafb603f1983015260200260231982016044820181fd5b6060600080600080606061264f61117e565b6001600160a01b031663f94d4668612665610bfd565b6040518263ffffffff1660e01b81526004016126819190615ce8565b60006040518083038186803b15801561269957600080fd5b505afa1580156126ad573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126d5919081019061552f565b509150506126ea816126e5611773565b612977565b6126f38161353c565b965094506000612701610c5c565b90945090506000612713888684613575565b9450905061272187826135f1565b95505050509091929394565b80516000908190815b8181101561276e5761276485828151811061274d57fe5b60200260200101518461226490919063ffffffff16565b9250600101612736565b508161277f5760009250505061087d565b600082868302825b60ff811015612878578260005b868110156127d5576127cb6127a983876115ba565b6127c68c84815181106127b857fe5b60200260200101518a6115ba565b613609565b9150600101612794565b5083945061282e61280d6128076127ec848a6115ba565b6128016127f9888d6115ba565b6103e8613609565b90612264565b866115ba565b6127c661281d89600101856115ba565b6128016127f96103e889038a6115ba565b93508484111561285657600185850311612851578397505050505050505061087d565b61286f565b60018486031161286f578397505050505050505061087d565b50600101612787565b506128846101416128e0565b505050505092915050565b600061289e8215156004611719565b826128ab5750600061087d565b670de0b6b3a7640000838102906128ce908583816128c557fe5b04146005611719565b8281816128d757fe5b0491505061087d565b610bfa816210905360ea1b613629565b6000808251118015610cdc575060ff8016828060200190518101906129159190615a77565b60ff161492915050565b61091961292a6112ae565b6101b6611719565b60006060600060606129438761353c565b915091506000606061295683858961368a565b91509150816129668260006136b6565b95509550505050505b935093915050565b815181516129869082906115e5565b60005b81811015610ae5576129c18482815181106129a057fe5b60200260200101518483815181106129b457fe5b6020026020010151612fda565b8482815181106129cd57fe5b6020908102919091010152600101612989565b610cb38282613773565b6000610cdc8282606061170a565b6000610cdc8260608061170a565b600080612a1283611fc2565b9150612a218360e0602061170a565b9050915091565b60006060612499600188868661348e565b81518151612a489082906115e5565b60005b81811015610ae557612a83848281518110612a6257fe5b6020026020010151848381518110612a7657fe5b602002602001015161383f565b848281518110612a8f57fe5b6020908102919091010152600101612a4b565b6000612aac61117e565b6001600160a01b031663aaabadc56040518163ffffffff1660e01b815260040160206040518083038186803b158015612ae457600080fd5b505afa158015612af8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d191906156e6565b6000610cdc7f0000000000000000000000000000000000000000000000000000000000000000600684015b1c60019081161490565b60408051604180825260808201909252606091829190602082018180368337019050509050836020820152826040820152846060820153949350505050565b6000612b9b8561388d565b9050612bb1612bab8783876138a9565b83611719565b612bc0428410156101b8611719565b5050506001600160a01b039092166000908152600660205260409020805460010190555050565b600060606000612bf684613958565b9050612c116000826003811115612c0957fe5b1460ce611719565b6060612c1c8561396e565b9050612c2a815187516115e5565b612c348187612977565b6000612c3e6120e2565b5090506060612c4c83613984565b90506000612c5a838361272d565b9050806000612c776d80000000000000000000000000008361165e565b9050612c838d82612cc0565b8086612c8d61107e565b81518110612c9757fe5b602002602001018181525050612cad85846131dc565b509c939b50929950505050505050505050565b610cb38282613a26565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b612d0181824242613360565b7fa0d01593e47e69d07e0ccd87bece09411e07dd1ed40ca8f2e7af2976542a0233816040516122599190615ce8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fee1c6cca5b2f94597edf324fabbfeb3f78dac2d79b4e3920c8d7bc45cf37ac077fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6612d9d613ab3565b30604051602001612db2959493929190615d44565b60405160208183030381529060405280519060200120905090565b600281511015612ddc57610bfa565b600081600081518110612deb57fe5b602002602001015190506000600190505b8251811015611631576000838281518110612e1357fe5b60200260200101519050612e3c816001600160a01b0316846001600160a01b0316106065611719565b9150600101612dfc565b612e5561010083106064611719565b612e7d6001821015801561176c5750612e7360ff84610100036116f4565b8211156064611719565b61163183821c156101b4611719565b6109196121d8565b6000612e9e611737565b905060005b81811015610cb357612eb481613ab7565b600101612ea3565b600081612eea57507f0000000000000000000000000000000000000000000000000de0b6b3a7640000610cdf565b8160011415612f1a57507f0000000000000000000000000000000000000000000000000de0b6b3a7640000610cdf565b8160021415612f4a57507f0000000000000000000000000000000000000000000000000de0b6b3a7640000610cdf565b8160031415612f7a57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160041415612faa57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b8160051415611cab57507f0000000000000000000000000000000000000000000000000000000000000000610cdf565b6000828202612ff48415806115d75750838583816115d457fe5b670de0b6b3a764000090049392505050565b60006130128583612977565b613033866060015183858151811061302657fe5b6020026020010151613b0b565b6060870152600061304687878787613b17565b90506130658184878151811061305857fe5b6020026020010151613b2b565b90506107bc81613b37565b600080808751600181111561308157fe5b14905061308e8684612977565b6130ae876060015184836130a257866130a4565b875b8151811061302657fe5b876060018181525050600060606000806130c78a613b53565b93509350935093506000806130da61107e565b8a14613100576130fb878e60600151876130f38e613bbc565b888b89613bf1565b61311b565b61311b878e60600151876131138f613bbc565b888b89613c2a565b9150915061312c8486858985613c4e565b8661314657613141828a8d8151811061305857fe5b613163565b613163828a8c8151811061315657fe5b6020026020010151613cce565b9d9c50505050505050505050505050565b60006131838660600151613cda565b60608701526131928583612977565b6131a6866060015183868151811061302657fe5b606087015260006131b987878787613cfb565b90506107bc8184868151811061315657fe5b610bfa6131d66112d1565b82612cc0565b6131e981600060e96116e1565b6131f68360e960176116e1565b17600c55610cb3613d0f565b60006132118484111583611719565b5050900390565b600073ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1ba1b61323761115a565b6001600160a01b031614158015613252575061325283613d45565b1561327a5761325f61115a565b6001600160a01b0316336001600160a01b031614905061087d565b613282612aa2565b6001600160a01b0316639be2a8848484306040518463ffffffff1660e01b81526004016132b193929190615cf1565b60206040518083038186803b1580156132c957600080fd5b505afa1580156132dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d991906155fb565b6000806000806133206000604060095461170a9092919063ffffffff16565b6009549094506133329060408061170a565b600954909350613345906080604061170a565b6009549092506133589060c0604061170a565b905090919293565b61336d8160c060406116e1565b61337a83608060406116e1565b613386856040806116e1565b61339387600060406116e1565b17171760095550505050565b64e8d4a5100090565b67016345785d8a000090565b6133bc611d96565b60606133c661117e565b6001600160a01b031663f94d46686133dc610bfd565b6040518263ffffffff1660e01b81526004016133f89190615ce8565b60006040518083038186803b15801561341057600080fd5b505afa158015613424573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261344c919081019061552f565b5091505061345c816126e5611773565b606061346782613984565b905060006134736120e2565b5090506000613482828461272d565b9050610ae582826131dc565b60006060600060606000806134a289613b53565b935093509350935061529c8a6134ba57613d506134be565b613de55b9050600060606134d6868689878f8f8963ffffffff16565b9150915061529c8d6134ea5761165e6134ee565b6122645b90506134fb878383613e63565b600061350b89858463ffffffff16565b905061351a8789888c85613c4e565b836135268460006136b6565b9a509a5050505050505050505094509492505050565b600060606135638361354c61107e565b8151811061355657fe5b6020026020010151613ed0565b61356c84613984565b91509150915091565b6000806000806000613588888888613ee4565b9250925092508581116135a35760009450925061296f915050565b85830383830360006135c16135b782610e16565b6117e7858761288f565b905060006135dc6135d26002610e16565b6117e7858861288f565b919091019b939a509298505050505050505050565b60006115de61360084846115ba565b6127c684613f55565b60006136188215156004611719565b81838161362157fe5b049392505050565b62461bcd60e51b600090815260206004526007602452600a808404818106603090810160081b958390069590950190829004918206850160101b01602363ffffff0060e086901c160160181b0190930160c81b60445260e882901c90606490fd5b60006060600061369984613f7b565b905060606136a8878784613f91565b919791965090945050505050565b6060825160010167ffffffffffffffff811180156136d357600080fd5b506040519080825280602002602001820160405280156136fd578160200160208202803683370190505b50905060005b815181101561376c5761371461107e565b811461374b578361372361107e565b82106137325760018203613734565b815b8151811061373e57fe5b602002602001015161374d565b825b82828151811061375957fe5b6020908102919091010152600101613703565b5092915050565b61378a6001600160a01b038316151561019b611719565b61379682600083611631565b6001600160a01b0382166000908152602081905260409020546137bc90826101b2613202565b6001600160a01b0383166000908152602081905260409020556137ef6137ea826137e461093f565b90614040565b61404e565b60006001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516138339190615ce8565b60405180910390a35050565b600061384e8215156004611719565b8261385b5750600061087d565b670de0b6b3a764000083810290613875908583816128c557fe5b82600182038161388157fe5b0460010191505061087d565b6000613897612d30565b826040516020016110e9929190615b7a565b60006138bb82516041146101b9611719565b60208281015160408085015160608601518251600080825295019283905292939092811a916001906138f4908990859088908890615da0565b6020604051602081039080840390855afa158015613916573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061394c5750876001600160a01b0316816001600160a01b0316145b98975050505050505050565b600081806020019051810190610cdc9190615811565b6060818060200190518101906115de919061582c565b606080600183510367ffffffffffffffff811180156139a257600080fd5b506040519080825280602002602001820160405280156139cc578160200160208202803683370190505b50905060005b815181101561376c57836139e461107e565b82106139f357816001016139f5565b815b815181106139ff57fe5b6020026020010151828281518110613a1357fe5b60209081029190910101526001016139d2565b613a3260008383611631565b613a416137ea8261280161093f565b6001600160a01b038216600090815260208190526040902054613a649082612264565b6001600160a01b0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613833908590615ce8565b4690565b613abf61107e565b811415613acb57610bfa565b6000818152600a60205260409020548015610cb357600080613aec83612a06565b9150915080421115610ae557610ae584613b0586611b8d565b84611fd1565b60006115de8383612fda565b600061185c60008660600151868686614053565b60006115de838361383f565b6000610cdc613b4c613b47610d45565b613f55565b839061383f565b60006060600080600080613b65610c5c565b91509150600060606000613b7a8a86866140c5565b9250925092506000613b8a6120e2565b5090506000868214613ba557613ba0828561272d565b613ba7565b825b949c939b509099509297509095505050505050565b6000613bd3613bc961107e565b8314156064611719565b613bdb61107e565b82106116dd57613bec82600161165e565b610cdc565b60008088613c0c57613c0788888888888861411d565b613c1a565b613c1a8888888888886141f4565b9150915097509795505050505050565b60008088613c4057613c07888888888888614255565b613c1a8888888888886142bb565b6000613c5a868661272d565b90506000613c68838561288f565b90506000613c768683612fda565b905080831115613cc4578083036000613ca0613c9a83613c9584610e16565b6115ba565b86613609565b90508015613cc1576000613cb487836135f1565b9050613cbf816131cb565b505b50505b61137688846131dc565b60006115de838361288f565b600080613cef613ce8610d45565b849061436a565b90506115de838261165e565b600061185c60018660600151868686614053565b6000613d19611737565b905060005b81811015610cb357613d2f81612b1c565b15613d3d57613d3d816143a6565b600101613d1e565b6000610cdc826143d4565b600060606000613d5f846143df565b90506001816002811115613d6f57fe5b1415613d8d57613d8387878a8c89896143f5565b9250925050613dda565b6002816002811115613d9b57fe5b1415613dac57613d83878a86614454565b6000816002811115613dba57fe5b1415613dcd57613d8387878a8c88614472565b613dd86101506128e0565b505b965096945050505050565b600060606000613df484613958565b90506001816003811115613e0457fe5b1415613e1857613d8387878a8c8989614513565b6003816003811115613e2657fe5b1415613e3757613d83878a86614562565b6002816003811115613e4557fe5b1415613e5857613d8387878a8c88614580565b613dd86101366128e0565b82518251613e729082906115e5565b60005b81811015611e2d57613eb1858281518110613e8c57fe5b6020026020010151858381518110613ea057fe5b60200260200101518563ffffffff16565b858281518110613ebd57fe5b6020908102919091010152600101613e75565b6000610cdc82613ede61093f565b9061165e565b6000806000613ef3858761272d565b9050838111613f0757808192509250613f4c565b613f1985613f14886145fa565b61272d565b9250613f2581846116f4565b9250613f3184846146eb565b9250613f3b610fed565b15613f4857829150613f4c565b8091505b93509350939050565b6000670de0b6b3a76400008210613f6d576000610cdc565b50670de0b6b3a76400000390565b6000818060200190518101906115de9190615a93565b60606000613f9f838561288f565b9050845167ffffffffffffffff81118015613fb957600080fd5b50604051908082528060200260200182016040528015613fe3578160200160208202803683370190505b50915060005b8551811015614037576140188287838151811061400257fe5b6020026020010151612fda90919063ffffffff16565b83828151811061402457fe5b6020908102919091010152600101613fe9565b50509392505050565b60006115de83836001613202565b600255565b6000606061406085613984565b9050600061406d85613bbc565b9050600061407a85613bbc565b905060006140866120e2565b5090506000614095828661272d565b90508a156140b7576140ab828686868e866146fb565b9550505050505061185c565b6140ab828686868e86614786565b6000606060008060606140d78861353c565b915091506000806140e9838a8a613575565b9150915060006140f985846135f1565b9050801561410a5761410a816131cb565b9390930199919850919650945050505050565b6000806060875167ffffffffffffffff8111801561413a57600080fd5b50604051908082528060200260200182016040528015614164578160200160208202803683370190505b5090508881888151811061417457fe5b6020026020010181815250506000614197878a848989614192610d45565b614819565b90506141bf8a8a8a815181106141a957fe5b602002602001015161165e90919063ffffffff16565b8989815181106141cb57fe5b602090810291909101015260006141e2878361165e565b919b919a509098505050505050505050565b600080600061420f8689898c898961420a610d45565b614aa9565b9050614221818989815181106141a957fe5b88888151811061422d57fe5b60209081029190910101526000614244868b61165e565b919a91995090975050505050505050565b60008060006142708689898c898961426b610d45565b614b98565b90506142988189898151811061428257fe5b602002602001015161226490919063ffffffff16565b8888815181106142a457fe5b60209081029190910101526000614244868b612264565b6000806060875167ffffffffffffffff811180156142d857600080fd5b50604051908082528060200260200182016040528015614302578160200160208202803683370190505b5090508881888151811061431257fe5b6020026020010181815250506000614335878a848989614330610d45565b614c65565b90506143478a8a8a8151811061428257fe5b89898151811061435357fe5b602090810291909101015260006141e28783612264565b60008282026143848415806115d75750838583816115d457fe5b8061439357600091505061087d565b670de0b6b3a76400006000198201613881565b6000818152600a60205260409020546143be816116ac565b6000928352600a60205260409092209190915550565b6000610cdc82614ecf565b600081806020019051810190610cdc9190615750565b6000606080600061440585614ef2565b91509150614415825188516115e5565b614422826126e588613984565b60006144348989858e8e614192610d45565b90506144448282111560cf611719565b9a91995090975050505050505050565b60006060600061446384614f15565b905060606136a8868884613f91565b6000606060008061448285614f2b565b91509150614494865182106064611719565b6060865167ffffffffffffffff811180156144ae57600080fd5b506040519080825280602002602001820160405280156144d8578160200160208202803683370190505b5090506144ec888884868e8e61420a610d45565b8183815181106144f857fe5b60209081029190910101529199919850909650505050505050565b6000606080600061452385614f42565b91509150614533875183516115e5565b614540826126e588613984565b60006145528989858e8e614330610d45565b90506144448282101560d0611719565b60006060600061457184614f5a565b905060606136a8868389614f70565b600060606000806145908561500c565b915091506145a2865182106064611719565b6060865167ffffffffffffffff811180156145bc57600080fd5b506040519080825280602002602001820160405280156145e6578160200160208202803683370190505b5090506144ec888884868e8e61426b610d45565b8051606090818167ffffffffffffffff8111801561461757600080fd5b50604051908082528060200260200182016040528015614641578160200160208202803683370190505b50905060005b828110156146e357600061465961107e565b821015614666578161466b565b816001015b905061467681612b1c565b6146935785828151811061468657fe5b60200260200101516146c3565b6146c38683815181106146a257fe5b6020026020010151600a600084815260200190815260200160002054615023565b8383815181106146cf57fe5b602090810291909101015250600101614647565b509392505050565b60008183101561170357816115de565b600061470d8387878151811061428257fe5b86868151811061471957fe5b60200260200101818152505060006147338888858861503e565b90508387878151811061474257fe5b60200260200101510387878151811061475757fe5b6020026020010181815250506147786001613ede838a89815181106141a957fe5b9150505b9695505050505050565b6000614798838786815181106141a957fe5b8685815181106147a457fe5b60200260200101818152505060006147be8888858961503e565b9050838786815181106147cd57fe5b6020026020010151018786815181106147e257fe5b602002602001018181525050614778600161280189898151811061480257fe5b60200260200101518461165e90919063ffffffff16565b600080805b87518110156148575761484d88828151811061483657fe5b60200260200101518361226490919063ffffffff16565b915060010161481e565b506060865167ffffffffffffffff8111801561487257600080fd5b5060405190808252806020026020018201604052801561489c578160200160208202803683370190505b5090506000805b89518110156149695760006148d4858c84815181106148be57fe5b602002602001015161383f90919063ffffffff16565b90506149168b83815181106148e557fe5b60200260200101516149108c85815181106148fc57fe5b60200260200101518e86815181106141a957fe5b9061383f565b84838151811061492257fe5b60200260200101818152505061495e6149578286858151811061494157fe5b602002602001015161436a90919063ffffffff16565b8490612264565b9250506001016148a3565b506060895167ffffffffffffffff8111801561498457600080fd5b506040519080825280602002602001820160405280156149ae578160200160208202803683370190505b50905060005b8a51811015614a795760008482815181106149cb57fe5b6020026020010151841115614a325760006149f46149e886613f55565b8e858151811061400257fe5b90506000614a08828e86815181106141a957fe5b9050614a29614a2282670de0b6b3a76400008d900361383f565b8390612264565b92505050614a49565b8a8281518110614a3e57fe5b602002602001015190505b614a59818d84815181106141a957fe5b838381518110614a6557fe5b6020908102919091010152506001016149b4565b506000614a868c8361272d565b90506000614a94828a61288f565b9050613163614aa282613f55565b8b9061436a565b600080614ac484614abe87614910818b61165e565b9061436a565b90506000614ad48a8a848b61503e565b90506000614ae8828b8b815181106141a957fe5b90506000805b8b51811015614b1057614b068c828151811061483657fe5b9150600101614aee565b506000614b39828d8d81518110614b2357fe5b602002602001015161288f90919063ffffffff16565b90506000614b4682613f55565b90506000614b54858361436a565b90506000614b62868361165e565b9050614b83614b7c83670de0b6b3a76400008d9003612fda565b8290612264565b98505050505050505050979650505050505050565b600080614bad84614abe87614910818b612264565b90506000614bbd8a8a848b61503e565b90506000614be78a8a81518110614bd057fe5b60200260200101518361165e90919063ffffffff16565b90506000805b8b51811015614c0f57614c058c828151811061483657fe5b9150600101614bed565b506000614c22828d8d81518110614b2357fe5b90506000614c2f82613f55565b90506000614c3d858361436a565b90506000614c4b868361165e565b9050614b83614b7c83670de0b6b3a76400008d900361383f565b600080805b8751811015614c8c57614c8288828151811061483657fe5b9150600101614c6a565b506060865167ffffffffffffffff81118015614ca757600080fd5b50604051908082528060200260200182016040528015614cd1578160200160208202803683370190505b5090506000805b8951811015614d6b576000614cf3858c8481518110614b2357fe5b9050614d358b8381518110614d0457fe5b6020026020010151614d2f8c8581518110614d1b57fe5b60200260200101518e868151811061428257fe5b9061288f565b848381518110614d4157fe5b602002602001018181525050614d606149578286858151811061400257fe5b925050600101614cd8565b506060895167ffffffffffffffff81118015614d8657600080fd5b50604051908082528060200260200182016040528015614db0578160200160208202803683370190505b50905060005b8a51811015614e7157600083858381518110614dce57fe5b60200260200101511115614e2a576000614df36149e886670de0b6b3a764000061165e565b90506000614e07828e86815181106141a957fe5b9050614e21614a2282670de0b6b3a76400008d9003612fda565b92505050614e41565b8a8281518110614e3657fe5b602002602001015190505b614e51818d848151811061428257fe5b838381518110614e5d57fe5b602090810291909101015250600101614db6565b506000614e7e8c8361272d565b90506000614e8c828a61288f565b9050670de0b6b3a7640000811115614ec057614eb38a670de0b6b3a763ffff198301612fda565b965050505050505061477c565b6000965050505050505061477c565b6000614ee163f4b7964d60e01b6110b4565b821480610cdc5750610cdc826151fb565b6060600082806020019051810190614f0a919061576b565b909590945092505050565b6000818060200190518101906115de91906157b0565b60008082806020019051810190614f0a91906157dc565b6060600082806020019051810190614f0a919061586f565b6000818060200190518101906115de919061588d565b60606000614f7e848461383f565b90506060855167ffffffffffffffff81118015614f9a57600080fd5b50604051908082528060200260200182016040528015614fc4578160200160208202803683370190505b50905060005b865181101561500257614fe38388838151811061494157fe5b828281518110614fef57fe5b6020908102919091010152600101614fca565b5095945050505050565b60008082806020019051810190614f0a91906158a9565b60006115de61503584613c95856129f8565b6127c6846129ea565b60008084518602905060008560008151811061505657fe5b60200260200101519050600086518760008151811061507157fe5b60200260200101510290506000600190505b87518110156150d7576150bc6150b66150af848b85815181106150a257fe5b60200260200101516115ba565b8a516115ba565b88613609565b91506150cd88828151811061274d57fe5b9250600101615083565b508685815181106150e457fe5b60200260200101518203915060006150fc87886115ba565b9050600061512861511c61511484610b8389886115ba565b6103e86115ba565b8a89815181106150a257fe5b9050600061514361513c6151148b89613609565b8690612264565b905060008061515f6151558686612264565b610b838d86612264565b905060005b60ff8110156151df578192506151946151818661280185866115ba565b610b838e613ede886128018860026115ba565b9150828211156151bd576001838303116151b8575097506116569650505050505050565b6151d7565b6001828403116151d7575097506116569650505050505050565b600101615164565b506151eb6101426128e0565b5050505050505050949350505050565b600061520d632f1a0bc960e01b6110b4565b8214806152285750615225637587926b60e11b6110b4565b82145b80610cdc5750610cdc826000615244631c74c91760e11b6110b4565b82148061525f575061525c6350dd6ed960e01b6110b4565b82145b80610cdc57506000610cdc565b6040805160a081019091528060008152600060208201819052604082018190526060820181905260809091015290565bfe5b803561087d81615e7e565b600082601f8301126152b9578081fd5b81356152cc6152c782615e5e565b615e37565b8181529150602080830190848101818402860182018710156152ed57600080fd5b60005b84811015612884578135845292820192908201906001016152f0565b600082601f83011261531c578081fd5b815161532a6152c782615e5e565b81815291506020808301908481018184028601820187101561534b57600080fd5b60005b848110156128845781518452928201929082019060010161534e565b600082601f83011261537a578081fd5b813567ffffffffffffffff811115615390578182fd5b6153a3601f8201601f1916602001615e37565b91508082528360208285010111156153ba57600080fd5b8060208401602084013760009082016020015292915050565b80516003811061087d57600080fd5b80516004811061087d57600080fd5b80356002811061087d57600080fd5b600060208284031215615411578081fd5b81356115de81615e7e565b6000806040838503121561542e578081fd5b823561543981615e7e565b9150602083013561544981615e7e565b809150509250929050565b600080600060608486031215615468578081fd5b833561547381615e7e565b9250602084013561548381615e7e565b929592945050506040919091013590565b600080600080600080600060e0888a0312156154ae578283fd5b87356154b981615e7e565b965060208801356154c981615e7e565b9550604088013594506060880135935060808801356154e781615e93565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215615516578182fd5b823561552181615e7e565b946020939093013593505050565b600080600060608486031215615543578081fd5b835167ffffffffffffffff8082111561555a578283fd5b818601915086601f83011261556d578283fd5b815161557b6152c782615e5e565b80828252602080830192508086018b82838702890101111561559b578788fd5b8796505b848710156155c65780516155b281615e7e565b84526001969096019592810192810161559f565b5089015190975093505050808211156155dd578283fd5b506155ea8682870161530c565b925050604084015190509250925092565b60006020828403121561560c578081fd5b815180151581146115de578182fd5b600080600080600080600060e0888a031215615635578081fd5b87359650602088013561564781615e7e565b9550604088013561565781615e7e565b9450606088013567ffffffffffffffff80821115615673578283fd5b61567f8b838c016152a9565b955060808a0135945060a08a0135935060c08a01359150808211156156a2578283fd5b506156af8a828b0161536a565b91505092959891949750929550565b6000602082840312156156cf578081fd5b81356001600160e01b0319811681146115de578182fd5b6000602082840312156156f7578081fd5b81516115de81615e7e565b60008060408385031215615714578182fd5b823561571f81615e7e565b9150602083013567ffffffffffffffff81111561573a578182fd5b6157468582860161536a565b9150509250929050565b600060208284031215615761578081fd5b6115de83836153d3565b60008060006060848603121561577f578081fd5b61578985856153d3565b9250602084015167ffffffffffffffff8111156157a4578182fd5b6155ea8682870161530c565b600080604083850312156157c2578182fd5b6157cc84846153d3565b9150602083015190509250929050565b6000806000606084860312156157f0578081fd5b6157fa85856153d3565b925060208401519150604084015190509250925092565b600060208284031215615822578081fd5b6115de83836153e2565b6000806040838503121561583e578182fd5b61584884846153e2565b9150602083015167ffffffffffffffff811115615863578182fd5b6157468582860161530c565b600080600060608486031215615883578081fd5b61578985856153e2565b6000806040838503121561589f578182fd5b6157cc84846153e2565b6000806000606084860312156158bd578081fd5b6157fa85856153e2565b600080600080608085870312156158dc578182fd5b843567ffffffffffffffff808211156158f3578384fd5b818701915061012080838a031215615909578485fd5b61591281615e37565b905061591e89846153f1565b815261592d896020850161529e565b602082015261593f896040850161529e565b6040820152606083013560608201526080830135608082015260a083013560a082015261596f8960c0850161529e565b60c08201526159818960e0850161529e565b60e08201526101008084013583811115615999578687fd5b6159a58b82870161536a565b8284015250508096505060208701359150808211156159c2578384fd5b506159cf878288016152a9565b949794965050505060408301359260600135919050565b6000602082840312156159f7578081fd5b5035919050565b600060208284031215615a0f578081fd5b5051919050565b60008060408385031215615a28578182fd5b50508035926020909101359150565b60008060008060808587031215615a4c578182fd5b8451935060208501519250604085015191506060850151615a6c81615e7e565b939692955090935050565b600060208284031215615a88578081fd5b81516115de81615e93565b60008060408385031215615aa5578182fd5b8251615ab081615e93565b6020939093015192949293505050565b6001600160a01b03169052565b6000815180845260208085019450808401835b83811015615afc57815187529582019590820190600101615ae0565b509495945050505050565b60008151808452815b81811015615b2c57602081850181015186830182015201615b10565b81811115615b3d5782602083870101525b50601f01601f19169290920160200192915050565b9182526001600160e01b031916602082015260240190565b6000828483379101908152919050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6020808252825182820181905260009190848201906040850190845b81811015615bea5783516001600160a01b031683529284019291840191600101615bc5565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015615c80578151805160048110615c2957fe5b855280870151615c3b88870182615ac0565b508581015186860152606080820151615c5682880182615ac0565b505060809081015190615c6b86820183615ac0565b505060a0939093019290850190600101615c13565b5091979650505050505050565b6000602082526115de6020830184615acd565b600060408252615cb36040830185615acd565b828103602084015261185c8185615acd565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b9283526001600160a01b03918216602084015216604082015260600190565b9586526001600160a01b0394851660208701529290931660408501526060840152608083019190915260a082015260c00190565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b6000838252604060208301526116566040830184615b07565b9182526001600160a01b0316602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526115de6020830184615b07565b6000838252604060208301526116566040830184615acd565b9283529015156020830152604082015260600190565b918252602082015260400190565b93845260208401929092526040830152606082015260800190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615e5657600080fd5b604052919050565b600067ffffffffffffffff821115615e74578081fd5b5060209081020190565b6001600160a01b0381168114610bfa57600080fd5b60ff81168114610bfa57600080fdfea26469706673582212203b5b656ee3e573b26e590f7b9c281c1eadb4e8c6727d83219cd25a216280131b64736f6c63430007010033
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.