Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 13143371 | 1031 days ago | IN | Create: NFTXVaultUpgradeable | 0 ETH | 0.29845268 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
NFTXVaultUpgradeable
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-02 */ // Sources flattened with hardhat v2.4.3 https://hardhat.org // File contracts/solidity/interface/INFTXEligibility.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface INFTXEligibility { // Read functions. function name() external pure returns (string memory); function finalized() external view returns (bool); function targetAsset() external pure returns (address); function checkAllEligible(uint256[] calldata tokenIds) external view returns (bool); function checkEligible(uint256[] calldata tokenIds) external view returns (bool[] memory); function checkAllIneligible(uint256[] calldata tokenIds) external view returns (bool); function checkIsEligible(uint256 tokenId) external view returns (bool); // Write functions. function __NFTXEligibility_init_bytes(bytes calldata configData) external; function beforeMintHook(uint256[] calldata tokenIds) external; function afterMintHook(uint256[] calldata tokenIds) external; function beforeRedeemHook(uint256[] calldata tokenIds) external; function afterRedeemHook(uint256[] calldata tokenIds) external; } // File contracts/solidity/proxy/IBeacon.sol pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeacon { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function childImplementation() external view returns (address); function upgradeChildTo(address newImplementation) external; } // File contracts/solidity/interface/INFTXVaultFactory.sol pragma solidity ^0.8.0; interface INFTXVaultFactory is IBeacon { // Read functions. function numVaults() external view returns (uint256); function zapContract() external view returns (address); function feeDistributor() external view returns (address); function eligibilityManager() external view returns (address); function vault(uint256 vaultId) external view returns (address); function vaultsForAsset(address asset) external view returns (address[] memory); function isLocked(uint256 id) external view returns (bool); function excludedFromFees(address addr) external view returns (bool); event NewFeeDistributor(address oldDistributor, address newDistributor); event NewZapContract(address oldZap, address newZap); event FeeExclusion(address feeExcluded, bool excluded); event NewEligibilityManager(address oldEligManager, address newEligManager); event NewVault(uint256 indexed vaultId, address vaultAddress, address assetAddress); // Write functions. function __NFTXVaultFactory_init(address _vaultImpl, address _feeDistributor) external; function createVault( string calldata name, string calldata symbol, address _assetAddress, bool is1155, bool allowAllItems ) external returns (uint256); function setFeeDistributor(address _feeDistributor) external; function setEligibilityManager(address _eligibilityManager) external; function setZapContract(address _zapContract) external; function setFeeExclusion(address _excludedAddr, bool excluded) external; } // File contracts/solidity/interface/INFTXVault.sol pragma solidity ^0.8.0; interface INFTXVault { function manager() external returns (address); function assetAddress() external returns (address); function vaultFactory() external returns (INFTXVaultFactory); function eligibilityStorage() external returns (INFTXEligibility); function is1155() external returns (bool); function allowAllItems() external returns (bool); function enableMint() external returns (bool); function enableRandomRedeem() external returns (bool); function enableTargetRedeem() external returns (bool); function vaultId() external returns (uint256); function nftIdAt(uint256 holdingsIndex) external view returns (uint256); function allHoldings() external view returns (uint256[] memory); function totalHoldings() external view returns (uint256); function mintFee() external returns (uint256); function randomRedeemFee() external returns (uint256); function targetRedeemFee() external returns (uint256); event VaultInit( uint256 indexed vaultId, address assetAddress, bool is1155, bool allowAllItems ); event ManagerSet(address manager); event EligibilityDeployed(uint256 moduleIndex, address eligibilityAddr); // event CustomEligibilityDeployed(address eligibilityAddr); event EnableMintUpdated(bool enabled); event EnableRandomRedeemUpdated(bool enabled); event EnableTargetRedeemUpdated(bool enabled); event MintFeeUpdated(uint256 mintFee); event RandomRedeemFeeUpdated(uint256 randomRedeemFee); event TargetRedeemFeeUpdated(uint256 targetRedeemFee); event Minted(uint256[] nftIds, uint256[] amounts, address to); event Redeemed(uint256[] nftIds, uint256[] specificIds, address to); event Swapped( uint256[] nftIds, uint256[] amounts, uint256[] specificIds, uint256[] redeemedIds, address to ); function __NFTXVault_init( string calldata _name, string calldata _symbol, address _assetAddress, bool _is1155, bool _allowAllItems ) external; function finalizeVault() external; function setVaultMetadata( string memory name_, string memory symbol_ ) external; function setVaultFeatures( bool _enableMint, bool _enableRandomRedeem, bool _enableTargetRedeem ) external; function setFees( uint256 _mintFee, uint256 _randomRedeemFee, uint256 _targetRedeemFee ) external; // This function allows for an easy setup of any eligibility module contract from the EligibilityManager. // It takes in ABI encoded parameters for the desired module. This is to make sure they can all follow // a similar interface. function deployEligibilityStorage( uint256 moduleIndex, bytes calldata initData ) external returns (address); // The manager has control over options like fees and features function setManager(address _manager) external; function mint( uint256[] calldata tokenIds, uint256[] calldata amounts /* ignored for ERC721 vaults */ ) external returns (uint256); function mintTo( uint256[] calldata tokenIds, uint256[] calldata amounts, /* ignored for ERC721 vaults */ address to ) external returns (uint256); function redeem(uint256 amount, uint256[] calldata specificIds) external returns (uint256[] calldata); function redeemTo( uint256 amount, uint256[] calldata specificIds, address to ) external returns (uint256[] calldata); function swap( uint256[] calldata tokenIds, uint256[] calldata amounts, /* ignored for ERC721 vaults */ uint256[] calldata specificIds ) external returns (uint256[] calldata); function swapTo( uint256[] calldata tokenIds, uint256[] calldata amounts, /* ignored for ERC721 vaults */ uint256[] calldata specificIds, address to ) external returns (uint256[] calldata); function allValidNFTs(uint256[] calldata tokenIds) external view returns (bool); } // File contracts/solidity/interface/INFTXEligibilityManager.sol pragma solidity ^0.8.0; interface INFTXEligibilityManager { function nftxVaultFactory() external returns (address); function eligibilityImpl() external returns (address); function deployEligibility(uint256 vaultId, bytes calldata initData) external returns (address); } // File contracts/solidity/interface/INFTXLPStaking.sol pragma solidity ^0.8.0; interface INFTXLPStaking { function nftxVaultFactory() external view returns (address); function rewardDistTokenImpl() external view returns (address); function stakingTokenProvider() external view returns (address); function vaultToken(address _stakingToken) external view returns (address); function stakingToken(address _vaultToken) external view returns (address); function rewardDistributionToken(uint256 vaultId) external view returns (address); function newRewardDistributionToken(uint256 vaultId) external view returns (address); function oldRewardDistributionToken(uint256 vaultId) external view returns (address); function unusedRewardDistributionToken(uint256 vaultId) external view returns (address); function rewardDistributionTokenAddr(address stakingToken, address rewardToken) external view returns (address); // Write functions. function __NFTXLPStaking__init(address _stakingTokenProvider) external; function setNFTXVaultFactory(address newFactory) external; function setStakingTokenProvider(address newProvider) external; function addPoolForVault(uint256 vaultId) external; function updatePoolForVault(uint256 vaultId) external; function updatePoolForVaults(uint256[] calldata vaultId) external; function receiveRewards(uint256 vaultId, uint256 amount) external returns (bool); function deposit(uint256 vaultId, uint256 amount) external; function timelockDepositFor(uint256 vaultId, address account, uint256 amount, uint256 timelockLength) external; function exit(uint256 vaultId, uint256 amount) external; function rescue(uint256 vaultId) external; function withdraw(uint256 vaultId, uint256 amount) external; function claimRewards(uint256 vaultId) external; } // File contracts/solidity/interface/INFTXFeeDistributor.sol pragma solidity ^0.8.0; interface INFTXFeeDistributor { struct FeeReceiver { uint256 allocPoint; address receiver; bool isContract; } function nftxVaultFactory() external returns (address); function lpStaking() external returns (address); function treasury() external returns (address); function defaultTreasuryAlloc() external returns (uint256); function defaultLPAlloc() external returns (uint256); function allocTotal(uint256 vaultId) external returns (uint256); function specificTreasuryAlloc(uint256 vaultId) external returns (uint256); // Write functions. function __FeeDistributor__init__(address _lpStaking, address _treasury) external; function rescueTokens(address token) external; function distribute(uint256 vaultId) external; function addReceiver(uint256 _vaultId, uint256 _allocPoint, address _receiver, bool _isContract) external; function initializeVaultReceivers(uint256 _vaultId) external; function changeMultipleReceiverAlloc( uint256[] memory _vaultIds, uint256[] memory _receiverIdxs, uint256[] memory allocPoints ) external; function changeMultipleReceiverAddress( uint256[] memory _vaultIds, uint256[] memory _receiverIdxs, address[] memory addresses, bool[] memory isContracts ) external; function changeReceiverAlloc(uint256 _vaultId, uint256 _idx, uint256 _allocPoint) external; function changeReceiverAddress(uint256 _vaultId, uint256 _idx, address _address, bool _isContract) external; function removeReceiver(uint256 _vaultId, uint256 _receiverIdx) external; // Configuration functions. function setTreasuryAddress(address _treasury) external; function setDefaultTreasuryAlloc(uint256 _allocPoint) external; function setSpecificTreasuryAlloc(uint256 _vaultId, uint256 _allocPoint) external; function setLPStakingAddress(address _lpStaking) external; function setNFTXVaultFactory(address _factory) external; function setDefaultLPAlloc(uint256 _allocPoint) external; } // File contracts/solidity/interface/IERC165Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File contracts/solidity/interface/IERC3156Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC3156 FlashBorrower, as defined in * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156]. */ interface IERC3156FlashBorrowerUpgradeable { /** * @dev Receive a flash loan. * @param initiator The initiator of the loan. * @param token The loan currency. * @param amount The amount of tokens lent. * @param fee The additional amount of tokens to repay. * @param data Arbitrary data structure, intended to contain user-defined parameters. * @return The keccak256 hash of "ERC3156FlashBorrower.onFlashLoan" */ function onFlashLoan( address initiator, address token, uint256 amount, uint256 fee, bytes calldata data ) external returns (bytes32); } /** * @dev Interface of the ERC3156 FlashLender, as defined in * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156]. */ interface IERC3156FlashLenderUpgradeable { /** * @dev The amount of currency available to be lended. * @param token The loan currency. * @return The amount of `token` that can be borrowed. */ function maxFlashLoan( address token ) external view returns (uint256); /** * @dev The fee to be charged for a given loan. * @param token The loan currency. * @param amount The amount of tokens lent. * @return The amount of `token` to be charged for the loan, on top of the returned principal. */ function flashFee( address token, uint256 amount ) external view returns (uint256); /** * @dev Initiate a flash loan. * @param receiver The receiver of the tokens in the loan, and the receiver of the callback. * @param token The loan currency. * @param amount The amount of tokens lent. * @param data Arbitrary data structure, intended to contain user-defined parameters. */ function flashLoan( IERC3156FlashBorrowerUpgradeable receiver, address token, uint256 amount, bytes calldata data ) external returns (bool); } // File contracts/solidity/token/IERC20Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File contracts/solidity/token/IERC20Metadata.sol pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20Upgradeable { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File contracts/solidity/proxy/Initializable.sol // solhint-disable-next-line compiler-version pragma solidity ^0.8.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } // File contracts/solidity/util/ContextUpgradeable.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // File contracts/solidity/token/ERC20Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20Metadata { mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal initializer { __Context_init_unchained(); __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer { _name = name_; _symbol = symbol_; } function _setMetadata(string memory name_, string memory symbol_) internal { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); _approve(sender, _msgSender(), currentAllowance - amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); _approve(_msgSender(), spender, currentAllowance - subtractedValue); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); _balances[sender] = senderBalance - amount; _balances[recipient] += amount; emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); _balances[account] = accountBalance - amount; _totalSupply -= amount; emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } uint256[45] private __gap; } // File contracts/solidity/token/ERC20FlashMintUpgradeable.sol pragma solidity ^0.8.0; /** * @dev Implementation of the ERC3156 Flash loans extension, as defined in * https://eips.ethereum.org/EIPS/eip-3156[ERC-3156]. * * Adds the {flashLoan} method, which provides flash loan support at the token * level. By default there is no fee, but this can be changed by overriding {flashFee}. */ abstract contract ERC20FlashMintUpgradeable is Initializable, ERC20Upgradeable, IERC3156FlashLenderUpgradeable { function __ERC20FlashMint_init() internal initializer { __Context_init_unchained(); __ERC20FlashMint_init_unchained(); } function __ERC20FlashMint_init_unchained() internal initializer { } bytes32 constant private RETURN_VALUE = keccak256("ERC3156FlashBorrower.onFlashLoan"); /** * @dev Returns the maximum amount of tokens available for loan. * @param token The address of the token that is requested. * @return The amont of token that can be loaned. */ function maxFlashLoan(address token) public view override returns (uint256) { return token == address(this) ? type(uint256).max - totalSupply() : 0; } /** * @dev Returns the fee applied when doing flash loans. By default this * implementation has 0 fees. This function can be overloaded to make * the flash loan mechanism deflationary. * @param token The token to be flash loaned. * @param amount The amount of tokens to be loaned. * @return The fees applied to the corresponding flash loan. */ function flashFee(address token, uint256 amount) public view virtual override returns (uint256) { require(token == address(this), "ERC20FlashMint: wrong token"); // silence warning about unused variable without the addition of bytecode. amount; return 0; } /** * @dev Performs a flash loan. New tokens are minted and sent to the * `receiver`, who is required to implement the {IERC3156FlashBorrower} * interface. By the end of the flash loan, the receiver is expected to own * amount + fee tokens and have them approved back to the token contract itself so * they can be burned. * @param receiver The receiver of the flash loan. Should implement the * {IERC3156FlashBorrower.onFlashLoan} interface. * @param token The token to be flash loaned. Only `address(this)` is * supported. * @param amount The amount of tokens to be loaned. * @param data An arbitrary datafield that is passed to the receiver. * @return `true` is the flash loan was successfull. */ function flashLoan( IERC3156FlashBorrowerUpgradeable receiver, address token, uint256 amount, bytes memory data ) public virtual override returns (bool) { uint256 fee = flashFee(token, amount); _mint(address(receiver), amount); require(receiver.onFlashLoan(msg.sender, token, amount, fee, data) == RETURN_VALUE, "ERC20FlashMint: invalid return value"); uint256 currentAllowance = allowance(address(receiver), address(this)); require(currentAllowance >= amount + fee, "ERC20FlashMint: allowance does not allow refund"); _approve(address(receiver), address(this), currentAllowance - amount - fee); _burn(address(receiver), amount + fee); return true; } uint256[50] private __gap; } // File contracts/solidity/token/IERC721ReceiverUpgradeable.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721ReceiverUpgradeable { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File contracts/solidity/token/ERC721SafeHolderUpgradeable.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721SafeHolderUpgradeable is IERC721ReceiverUpgradeable { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address, uint256, bytes memory ) public virtual override returns (bytes4) { return this.onERC721Received.selector; } } // File contracts/solidity/token/IERC1155ReceiverUpgradeable.sol pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155ReceiverUpgradeable is IERC165Upgradeable { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns(bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns(bytes4); } // File contracts/solidity/util/ERC165Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165Upgradeable is IERC165Upgradeable { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } } // File contracts/solidity/token/ERC1155ReceiverUpgradeable.sol pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ abstract contract ERC1155ReceiverUpgradeable is ERC165Upgradeable, IERC1155ReceiverUpgradeable { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC1155ReceiverUpgradeable).interfaceId || super.supportsInterface(interfaceId); } } // File contracts/solidity/token/ERC1155SafeHolderUpgradeable.sol pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ abstract contract ERC1155SafeHolderUpgradeable is ERC1155ReceiverUpgradeable { function onERC1155Received(address operator, address, uint256, uint256, bytes memory) public virtual override returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived(address operator, address, uint256[] memory, uint256[] memory, bytes memory) public virtual override returns (bytes4) { return this.onERC1155BatchReceived.selector; } } // File contracts/solidity/token/IERC721Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File contracts/solidity/token/IERC1155Upgradeable.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155Upgradeable is IERC165Upgradeable { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external; } // File contracts/solidity/util/OwnableUpgradeable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } // File contracts/solidity/util/ReentrancyGuardUpgradeable.sol pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal initializer { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal initializer { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } uint256[49] private __gap; } // File contracts/solidity/util/EnumerableSetUpgradeable.sol pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSetUpgradeable { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } // File contracts/solidity/NFTXVaultUpgradeable.sol pragma solidity ^0.8.0; // Authors: @0xKiwi_ and @alexgausman. contract NFTXVaultUpgradeable is OwnableUpgradeable, ERC20FlashMintUpgradeable, ReentrancyGuardUpgradeable, ERC721SafeHolderUpgradeable, ERC1155SafeHolderUpgradeable, INFTXVault { using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; uint256 constant base = 10**18; uint256 public override vaultId; address public override manager; address public override assetAddress; INFTXVaultFactory public override vaultFactory; INFTXEligibility public override eligibilityStorage; uint256 randNonce; uint256 public override mintFee; uint256 public override randomRedeemFee; uint256 public override targetRedeemFee; bool public override is1155; bool public override allowAllItems; bool public override enableMint; bool public override enableRandomRedeem; bool public override enableTargetRedeem; EnumerableSetUpgradeable.UintSet holdings; mapping(uint256 => uint256) quantity1155; function __NFTXVault_init( string memory _name, string memory _symbol, address _assetAddress, bool _is1155, bool _allowAllItems ) public override virtual initializer { __Ownable_init(); __ERC20_init(_name, _symbol); require(_assetAddress != address(0), "Asset != address(0)"); assetAddress = _assetAddress; vaultFactory = INFTXVaultFactory(msg.sender); vaultId = vaultFactory.numVaults(); is1155 = _is1155; allowAllItems = _allowAllItems; emit VaultInit(vaultId, _assetAddress, _is1155, _allowAllItems); setVaultFeatures(true /*enableMint*/, true /*enableRandomRedeem*/, true /*enableTargetRedeem*/); setFees(0.05 ether /*mintFee*/, 0 /*randomRedeemFee*/, 0.05 ether /*targetRedeemFee*/); } function finalizeVault() external override virtual { setManager(address(0)); } // Added in v1.0.3. function setVaultMetadata( string memory name_, string memory symbol_ ) public override virtual { onlyPrivileged(); _setMetadata(name_, symbol_); } function setVaultFeatures( bool _enableMint, bool _enableRandomRedeem, bool _enableTargetRedeem ) public override virtual { onlyPrivileged(); enableMint = _enableMint; enableRandomRedeem = _enableRandomRedeem; enableTargetRedeem = _enableTargetRedeem; emit EnableMintUpdated(_enableMint); emit EnableRandomRedeemUpdated(_enableRandomRedeem); emit EnableTargetRedeemUpdated(_enableTargetRedeem); } function setFees( uint256 _mintFee, uint256 _randomRedeemFee, uint256 _targetRedeemFee ) public override virtual { onlyPrivileged(); require(_mintFee <= base, "Cannot > 1 ether"); require(_randomRedeemFee <= base, "Cannot > 1 ether"); require(_targetRedeemFee <= base, "Cannot > 1 ether"); mintFee = _mintFee; randomRedeemFee = _randomRedeemFee; targetRedeemFee = _targetRedeemFee; emit MintFeeUpdated(_mintFee); emit RandomRedeemFeeUpdated(_randomRedeemFee); emit TargetRedeemFeeUpdated(_targetRedeemFee); } // This function allows for an easy setup of any eligibility module contract from the EligibilityManager. // It takes in ABI encoded parameters for the desired module. This is to make sure they can all follow // a similar interface. function deployEligibilityStorage( uint256 moduleIndex, bytes calldata initData ) external override virtual returns (address) { onlyPrivileged(); require( address(eligibilityStorage) == address(0), "NFTXVault: eligibility already set" ); INFTXEligibilityManager eligManager = INFTXEligibilityManager( vaultFactory.eligibilityManager() ); address _eligibility = eligManager.deployEligibility( moduleIndex, initData ); eligibilityStorage = INFTXEligibility(_eligibility); // Toggle this to let the contract know to check eligibility now. allowAllItems = false; emit EligibilityDeployed(moduleIndex, _eligibility); return _eligibility; } // // This function allows for the manager to set their own arbitrary eligibility contract. // // Once eligiblity is set, it cannot be unset or changed. // Disabled for launch. // function setEligibilityStorage(address _newEligibility) public virtual { // onlyPrivileged(); // require( // address(eligibilityStorage) == address(0), // "NFTXVault: eligibility already set" // ); // eligibilityStorage = INFTXEligibility(_newEligibility); // // Toggle this to let the contract know to check eligibility now. // allowAllItems = false; // emit CustomEligibilityDeployed(address(_newEligibility)); // } // The manager has control over options like fees and features function setManager(address _manager) public override virtual { onlyPrivileged(); manager = _manager; emit ManagerSet(_manager); } function saveStuckFees() public { require(msg.sender == 0xDEA9196Dcdd2173D6E369c2AcC0faCc83fD9346a /* Dev Wallet */, "Not auth"); address distributor = vaultFactory.feeDistributor(); address lpStaking = INFTXFeeDistributor(distributor).lpStaking(); uint256 _vaultId = vaultId; // Get stuck tokens from v1. address unusedAddr = INFTXLPStaking(lpStaking).unusedRewardDistributionToken(_vaultId); uint256 stuckUnusedBal = balanceOf(unusedAddr); // Get tokens from the DAO. address dao = 0x40D73Df4F99bae688CE3C23a01022224FE16C7b2; uint256 daoBal = balanceOf(dao); require(stuckUnusedBal + daoBal > 0, "Zero"); // address gaus = 0x8F217D5cCCd08fD9dCe24D6d42AbA2BB4fF4785B; address gaus = 0x701f373Df763308D96d8537822e8f9B2bAe4E847; // hot wallet _transfer(unusedAddr, gaus, stuckUnusedBal); _transfer(dao, gaus, daoBal); } function mint( uint256[] calldata tokenIds, uint256[] calldata amounts /* ignored for ERC721 vaults */ ) external override virtual returns (uint256) { return mintTo(tokenIds, amounts, msg.sender); } function mintTo( uint256[] memory tokenIds, uint256[] memory amounts, /* ignored for ERC721 vaults */ address to ) public override virtual nonReentrant returns (uint256) { onlyOwnerIfPaused(1); require(enableMint, "Minting not enabled"); // Take the NFTs. uint256 count = receiveNFTs(tokenIds, amounts); // Mint to the user. _mint(to, base * count); uint256 totalFee = mintFee * count; _chargeAndDistributeFees(to, totalFee); emit Minted(tokenIds, amounts, to); return count; } function redeem(uint256 amount, uint256[] calldata specificIds) external override virtual returns (uint256[] memory) { return redeemTo(amount, specificIds, msg.sender); } function redeemTo(uint256 amount, uint256[] memory specificIds, address to) public override virtual nonReentrant returns (uint256[] memory) { onlyOwnerIfPaused(2); require(enableRandomRedeem || enableTargetRedeem, "Redeeming not enabled"); // We burn all from sender and mint to fee receiver to reduce costs. _burn(msg.sender, base * amount); // Pay the tokens + toll. uint256 totalFee = (targetRedeemFee * specificIds.length) + ( randomRedeemFee * (amount - specificIds.length) ); _chargeAndDistributeFees(msg.sender, totalFee); // Withdraw from vault. uint256[] memory redeemedIds = withdrawNFTsTo(amount, specificIds, to); emit Redeemed(redeemedIds, specificIds, to); return redeemedIds; } function swap( uint256[] calldata tokenIds, uint256[] calldata amounts, /* ignored for ERC721 vaults */ uint256[] calldata specificIds ) external override virtual returns (uint256[] memory) { return swapTo(tokenIds, amounts, specificIds, msg.sender); } function swapTo( uint256[] memory tokenIds, uint256[] memory amounts, /* ignored for ERC721 vaults */ uint256[] memory specificIds, address to ) public override virtual nonReentrant returns (uint256[] memory) { onlyOwnerIfPaused(3); require(enableMint && (enableRandomRedeem || enableTargetRedeem), "NFTXVault: Mint & Redeem enabled"); // Take the NFTs first, so the user has a chance of rerolling the same. // This is intentional so this action mirrors how minting/redeeming manually would work. uint256 count = receiveNFTs(tokenIds, amounts); // Pay the toll. Mint and Redeem fees here since its a swap. // We burn all from sender and mint to fee receiver to reduce costs. uint256 redeemFee = (targetRedeemFee * specificIds.length) + ( randomRedeemFee * (count - specificIds.length) ); uint256 totalFee = (mintFee * count) + redeemFee; _chargeAndDistributeFees(msg.sender, totalFee); // Withdraw from vault. uint256[] memory ids = withdrawNFTsTo(count, specificIds, to); emit Swapped(tokenIds, amounts, specificIds, ids, to); return ids; } function flashLoan( IERC3156FlashBorrowerUpgradeable receiver, address token, uint256 amount, bytes memory data ) public override virtual returns (bool) { onlyOwnerIfPaused(4); return super.flashLoan(receiver, token, amount, data); } function allValidNFTs(uint256[] memory tokenIds) public view override virtual returns (bool) { if (allowAllItems) { return true; } INFTXEligibility _eligibilityStorage = eligibilityStorage; if (address(_eligibilityStorage) == address(0)) { return false; } return _eligibilityStorage.checkAllEligible(tokenIds); } function nftIdAt(uint256 holdingsIndex) external view override virtual returns (uint256) { return holdings.at(holdingsIndex); } // Added in v1.0.3. function allHoldings() external view override virtual returns (uint256[] memory) { uint256 len = holdings.length(); uint256[] memory idArray = new uint256[](len); for (uint256 i = 0; i < len; i++) { idArray[i] = holdings.at(i); } return idArray; } // Added in v1.0.3. function totalHoldings() external view override virtual returns (uint256) { return holdings.length(); } // Added in v1.0.3. function version() external pure returns (string memory) { return "v1.0.5"; } // We set a hook to the eligibility module (if it exists) after redeems in case anything needs to be modified. function afterRedeemHook(uint256[] memory tokenIds) internal virtual { INFTXEligibility _eligibilityStorage = eligibilityStorage; if (address(_eligibilityStorage) == address(0)) { return; } _eligibilityStorage.afterRedeemHook(tokenIds); } function receiveNFTs(uint256[] memory tokenIds, uint256[] memory amounts) internal virtual returns (uint256) { require(allValidNFTs(tokenIds), "NFTXVault: not eligible"); if (is1155) { // This is technically a check, so placing it before the effect. IERC1155Upgradeable(assetAddress).safeBatchTransferFrom( msg.sender, address(this), tokenIds, amounts, "" ); uint256 count; for (uint256 i = 0; i < tokenIds.length; i++) { uint256 tokenId = tokenIds[i]; uint256 amount = amounts[i]; require(amount > 0, "NFTXVault: transferring < 1"); if (quantity1155[tokenId] == 0) { holdings.add(tokenId); } quantity1155[tokenId] += amount; count += amount; } return count; } else { address _assetAddress = assetAddress; for (uint256 i = 0; i < tokenIds.length; i++) { uint256 tokenId = tokenIds[i]; transferFromERC721(_assetAddress, tokenId); holdings.add(tokenId); } return tokenIds.length; } } function withdrawNFTsTo( uint256 amount, uint256[] memory specificIds, address to ) internal virtual returns (uint256[] memory) { require( amount == specificIds.length || enableRandomRedeem, "NFTXVault: Random redeem not enabled" ); require( specificIds.length == 0 || enableTargetRedeem, "NFTXVault: Target redeem not enabled" ); bool _is1155 = is1155; address _assetAddress = assetAddress; uint256[] memory redeemedIds = new uint256[](amount); for (uint256 i = 0; i < amount; i++) { // This will always be fine considering the validations made above. uint256 tokenId = i < specificIds.length ? specificIds[i] : getRandomTokenIdFromVault(); redeemedIds[i] = tokenId; if (_is1155) { quantity1155[tokenId] -= 1; if (quantity1155[tokenId] == 0) { holdings.remove(tokenId); } IERC1155Upgradeable(_assetAddress).safeTransferFrom( address(this), to, tokenId, 1, "" ); } else { holdings.remove(tokenId); transferERC721(_assetAddress, to, tokenId); } } afterRedeemHook(redeemedIds); return redeemedIds; } function _chargeAndDistributeFees(address user, uint256 amount) internal virtual { // Do not charge fees if the zap contract is calling // Added in v1.0.3. Changed to mapping in v1.0.5. if (vaultFactory.excludedFromFees(msg.sender)) { return; } // Mint fees directly to the distributor and distribute. if (amount > 0) { address feeDistributor = vaultFactory.feeDistributor(); // Changed to a _transfer() in v1.0.3. _transfer(user, feeDistributor, amount); INFTXFeeDistributor(feeDistributor).distribute(vaultId); } } function transferERC721(address assetAddr, address to, uint256 tokenId) internal virtual { address kitties = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d; address punks = 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB; bytes memory data; if (assetAddr == kitties) { // Changed in v1.0.4. data = abi.encodeWithSignature("transfer(address,uint256)", to, tokenId); } else if (assetAddr == punks) { // CryptoPunks. data = abi.encodeWithSignature("transferPunk(address,uint256)", to, tokenId); } else { // Default. data = abi.encodeWithSignature("safeTransferFrom(address,address,uint256)", address(this), to, tokenId); } (bool success,) = address(assetAddr).call(data); require(success); } function transferFromERC721(address assetAddr, uint256 tokenId) internal virtual { address kitties = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d; address punks = 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB; bytes memory data; if (assetAddr == kitties) { // Cryptokitties. data = abi.encodeWithSignature("transferFrom(address,address,uint256)", msg.sender, address(this), tokenId); } else if (assetAddr == punks) { // CryptoPunks. // Fix here for frontrun attack. Added in v1.0.2. bytes memory punkIndexToAddress = abi.encodeWithSignature("punkIndexToAddress(uint256)", tokenId); (bool checkSuccess, bytes memory result) = address(assetAddr).staticcall(punkIndexToAddress); (address owner) = abi.decode(result, (address)); require(checkSuccess && owner == msg.sender, "Not the owner"); data = abi.encodeWithSignature("buyPunk(uint256)", tokenId); } else { // Default. data = abi.encodeWithSignature("safeTransferFrom(address,address,uint256)", msg.sender, address(this), tokenId); } (bool success, bytes memory resultData) = address(assetAddr).call(data); require(success, string(resultData)); } function getRandomTokenIdFromVault() internal virtual returns (uint256) { uint256 randomIndex = uint256( keccak256( abi.encodePacked( blockhash(block.number - 1), randNonce, block.coinbase, block.difficulty, block.timestamp ) ) ) % holdings.length(); randNonce += 1; return holdings.at(randomIndex); } function onlyPrivileged() internal view { if (manager == address(0)) { require(msg.sender == owner(), "Not owner"); } else { require(msg.sender == manager, "Not manager"); } } function onlyOwnerIfPaused(uint256 lockId) internal view { require(!vaultFactory.isLocked(lockId) || msg.sender == owner(), "Paused"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":"uint256","name":"moduleIndex","type":"uint256"},{"indexed":false,"internalType":"address","name":"eligibilityAddr","type":"address"}],"name":"EligibilityDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableMintUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableRandomRedeemUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableTargetRedeemUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"manager","type":"address"}],"name":"ManagerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"mintFee","type":"uint256"}],"name":"MintFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"randomRedeemFee","type":"uint256"}],"name":"RandomRedeemFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"Redeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"nftIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"redeemedIds","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"Swapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"targetRedeemFee","type":"uint256"}],"name":"TargetRedeemFeeUpdated","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"vaultId","type":"uint256"},{"indexed":false,"internalType":"address","name":"assetAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"is1155","type":"bool"},{"indexed":false,"internalType":"bool","name":"allowAllItems","type":"bool"}],"name":"VaultInit","type":"event"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_assetAddress","type":"address"},{"internalType":"bool","name":"_is1155","type":"bool"},{"internalType":"bool","name":"_allowAllItems","type":"bool"}],"name":"__NFTXVault_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allHoldings","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"allValidNFTs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowAllItems","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"assetAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"moduleIndex","type":"uint256"},{"internalType":"bytes","name":"initData","type":"bytes"}],"name":"deployEligibilityStorage","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eligibilityStorage","outputs":[{"internalType":"contract INFTXEligibility","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableRandomRedeem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTargetRedeem","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalizeVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"flashFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC3156FlashBorrowerUpgradeable","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"flashLoan","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"is1155","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"maxFlashLoan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"}],"name":"mintTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"holdingsIndex","type":"uint256"}],"name":"nftIdAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomRedeemFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"}],"name":"redeem","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"}],"name":"redeemTo","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saveStuckFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintFee","type":"uint256"},{"internalType":"uint256","name":"_randomRedeemFee","type":"uint256"},{"internalType":"uint256","name":"_targetRedeemFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enableMint","type":"bool"},{"internalType":"bool","name":"_enableRandomRedeem","type":"bool"},{"internalType":"bool","name":"_enableTargetRedeem","type":"bool"}],"name":"setVaultFeatures","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"name":"setVaultMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"}],"name":"swap","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"}],"name":"swapTo","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetRedeemFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalHoldings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultFactory","outputs":[{"internalType":"contract INFTXVaultFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061498f806100206000396000f3fe608060405234801561001057600080fd5b50600436106103575760003560e01c806379309658116101c8578063d0ebdbe711610104578063e9ec2e99116100a2578063f2fde38b1161007c578063f2fde38b146107cd578063f7fce334146107e0578063fcc0e381146107ea578063feb8eba5146107ff57600080fd5b8063e9ec2e991461077a578063f1d20dd414610782578063f23a6e611461079557600080fd5b8063d9d98ce4116100de578063d9d98ce414610708578063dd62ed3e1461071b578063e0a8b97a14610754578063e78458c41461076757600080fd5b8063d0ebdbe7146106cf578063d6ee4a93146106e2578063d8a06f73146106f557600080fd5b8063a457c2d711610171578063bc197c811161014b578063bc197c8114610669578063c3cb8c14146106a1578063c4a0db96146106a9578063cec10c11146106bc57600080fd5b8063a457c2d714610630578063a9059cbb14610643578063b10402ea1461065657600080fd5b80638f878a43116101a25780638f878a431461060257806395d89b41146106155780639d54def61461061d57600080fd5b806379309658146105c85780638c850814146105de5780638da5cb5b146105f157600080fd5b80633d5d190c1161029757806354fd4d5011610240578063613255ab1161021a578063613255ab146105715780636b948a351461058457806370a0823114610597578063715018a6146105c057600080fd5b806354fd4d50146105125780635877aee61461054b5780635cffe9de1461055e57600080fd5b8063481c6a7511610271578063481c6a75146104e25780634a6e97ab146104f557806354f78d7f146104ff57600080fd5b80633d5d190c146104a857806344b28d59146104bb57806345a0b652146104cf57600080fd5b806318160ddd1161030457806325705d8d116102de57806325705d8d14610468578063313ce5671461047d57806333194c0a1461048c578063395093511461049557600080fd5b806318160ddd146104225780631ba46cfd1461042a57806323b872dd1461045557600080fd5b8063095ea7b311610335578063095ea7b3146103a757806313966db5146103ba578063150b7a02146103d257600080fd5b806301ffc9a71461035c57806306f26dc21461038457806306fdde0314610392575b600080fd5b61036f61036a366004614355565b610809565b60405190151581526020015b60405180910390f35b6101045461036f9060ff1681565b61039a610872565b60405161037b919061479c565b61036f6103b5366004614079565b610904565b6103c46101015481565b60405190815260200161037b565b6104096103e0366004613fa8565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040516001600160e01b0319909116815260200161037b565b6067546103c4565b60fd5461043d906001600160a01b031681565b6040516001600160a01b03909116815260200161037b565b61036f610463366004613f68565b61091a565b6104706109e5565b60405161037b91906146e1565b6040516012815260200161037b565b6103c460fb5481565b61036f6104a3366004614079565b610aa6565b6103c46104b63660046140a4565b610add565b6101045461036f9062010000900460ff1681565b6103c46104dd36600461448e565b610b57565b60fc5461043d906001600160a01b031681565b6104fd610b65565b005b6104fd61050d3660046142fe565b610e4f565b60408051808201909152600681527f76312e302e350000000000000000000000000000000000000000000000000000602082015261039a565b61043d61055936600461452d565b610f3b565b61036f61056c36600461437d565b611150565b6103c461057f366004613e4e565b611168565b6101045461036f90610100900460ff1681565b6103c46105a5366004613e4e565b6001600160a01b031660009081526065602052604090205490565b6104fd611190565b6101045461036f90640100000000900460ff1681565b6104706105ec36600461424b565b611234565b6033546001600160a01b031661043d565b60ff5461043d906001600160a01b031681565b61039a6113ea565b61047061062b3660046144f0565b6113f9565b61036f61063e366004614079565b611584565b61036f610651366004614079565b611637565b6103c46106643660046141d6565b611644565b610409610677366004613ebe565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b6104fd611790565b6104706106b73660046144a6565b61179c565b6104fd6106ca3660046145a4565b6117e5565b6104fd6106dd366004613e4e565b611976565b6104706106f036600461410d565b6119d2565b60fe5461043d906001600160a01b031681565b6103c4610716366004614079565b611a7f565b6103c4610729366004613e86565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b6104fd610762366004614392565b611ae2565b6104fd6107753660046143f3565b611af8565b6103c4611d65565b61036f6107903660046141a3565b611d77565b6104096107a3366004614012565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b6104fd6107db366004613e4e565b611e49565b6103c46101025481565b6101045461036f906301000000900460ff1681565b6103c46101035481565b60006001600160e01b031982167f4e2312e000000000000000000000000000000000000000000000000000000000148061086c57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b60606068805461088190614894565b80601f01602080910402602001604051908101604052809291908181526020018280546108ad90614894565b80156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b5050505050905090565b6000610911338484611f7b565b50600192915050565b60006109278484846120d4565b6001600160a01b0384166000908152606660209081526040808320338452909152902054828110156109c65760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6109da85336109d5868561484d565b611f7b565b506001949350505050565b606060006109f46101056122f5565b905060008167ffffffffffffffff811115610a1f57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610a48578160200160208202803683370190505b50905060005b82811015610a9f57610a62610105826122ff565b828281518110610a8257634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610a97816148cf565b915050610a4e565b5092915050565b3360008181526066602090815260408083206001600160a01b038716845290915281205490916109119185906109d5908690614816565b6000610b4e85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808902828101820190935288825290935088925087918291850190849080828437600092019190915250339250611644915050565b95945050505050565b600061086c610105836122ff565b73dea9196dcdd2173d6e369c2acc0facc83fd9346a3314610bc85760405162461bcd60e51b815260206004820152600860248201527f4e6f74206175746800000000000000000000000000000000000000000000000060448201526064016109bd565b60fe5460408051630d43e8ad60e01b815290516000926001600160a01b031691630d43e8ad916004808301926020929190829003018186803b158015610c0d57600080fd5b505afa158015610c21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c459190613e6a565b90506000816001600160a01b0316639bf1401c6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610c8457600080fd5b505af1158015610c98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbc9190613e6a565b60fb546040517fb6ac500c00000000000000000000000000000000000000000000000000000000815260048101829052919250906000906001600160a01b0384169063b6ac500c9060240160206040518083038186803b158015610d1f57600080fd5b505afa158015610d33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d579190613e6a565b90506000610d7a826001600160a01b031660009081526065602052604090205490565b7340d73df4f99bae688ce3c23a01022224fe16c7b2600081815260656020527fc63e0bad271f921fabd0869dff2d3752e6d1aff80607864b408cbe5669e3c83d54929350909190610dcb8285614816565b11610e1a5760405162461bcd60e51b81526004016109bd9060208082526004908201527f5a65726f00000000000000000000000000000000000000000000000000000000604082015260600190565b73701f373df763308d96d8537822e8f9b2bae4e847610e3a8582866120d4565b610e458382846120d4565b5050505050505050565b610e5761230b565b610104805463ffff000019166201000085151590810263ff0000001916919091176301000000851515021764ff00000000191664010000000084151502179091556040519081527fc604be2f834727754dc1ec1225c14d1ecde48e7d12fa7b745dfb137a3db998bd9060200160405180910390a160405182151581527f835d9397f97f5df575f718046bb3e918f911d39d7edfa79aa8d40ddc7d5ce2a59060200160405180910390a160405181151581527f64b60f32742df47d4ccb5b31ca12fee1bc20695467bfe8fa058b00ec446c1563906020015b60405180910390a1505050565b6000610f4561230b565b60ff546001600160a01b031615610fc45760405162461bcd60e51b815260206004820152602260248201527f4e4654585661756c743a20656c69676962696c69747920616c7265616479207360448201527f657400000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b60fe54604080517f14c77faa00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916314c77faa916004808301926020929190829003018186803b15801561102257600080fd5b505afa158015611036573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105a9190613e6a565b90506000816001600160a01b031663576ff9088787876040518463ffffffff1660e01b815260040161108e939291906147af565b602060405180830381600087803b1580156110a857600080fd5b505af11580156110bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e09190613e6a565b60ff80546001600160a01b0319166001600160a01b038316908117909155610104805461ff00191690556040805189815260208101929092529192507fe14c63b3d4272158635bee1d1b95b51bb8de042ee95a15cbfaf2865b4d0af811910160405180910390a195945050505050565b600061115c60046123cf565b610b4e858585856124c9565b60006001600160a01b038216301461118157600061086c565b60675461086c9060001961484d565b6033546001600160a01b031633146111ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109bd565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6060600260c95414156112895760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109bd565b600260c95561129860036123cf565b6101045462010000900460ff1680156112d05750610104546301000000900460ff16806112d0575061010454640100000000900460ff165b61131c5760405162461bcd60e51b815260206004820181905260248201527f4e4654585661756c743a204d696e7420262052656465656d20656e61626c656460448201526064016109bd565b600061132886866126ed565b90506000845182611339919061484d565b61010254611347919061482e565b855161010354611357919061482e565b6113619190614816565b90506000818361010154611375919061482e565b61137f9190614816565b905061138b3382612972565b6000611398848888612b1b565b90507f66982ed4a058811a8004bdcec9adcb3671f2b4f1a788667a3a74959d7c09af3c898989848a6040516113d1959493929190614733565b60405180910390a1600160c95598975050505050505050565b60606069805461088190614894565b6060600260c954141561144e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109bd565b600260c981905561145e906123cf565b610104546301000000900460ff1680611482575061010454640100000000900460ff165b6114ce5760405162461bcd60e51b815260206004820152601560248201527f52656465656d696e67206e6f7420656e61626c6564000000000000000000000060448201526064016109bd565b6114e9336114e486670de0b6b3a764000061482e565b612e0b565b60008351856114f8919061484d565b61010254611506919061482e565b845161010354611516919061482e565b6115209190614816565b905061152c3382612972565b6000611539868686612b1b565b90507f63b13f6307f284441e029836b0c22eb91eb62a7ad555670061157930ce884f4e81868660405161156e939291906146f4565b60405180910390a1600160c95595945050505050565b3360009081526066602090815260408083206001600160a01b03861684529091528120548281101561161e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016109bd565b61162d33856109d5868561484d565b5060019392505050565b60006109113384846120d4565b6000600260c95414156116995760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109bd565b600260c9556116a860016123cf565b6101045462010000900460ff166117015760405162461bcd60e51b815260206004820152601360248201527f4d696e74696e67206e6f7420656e61626c65640000000000000000000000000060448201526064016109bd565b600061170d85856126ed565b905061172a8361172583670de0b6b3a764000061482e565b612f91565b6000816101015461173b919061482e565b90506117478482612972565b7f1f72ad2a14447fa756b6f5aca53504645af79813493aca2d906b69e4aaeb949286868660405161177a939291906146f4565b60405180910390a150600160c955949350505050565b61179a6000611976565b565b60606117dd848484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503392506113f9915050565b949350505050565b6117ed61230b565b670de0b6b3a76400008311156118385760405162461bcd60e51b815260206004820152601060248201526f21b0b73737ba101f10189032ba3432b960811b60448201526064016109bd565b670de0b6b3a76400008211156118835760405162461bcd60e51b815260206004820152601060248201526f21b0b73737ba101f10189032ba3432b960811b60448201526064016109bd565b670de0b6b3a76400008111156118ce5760405162461bcd60e51b815260206004820152601060248201526f21b0b73737ba101f10189032ba3432b960811b60448201526064016109bd565b6101018390556101028290556101038190556040518381527f38fbb1c8b109c430f0c030e7ed076cf5611a307773a4e8e365601e8f8bceaec69060200160405180910390a16040518281527fba745d4fd094af690af401897448edc81084d2a0f10fd90cd608be663c68905f9060200160405180910390a16040518181527fb9941a503692be6effbff47d4a5c63e74d003c710f0e4d5bd6ccc552ec9c7e4390602001610f2e565b61197e61230b565b60fc80546001600160a01b0319166001600160a01b0383169081179091556040519081527f60a0f5b9f9e81e98216071b85826681c796256fe3d1354ecb675580fba64fa699060200160405180910390a150565b6060611a7487878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a92508991829185019084908082843760009201919091525050604080516020808a02828101820190935289825290935089925088918291850190849080828437600092019190915250339250611234915050565b979650505050505050565b60006001600160a01b0383163014611ad95760405162461bcd60e51b815260206004820152601b60248201527f4552433230466c6173684d696e743a2077726f6e6720746f6b656e000000000060448201526064016109bd565b50600092915050565b611aea61230b565b611af48282613070565b5050565b600054610100900460ff1680611b11575060005460ff16155b611b745760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109bd565b600054610100900460ff16158015611b96576000805461ffff19166101011790555b611b9e61309c565b611ba8868661315e565b6001600160a01b038416611bfe5760405162461bcd60e51b815260206004820152601360248201527f417373657420213d20616464726573732830290000000000000000000000000060448201526064016109bd565b60fd80546001600160a01b03199081166001600160a01b0387161790915560fe805433921682179055604080517f264a6208000000000000000000000000000000000000000000000000000000008152905163264a620891600480820192602092909190829003018186803b158015611c7657600080fd5b505afa158015611c8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cae919061433d565b60fb8190556101048054841515610100810261ff001988151590811661ffff199094169390931717909255604080516001600160a01b038916815260208101929092528101919091527f18ecce5c418b882a3d89e5b6cc8100dc3383309b8e78525266fe1283a7f934d69060600160405180910390a2611d316001806001610e4f565b611d4b66b1a2bc2ec50000600066b1a2bc2ec500006117e5565b8015611d5d576000805461ff00191690555b505050505050565b6000611d726101056122f5565b905090565b61010454600090610100900460ff1615611d9357506001919050565b60ff546001600160a01b031680611dad5750600092915050565b6040517f84ca9f850000000000000000000000000000000000000000000000000000000081526001600160a01b038216906384ca9f8590611df29086906004016146e1565b60206040518083038186803b158015611e0a57600080fd5b505afa158015611e1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4291906142e2565b9392505050565b6033546001600160a01b03163314611ea35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109bd565b6001600160a01b038116611f1f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109bd565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611ff65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b0382166120725760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b0383811660008181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166121505760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b0382166121cc5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b0383166000908152606560205260409020548181101561225b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016109bd565b612265828261484d565b6001600160a01b03808616600090815260656020526040808220939093559085168152908120805484929061229b908490614816565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516122e791815260200190565b60405180910390a350505050565b600061086c825490565b6000611e428383613224565b60fc546001600160a01b0316612375576033546001600160a01b0316331461179a5760405162461bcd60e51b815260206004820152600960248201527f4e6f74206f776e6572000000000000000000000000000000000000000000000060448201526064016109bd565b60fc546001600160a01b0316331461179a5760405162461bcd60e51b815260206004820152600b60248201527f4e6f74206d616e6167657200000000000000000000000000000000000000000060448201526064016109bd565b60fe546040517ff6aacfb1000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063f6aacfb19060240160206040518083038186803b15801561242c57600080fd5b505afa158015612440573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246491906142e2565b158061247a57506033546001600160a01b031633145b6124c65760405162461bcd60e51b815260206004820152600660248201527f506175736564000000000000000000000000000000000000000000000000000060448201526064016109bd565b50565b6000806124d68585611a7f565b90506124e28685612f91565b6040517f23e30c8b0000000000000000000000000000000000000000000000000000000081527f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9906001600160a01b038816906323e30c8b906125519033908a908a9088908b906004016146a9565b602060405180830381600087803b15801561256b57600080fd5b505af115801561257f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a3919061433d565b146126155760405162461bcd60e51b8152602060048201526024808201527f4552433230466c6173684d696e743a20696e76616c69642072657475726e207660448201527f616c75650000000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b03861660009081526066602090815260408083203084529091529020546126438286614816565b8110156126b85760405162461bcd60e51b815260206004820152602f60248201527f4552433230466c6173684d696e743a20616c6c6f77616e636520646f6573206e60448201527f6f7420616c6c6f7720726566756e64000000000000000000000000000000000060648201526084016109bd565b6126d28730846126c8898661484d565b6109d5919061484d565b6126e0876114e48488614816565b5060019695505050505050565b60006126f883611d77565b6127445760405162461bcd60e51b815260206004820152601760248201527f4e4654585661756c743a206e6f7420656c696769626c6500000000000000000060448201526064016109bd565b6101045460ff16156128f85760fd546040517f2eb2c2d60000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690632eb2c2d69061279f903390309088908890600401614651565b600060405180830381600087803b1580156127b957600080fd5b505af11580156127cd573d6000803e3d6000fd5b5060009250829150505b84518110156128f057600085828151811061280257634e487b7160e01b600052603260045260246000fd5b60200260200101519050600085838151811061282e57634e487b7160e01b600052603260045260246000fd5b60200260200101519050600081116128885760405162461bcd60e51b815260206004820152601b60248201527f4e4654585661756c743a207472616e7366657272696e67203c2031000000000060448201526064016109bd565b600082815261010760205260409020546128aa576128a86101058361325c565b505b60008281526101076020526040812080548392906128c9908490614816565b909155506128d990508185614816565b9350505080806128e8906148cf565b9150506127d7565b50905061086c565b60fd546001600160a01b031660005b845181101561296757600085828151811061293257634e487b7160e01b600052603260045260246000fd5b602002602001015190506129468382613268565b6129526101058261325c565b5050808061295f906148cf565b915050612907565b50835191505061086c565b60fe546040517fdbe66ca00000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b039091169063dbe66ca09060240160206040518083038186803b1580156129ce57600080fd5b505afa1580156129e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0691906142e2565b15612a0f575050565b8015611af45760fe5460408051630d43e8ad60e01b815290516000926001600160a01b031691630d43e8ad916004808301926020929190829003018186803b158015612a5a57600080fd5b505afa158015612a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a929190613e6a565b9050612a9f8382846120d4565b60fb546040517f91c05b0b00000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b038216906391c05b0b90602401600060405180830381600087803b158015612afe57600080fd5b505af1158015612b12573d6000803e3d6000fd5b50505050505050565b60608251841480612b365750610104546301000000900460ff165b612b8e5760405162461bcd60e51b8152602060048201526024808201527f4e4654585661756c743a2052616e646f6d2072656465656d206e6f7420656e61604482015263189b195960e21b60648201526084016109bd565b82511580612ba7575061010454640100000000900460ff165b612bff5760405162461bcd60e51b8152602060048201526024808201527f4e4654585661756c743a205461726765742072656465656d206e6f7420656e61604482015263189b195960e21b60648201526084016109bd565b6101045460fd5460ff909116906001600160a01b031660008667ffffffffffffffff811115612c3e57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612c67578160200160208202803683370190505b50905060005b87811015612df757600087518210612c8c57612c8761357b565b612cb5565b878281518110612cac57634e487b7160e01b600052603260045260246000fd5b60200260200101515b905080838381518110612cd857634e487b7160e01b600052603260045260246000fd5b6020026020010181815250508415612dcc57600081815261010760205260408120805460019290612d0a90849061484d565b909155505060008181526101076020526040902054612d3157612d2f6101058261361f565b505b6040517ff242432a0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038881166024830152604482018390526001606483015260a06084830152600060a483015285169063f242432a9060c401600060405180830381600087803b158015612daf57600080fd5b505af1158015612dc3573d6000803e3d6000fd5b50505050612de4565b612dd86101058261361f565b50612de484888361362b565b5080612def816148cf565b915050612c6d565b50612e0181613807565b9695505050505050565b6001600160a01b038216612e875760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b03821660009081526065602052604090205481811015612f165760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b612f20828261484d565b6001600160a01b03841660009081526065602052604081209190915560678054849290612f4e90849061484d565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016120c7565b6001600160a01b038216612fe75760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016109bd565b8060676000828254612ff99190614816565b90915550506001600160a01b03821660009081526065602052604081208054839290613026908490614816565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b8151613083906068906020850190613c7d565b508051613097906069906020840190613c7d565b505050565b600054610100900460ff16806130b5575060005460ff16155b6131185760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109bd565b600054610100900460ff1615801561313a576000805461ffff19166101011790555b61314261388f565b61314a613940565b80156124c6576000805461ff001916905550565b600054610100900460ff1680613177575060005460ff16155b6131da5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109bd565b600054610100900460ff161580156131fc576000805461ffff19166101011790555b61320461388f565b61320e8383613a35565b8015613097576000805461ff0019169055505050565b600082600001828154811061324957634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6000611e428383613b11565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038516831415613308576040513360248201523060448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b03167f23b872dd0000000000000000000000000000000000000000000000000000000017905290506134f9565b816001600160a01b0316856001600160a01b031614156134b35760008460405160240161333791815260200190565b60408051601f198184030181529181526020820180516001600160e01b03167f58178168000000000000000000000000000000000000000000000000000000001790525190915060009081906001600160a01b03891690613399908590614635565b600060405180830381855afa9150503d80600081146133d4576040519150601f19603f3d011682016040523d82523d6000602084013e6133d9565b606091505b50915091506000818060200190518101906133f49190613e6a565b905082801561340b57506001600160a01b03811633145b6134575760405162461bcd60e51b815260206004820152600d60248201527f4e6f7420746865206f776e65720000000000000000000000000000000000000060448201526064016109bd565b6040516024810189905260440160408051601f198184030181529190526020810180516001600160e01b03167f8264fe980000000000000000000000000000000000000000000000000000000017905294506134f99350505050565b6040513360248201523060448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b0316632142170760e11b17905290505b600080866001600160a01b0316836040516135149190614635565b6000604051808303816000865af19150503d8060008114613551576040519150601f19603f3d011682016040523d82523d6000602084013e613556565b606091505b5091509150818190610e455760405162461bcd60e51b81526004016109bd919061479c565b6000806135896101056122f5565b61359460014361484d565b61010054604080519240602084015282015241606090811b6bffffffffffffffffffffffff19169082015244607482015242609482015260b4016040516020818303038152906040528051906020012060001c6135f191906148ea565b9050600161010060008282546136079190614816565b909155506136199050610105826122ff565b91505090565b6000611e428383613b60565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b0386168314156136ce576040516001600160a01b03861660248201526044810185905260640160408051601f198184030181529190526020810180516001600160e01b03167fa9059cbb00000000000000000000000000000000000000000000000000000000179052905061379d565b816001600160a01b0316866001600160a01b0316141561374e576040516001600160a01b03861660248201526044810185905260640160408051601f198184030181529190526020810180516001600160e01b03167f8b72a2ec00000000000000000000000000000000000000000000000000000000179052905061379d565b6040513060248201526001600160a01b03861660448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b0316632142170760e11b17905290505b6000866001600160a01b0316826040516137b79190614635565b6000604051808303816000865af19150503d80600081146137f4576040519150601f19603f3d011682016040523d82523d6000602084013e6137f9565b606091505b5050905080612b1257600080fd5b60ff546001600160a01b03168061381c575050565b6040517f5e2f9b520000000000000000000000000000000000000000000000000000000081526001600160a01b03821690635e2f9b52906138619085906004016146e1565b600060405180830381600087803b15801561387b57600080fd5b505af1158015611d5d573d6000803e3d6000fd5b600054610100900460ff16806138a8575060005460ff16155b61390b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109bd565b600054610100900460ff1615801561314a576000805461ffff191661010117905580156124c6576000805461ff001916905550565b600054610100900460ff1680613959575060005460ff16155b6139bc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109bd565b600054610100900460ff161580156139de576000805461ffff19166101011790555b603380546001600160a01b0319163390811790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156124c6576000805461ff001916905550565b600054610100900460ff1680613a4e575060005460ff16155b613ab15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109bd565b600054610100900460ff16158015613ad3576000805461ffff19166101011790555b8251613ae6906068906020860190613c7d565b508151613afa906069906020850190613c7d565b508015613097576000805461ff0019169055505050565b6000818152600183016020526040812054613b585750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561086c565b50600061086c565b60008181526001830160205260408120548015613c73576000613b8460018361484d565b8554909150600090613b989060019061484d565b9050818114613c19576000866000018281548110613bc657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110613bf757634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613c3857634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061086c565b600091505061086c565b828054613c8990614894565b90600052602060002090601f016020900481019282613cab5760008555613cf1565b82601f10613cc457805160ff1916838001178555613cf1565b82800160010185558215613cf1579182015b82811115613cf1578251825591602001919060010190613cd6565b50613cfd929150613d01565b5090565b5b80821115613cfd5760008155600101613d02565b60008083601f840112613d27578182fd5b50813567ffffffffffffffff811115613d3e578182fd5b6020830191508360208260051b8501011115613d5957600080fd5b9250929050565b600082601f830112613d70578081fd5b8135602067ffffffffffffffff821115613d8c57613d8c614920565b8160051b613d9b8282016147e5565b838152828101908684018388018501891015613db5578687fd5b8693505b85841015613dd7578035835260019390930192918401918401613db9565b50979650505050505050565b600082601f830112613df3578081fd5b813567ffffffffffffffff811115613e0d57613e0d614920565b613e20601f8201601f19166020016147e5565b818152846020838601011115613e34578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215613e5f578081fd5b8135611e4281614936565b600060208284031215613e7b578081fd5b8151611e4281614936565b60008060408385031215613e98578081fd5b8235613ea381614936565b91506020830135613eb381614936565b809150509250929050565b600080600080600060a08688031215613ed5578081fd5b8535613ee081614936565b94506020860135613ef081614936565b9350604086013567ffffffffffffffff80821115613f0c578283fd5b613f1889838a01613d60565b94506060880135915080821115613f2d578283fd5b613f3989838a01613d60565b93506080880135915080821115613f4e578283fd5b50613f5b88828901613de3565b9150509295509295909350565b600080600060608486031215613f7c578283fd5b8335613f8781614936565b92506020840135613f9781614936565b929592945050506040919091013590565b60008060008060808587031215613fbd578384fd5b8435613fc881614936565b93506020850135613fd881614936565b925060408501359150606085013567ffffffffffffffff811115613ffa578182fd5b61400687828801613de3565b91505092959194509250565b600080600080600060a08688031215614029578283fd5b853561403481614936565b9450602086013561404481614936565b93506040860135925060608601359150608086013567ffffffffffffffff81111561406d578182fd5b613f5b88828901613de3565b6000806040838503121561408b578182fd5b823561409681614936565b946020939093013593505050565b600080600080604085870312156140b9578182fd5b843567ffffffffffffffff808211156140d0578384fd5b6140dc88838901613d16565b909650945060208701359150808211156140f4578384fd5b5061410187828801613d16565b95989497509550505050565b60008060008060008060608789031215614125578384fd5b863567ffffffffffffffff8082111561413c578586fd5b6141488a838b01613d16565b90985096506020890135915080821115614160578586fd5b61416c8a838b01613d16565b90965094506040890135915080821115614184578283fd5b5061419189828a01613d16565b979a9699509497509295939492505050565b6000602082840312156141b4578081fd5b813567ffffffffffffffff8111156141ca578182fd5b6117dd84828501613d60565b6000806000606084860312156141ea578081fd5b833567ffffffffffffffff80821115614201578283fd5b61420d87838801613d60565b94506020860135915080821115614222578283fd5b5061422f86828701613d60565b925050604084013561424081614936565b809150509250925092565b60008060008060808587031215614260578182fd5b843567ffffffffffffffff80821115614277578384fd5b61428388838901613d60565b95506020870135915080821115614298578384fd5b6142a488838901613d60565b945060408701359150808211156142b9578384fd5b506142c687828801613d60565b92505060608501356142d781614936565b939692955090935050565b6000602082840312156142f3578081fd5b8151611e428161494b565b600080600060608486031215614312578081fd5b833561431d8161494b565b9250602084013561432d8161494b565b915060408401356142408161494b565b60006020828403121561434e578081fd5b5051919050565b600060208284031215614366578081fd5b81356001600160e01b031981168114611e42578182fd5b60008060008060808587031215613fbd578182fd5b600080604083850312156143a4578182fd5b823567ffffffffffffffff808211156143bb578384fd5b6143c786838701613de3565b935060208501359150808211156143dc578283fd5b506143e985828601613de3565b9150509250929050565b600080600080600060a0868803121561440a578283fd5b853567ffffffffffffffff80821115614421578485fd5b61442d89838a01613de3565b96506020880135915080821115614442578485fd5b5061444f88828901613de3565b945050604086013561446081614936565b925060608601356144708161494b565b915060808601356144808161494b565b809150509295509295909350565b60006020828403121561449f578081fd5b5035919050565b6000806000604084860312156144ba578081fd5b83359250602084013567ffffffffffffffff8111156144d7578182fd5b6144e386828701613d16565b9497909650939450505050565b600080600060608486031215614504578081fd5b83359250602084013567ffffffffffffffff811115614521578182fd5b61422f86828701613d60565b600080600060408486031215614541578081fd5b83359250602084013567ffffffffffffffff8082111561455f578283fd5b818601915086601f830112614572578283fd5b813581811115614580578384fd5b876020828501011115614591578384fd5b6020830194508093505050509250925092565b6000806000606084860312156145b8578081fd5b505081359360208301359350604090920135919050565b6000815180845260208085019450808401835b838110156145fe578151875295820195908201906001016145e2565b509495945050505050565b60008151808452614621816020860160208601614864565b601f01601f19169290920160200192915050565b60008251614647818460208701614864565b9190910192915050565b60006001600160a01b03808716835280861660208401525060a0604083015261467d60a08301856145cf565b828103606084015261468f81856145cf565b838103608090940193909352508152602001949350505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152611a7460a0830184614609565b602081526000611e4260208301846145cf565b60608152600061470760608301866145cf565b828103602084015261471981866145cf565b9150506001600160a01b0383166040830152949350505050565b60a08152600061474660a08301886145cf565b828103602084015261475881886145cf565b9050828103604084015261476c81876145cf565b9050828103606084015261478081866145cf565b9150506001600160a01b03831660808301529695505050505050565b602081526000611e426020830184614609565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561480e5761480e614920565b604052919050565b600082198211156148295761482961490a565b500190565b60008160001904831182151516156148485761484861490a565b500290565b60008282101561485f5761485f61490a565b500390565b60005b8381101561487f578181015183820152602001614867565b8381111561488e576000848401525b50505050565b600181811c908216806148a857607f821691505b602082108114156148c957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156148e3576148e361490a565b5060010190565b60008261490557634e487b7160e01b81526012600452602481fd5b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146124c657600080fd5b80151581146124c657600080fdfea2646970667358221220e5328ca19483f2e306655c61a643e2234f71818f508499b11f8d17346ecf87fe64736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103575760003560e01c806379309658116101c8578063d0ebdbe711610104578063e9ec2e99116100a2578063f2fde38b1161007c578063f2fde38b146107cd578063f7fce334146107e0578063fcc0e381146107ea578063feb8eba5146107ff57600080fd5b8063e9ec2e991461077a578063f1d20dd414610782578063f23a6e611461079557600080fd5b8063d9d98ce4116100de578063d9d98ce414610708578063dd62ed3e1461071b578063e0a8b97a14610754578063e78458c41461076757600080fd5b8063d0ebdbe7146106cf578063d6ee4a93146106e2578063d8a06f73146106f557600080fd5b8063a457c2d711610171578063bc197c811161014b578063bc197c8114610669578063c3cb8c14146106a1578063c4a0db96146106a9578063cec10c11146106bc57600080fd5b8063a457c2d714610630578063a9059cbb14610643578063b10402ea1461065657600080fd5b80638f878a43116101a25780638f878a431461060257806395d89b41146106155780639d54def61461061d57600080fd5b806379309658146105c85780638c850814146105de5780638da5cb5b146105f157600080fd5b80633d5d190c1161029757806354fd4d5011610240578063613255ab1161021a578063613255ab146105715780636b948a351461058457806370a0823114610597578063715018a6146105c057600080fd5b806354fd4d50146105125780635877aee61461054b5780635cffe9de1461055e57600080fd5b8063481c6a7511610271578063481c6a75146104e25780634a6e97ab146104f557806354f78d7f146104ff57600080fd5b80633d5d190c146104a857806344b28d59146104bb57806345a0b652146104cf57600080fd5b806318160ddd1161030457806325705d8d116102de57806325705d8d14610468578063313ce5671461047d57806333194c0a1461048c578063395093511461049557600080fd5b806318160ddd146104225780631ba46cfd1461042a57806323b872dd1461045557600080fd5b8063095ea7b311610335578063095ea7b3146103a757806313966db5146103ba578063150b7a02146103d257600080fd5b806301ffc9a71461035c57806306f26dc21461038457806306fdde0314610392575b600080fd5b61036f61036a366004614355565b610809565b60405190151581526020015b60405180910390f35b6101045461036f9060ff1681565b61039a610872565b60405161037b919061479c565b61036f6103b5366004614079565b610904565b6103c46101015481565b60405190815260200161037b565b6104096103e0366004613fa8565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040516001600160e01b0319909116815260200161037b565b6067546103c4565b60fd5461043d906001600160a01b031681565b6040516001600160a01b03909116815260200161037b565b61036f610463366004613f68565b61091a565b6104706109e5565b60405161037b91906146e1565b6040516012815260200161037b565b6103c460fb5481565b61036f6104a3366004614079565b610aa6565b6103c46104b63660046140a4565b610add565b6101045461036f9062010000900460ff1681565b6103c46104dd36600461448e565b610b57565b60fc5461043d906001600160a01b031681565b6104fd610b65565b005b6104fd61050d3660046142fe565b610e4f565b60408051808201909152600681527f76312e302e350000000000000000000000000000000000000000000000000000602082015261039a565b61043d61055936600461452d565b610f3b565b61036f61056c36600461437d565b611150565b6103c461057f366004613e4e565b611168565b6101045461036f90610100900460ff1681565b6103c46105a5366004613e4e565b6001600160a01b031660009081526065602052604090205490565b6104fd611190565b6101045461036f90640100000000900460ff1681565b6104706105ec36600461424b565b611234565b6033546001600160a01b031661043d565b60ff5461043d906001600160a01b031681565b61039a6113ea565b61047061062b3660046144f0565b6113f9565b61036f61063e366004614079565b611584565b61036f610651366004614079565b611637565b6103c46106643660046141d6565b611644565b610409610677366004613ebe565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b6104fd611790565b6104706106b73660046144a6565b61179c565b6104fd6106ca3660046145a4565b6117e5565b6104fd6106dd366004613e4e565b611976565b6104706106f036600461410d565b6119d2565b60fe5461043d906001600160a01b031681565b6103c4610716366004614079565b611a7f565b6103c4610729366004613e86565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b6104fd610762366004614392565b611ae2565b6104fd6107753660046143f3565b611af8565b6103c4611d65565b61036f6107903660046141a3565b611d77565b6104096107a3366004614012565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b6104fd6107db366004613e4e565b611e49565b6103c46101025481565b6101045461036f906301000000900460ff1681565b6103c46101035481565b60006001600160e01b031982167f4e2312e000000000000000000000000000000000000000000000000000000000148061086c57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b60606068805461088190614894565b80601f01602080910402602001604051908101604052809291908181526020018280546108ad90614894565b80156108fa5780601f106108cf576101008083540402835291602001916108fa565b820191906000526020600020905b8154815290600101906020018083116108dd57829003601f168201915b5050505050905090565b6000610911338484611f7b565b50600192915050565b60006109278484846120d4565b6001600160a01b0384166000908152606660209081526040808320338452909152902054828110156109c65760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e636500000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6109da85336109d5868561484d565b611f7b565b506001949350505050565b606060006109f46101056122f5565b905060008167ffffffffffffffff811115610a1f57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610a48578160200160208202803683370190505b50905060005b82811015610a9f57610a62610105826122ff565b828281518110610a8257634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610a97816148cf565b915050610a4e565b5092915050565b3360008181526066602090815260408083206001600160a01b038716845290915281205490916109119185906109d5908690614816565b6000610b4e85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808902828101820190935288825290935088925087918291850190849080828437600092019190915250339250611644915050565b95945050505050565b600061086c610105836122ff565b73dea9196dcdd2173d6e369c2acc0facc83fd9346a3314610bc85760405162461bcd60e51b815260206004820152600860248201527f4e6f74206175746800000000000000000000000000000000000000000000000060448201526064016109bd565b60fe5460408051630d43e8ad60e01b815290516000926001600160a01b031691630d43e8ad916004808301926020929190829003018186803b158015610c0d57600080fd5b505afa158015610c21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c459190613e6a565b90506000816001600160a01b0316639bf1401c6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610c8457600080fd5b505af1158015610c98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbc9190613e6a565b60fb546040517fb6ac500c00000000000000000000000000000000000000000000000000000000815260048101829052919250906000906001600160a01b0384169063b6ac500c9060240160206040518083038186803b158015610d1f57600080fd5b505afa158015610d33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d579190613e6a565b90506000610d7a826001600160a01b031660009081526065602052604090205490565b7340d73df4f99bae688ce3c23a01022224fe16c7b2600081815260656020527fc63e0bad271f921fabd0869dff2d3752e6d1aff80607864b408cbe5669e3c83d54929350909190610dcb8285614816565b11610e1a5760405162461bcd60e51b81526004016109bd9060208082526004908201527f5a65726f00000000000000000000000000000000000000000000000000000000604082015260600190565b73701f373df763308d96d8537822e8f9b2bae4e847610e3a8582866120d4565b610e458382846120d4565b5050505050505050565b610e5761230b565b610104805463ffff000019166201000085151590810263ff0000001916919091176301000000851515021764ff00000000191664010000000084151502179091556040519081527fc604be2f834727754dc1ec1225c14d1ecde48e7d12fa7b745dfb137a3db998bd9060200160405180910390a160405182151581527f835d9397f97f5df575f718046bb3e918f911d39d7edfa79aa8d40ddc7d5ce2a59060200160405180910390a160405181151581527f64b60f32742df47d4ccb5b31ca12fee1bc20695467bfe8fa058b00ec446c1563906020015b60405180910390a1505050565b6000610f4561230b565b60ff546001600160a01b031615610fc45760405162461bcd60e51b815260206004820152602260248201527f4e4654585661756c743a20656c69676962696c69747920616c7265616479207360448201527f657400000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b60fe54604080517f14c77faa00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916314c77faa916004808301926020929190829003018186803b15801561102257600080fd5b505afa158015611036573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105a9190613e6a565b90506000816001600160a01b031663576ff9088787876040518463ffffffff1660e01b815260040161108e939291906147af565b602060405180830381600087803b1580156110a857600080fd5b505af11580156110bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e09190613e6a565b60ff80546001600160a01b0319166001600160a01b038316908117909155610104805461ff00191690556040805189815260208101929092529192507fe14c63b3d4272158635bee1d1b95b51bb8de042ee95a15cbfaf2865b4d0af811910160405180910390a195945050505050565b600061115c60046123cf565b610b4e858585856124c9565b60006001600160a01b038216301461118157600061086c565b60675461086c9060001961484d565b6033546001600160a01b031633146111ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109bd565b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b6060600260c95414156112895760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109bd565b600260c95561129860036123cf565b6101045462010000900460ff1680156112d05750610104546301000000900460ff16806112d0575061010454640100000000900460ff165b61131c5760405162461bcd60e51b815260206004820181905260248201527f4e4654585661756c743a204d696e7420262052656465656d20656e61626c656460448201526064016109bd565b600061132886866126ed565b90506000845182611339919061484d565b61010254611347919061482e565b855161010354611357919061482e565b6113619190614816565b90506000818361010154611375919061482e565b61137f9190614816565b905061138b3382612972565b6000611398848888612b1b565b90507f66982ed4a058811a8004bdcec9adcb3671f2b4f1a788667a3a74959d7c09af3c898989848a6040516113d1959493929190614733565b60405180910390a1600160c95598975050505050505050565b60606069805461088190614894565b6060600260c954141561144e5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109bd565b600260c981905561145e906123cf565b610104546301000000900460ff1680611482575061010454640100000000900460ff165b6114ce5760405162461bcd60e51b815260206004820152601560248201527f52656465656d696e67206e6f7420656e61626c6564000000000000000000000060448201526064016109bd565b6114e9336114e486670de0b6b3a764000061482e565b612e0b565b60008351856114f8919061484d565b61010254611506919061482e565b845161010354611516919061482e565b6115209190614816565b905061152c3382612972565b6000611539868686612b1b565b90507f63b13f6307f284441e029836b0c22eb91eb62a7ad555670061157930ce884f4e81868660405161156e939291906146f4565b60405180910390a1600160c95595945050505050565b3360009081526066602090815260408083206001600160a01b03861684529091528120548281101561161e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016109bd565b61162d33856109d5868561484d565b5060019392505050565b60006109113384846120d4565b6000600260c95414156116995760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109bd565b600260c9556116a860016123cf565b6101045462010000900460ff166117015760405162461bcd60e51b815260206004820152601360248201527f4d696e74696e67206e6f7420656e61626c65640000000000000000000000000060448201526064016109bd565b600061170d85856126ed565b905061172a8361172583670de0b6b3a764000061482e565b612f91565b6000816101015461173b919061482e565b90506117478482612972565b7f1f72ad2a14447fa756b6f5aca53504645af79813493aca2d906b69e4aaeb949286868660405161177a939291906146f4565b60405180910390a150600160c955949350505050565b61179a6000611976565b565b60606117dd848484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152503392506113f9915050565b949350505050565b6117ed61230b565b670de0b6b3a76400008311156118385760405162461bcd60e51b815260206004820152601060248201526f21b0b73737ba101f10189032ba3432b960811b60448201526064016109bd565b670de0b6b3a76400008211156118835760405162461bcd60e51b815260206004820152601060248201526f21b0b73737ba101f10189032ba3432b960811b60448201526064016109bd565b670de0b6b3a76400008111156118ce5760405162461bcd60e51b815260206004820152601060248201526f21b0b73737ba101f10189032ba3432b960811b60448201526064016109bd565b6101018390556101028290556101038190556040518381527f38fbb1c8b109c430f0c030e7ed076cf5611a307773a4e8e365601e8f8bceaec69060200160405180910390a16040518281527fba745d4fd094af690af401897448edc81084d2a0f10fd90cd608be663c68905f9060200160405180910390a16040518181527fb9941a503692be6effbff47d4a5c63e74d003c710f0e4d5bd6ccc552ec9c7e4390602001610f2e565b61197e61230b565b60fc80546001600160a01b0319166001600160a01b0383169081179091556040519081527f60a0f5b9f9e81e98216071b85826681c796256fe3d1354ecb675580fba64fa699060200160405180910390a150565b6060611a7487878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808b0282810182019093528a82529093508a92508991829185019084908082843760009201919091525050604080516020808a02828101820190935289825290935089925088918291850190849080828437600092019190915250339250611234915050565b979650505050505050565b60006001600160a01b0383163014611ad95760405162461bcd60e51b815260206004820152601b60248201527f4552433230466c6173684d696e743a2077726f6e6720746f6b656e000000000060448201526064016109bd565b50600092915050565b611aea61230b565b611af48282613070565b5050565b600054610100900460ff1680611b11575060005460ff16155b611b745760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109bd565b600054610100900460ff16158015611b96576000805461ffff19166101011790555b611b9e61309c565b611ba8868661315e565b6001600160a01b038416611bfe5760405162461bcd60e51b815260206004820152601360248201527f417373657420213d20616464726573732830290000000000000000000000000060448201526064016109bd565b60fd80546001600160a01b03199081166001600160a01b0387161790915560fe805433921682179055604080517f264a6208000000000000000000000000000000000000000000000000000000008152905163264a620891600480820192602092909190829003018186803b158015611c7657600080fd5b505afa158015611c8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cae919061433d565b60fb8190556101048054841515610100810261ff001988151590811661ffff199094169390931717909255604080516001600160a01b038916815260208101929092528101919091527f18ecce5c418b882a3d89e5b6cc8100dc3383309b8e78525266fe1283a7f934d69060600160405180910390a2611d316001806001610e4f565b611d4b66b1a2bc2ec50000600066b1a2bc2ec500006117e5565b8015611d5d576000805461ff00191690555b505050505050565b6000611d726101056122f5565b905090565b61010454600090610100900460ff1615611d9357506001919050565b60ff546001600160a01b031680611dad5750600092915050565b6040517f84ca9f850000000000000000000000000000000000000000000000000000000081526001600160a01b038216906384ca9f8590611df29086906004016146e1565b60206040518083038186803b158015611e0a57600080fd5b505afa158015611e1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4291906142e2565b9392505050565b6033546001600160a01b03163314611ea35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109bd565b6001600160a01b038116611f1f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109bd565b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611ff65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b0382166120725760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b0383811660008181526066602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166121505760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b0382166121cc5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b0383166000908152606560205260409020548181101561225b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016109bd565b612265828261484d565b6001600160a01b03808616600090815260656020526040808220939093559085168152908120805484929061229b908490614816565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516122e791815260200190565b60405180910390a350505050565b600061086c825490565b6000611e428383613224565b60fc546001600160a01b0316612375576033546001600160a01b0316331461179a5760405162461bcd60e51b815260206004820152600960248201527f4e6f74206f776e6572000000000000000000000000000000000000000000000060448201526064016109bd565b60fc546001600160a01b0316331461179a5760405162461bcd60e51b815260206004820152600b60248201527f4e6f74206d616e6167657200000000000000000000000000000000000000000060448201526064016109bd565b60fe546040517ff6aacfb1000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063f6aacfb19060240160206040518083038186803b15801561242c57600080fd5b505afa158015612440573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246491906142e2565b158061247a57506033546001600160a01b031633145b6124c65760405162461bcd60e51b815260206004820152600660248201527f506175736564000000000000000000000000000000000000000000000000000060448201526064016109bd565b50565b6000806124d68585611a7f565b90506124e28685612f91565b6040517f23e30c8b0000000000000000000000000000000000000000000000000000000081527f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9906001600160a01b038816906323e30c8b906125519033908a908a9088908b906004016146a9565b602060405180830381600087803b15801561256b57600080fd5b505af115801561257f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125a3919061433d565b146126155760405162461bcd60e51b8152602060048201526024808201527f4552433230466c6173684d696e743a20696e76616c69642072657475726e207660448201527f616c75650000000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b03861660009081526066602090815260408083203084529091529020546126438286614816565b8110156126b85760405162461bcd60e51b815260206004820152602f60248201527f4552433230466c6173684d696e743a20616c6c6f77616e636520646f6573206e60448201527f6f7420616c6c6f7720726566756e64000000000000000000000000000000000060648201526084016109bd565b6126d28730846126c8898661484d565b6109d5919061484d565b6126e0876114e48488614816565b5060019695505050505050565b60006126f883611d77565b6127445760405162461bcd60e51b815260206004820152601760248201527f4e4654585661756c743a206e6f7420656c696769626c6500000000000000000060448201526064016109bd565b6101045460ff16156128f85760fd546040517f2eb2c2d60000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690632eb2c2d69061279f903390309088908890600401614651565b600060405180830381600087803b1580156127b957600080fd5b505af11580156127cd573d6000803e3d6000fd5b5060009250829150505b84518110156128f057600085828151811061280257634e487b7160e01b600052603260045260246000fd5b60200260200101519050600085838151811061282e57634e487b7160e01b600052603260045260246000fd5b60200260200101519050600081116128885760405162461bcd60e51b815260206004820152601b60248201527f4e4654585661756c743a207472616e7366657272696e67203c2031000000000060448201526064016109bd565b600082815261010760205260409020546128aa576128a86101058361325c565b505b60008281526101076020526040812080548392906128c9908490614816565b909155506128d990508185614816565b9350505080806128e8906148cf565b9150506127d7565b50905061086c565b60fd546001600160a01b031660005b845181101561296757600085828151811061293257634e487b7160e01b600052603260045260246000fd5b602002602001015190506129468382613268565b6129526101058261325c565b5050808061295f906148cf565b915050612907565b50835191505061086c565b60fe546040517fdbe66ca00000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b039091169063dbe66ca09060240160206040518083038186803b1580156129ce57600080fd5b505afa1580156129e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0691906142e2565b15612a0f575050565b8015611af45760fe5460408051630d43e8ad60e01b815290516000926001600160a01b031691630d43e8ad916004808301926020929190829003018186803b158015612a5a57600080fd5b505afa158015612a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a929190613e6a565b9050612a9f8382846120d4565b60fb546040517f91c05b0b00000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b038216906391c05b0b90602401600060405180830381600087803b158015612afe57600080fd5b505af1158015612b12573d6000803e3d6000fd5b50505050505050565b60608251841480612b365750610104546301000000900460ff165b612b8e5760405162461bcd60e51b8152602060048201526024808201527f4e4654585661756c743a2052616e646f6d2072656465656d206e6f7420656e61604482015263189b195960e21b60648201526084016109bd565b82511580612ba7575061010454640100000000900460ff165b612bff5760405162461bcd60e51b8152602060048201526024808201527f4e4654585661756c743a205461726765742072656465656d206e6f7420656e61604482015263189b195960e21b60648201526084016109bd565b6101045460fd5460ff909116906001600160a01b031660008667ffffffffffffffff811115612c3e57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612c67578160200160208202803683370190505b50905060005b87811015612df757600087518210612c8c57612c8761357b565b612cb5565b878281518110612cac57634e487b7160e01b600052603260045260246000fd5b60200260200101515b905080838381518110612cd857634e487b7160e01b600052603260045260246000fd5b6020026020010181815250508415612dcc57600081815261010760205260408120805460019290612d0a90849061484d565b909155505060008181526101076020526040902054612d3157612d2f6101058261361f565b505b6040517ff242432a0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038881166024830152604482018390526001606483015260a06084830152600060a483015285169063f242432a9060c401600060405180830381600087803b158015612daf57600080fd5b505af1158015612dc3573d6000803e3d6000fd5b50505050612de4565b612dd86101058261361f565b50612de484888361362b565b5080612def816148cf565b915050612c6d565b50612e0181613807565b9695505050505050565b6001600160a01b038216612e875760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b6001600160a01b03821660009081526065602052604090205481811015612f165760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016109bd565b612f20828261484d565b6001600160a01b03841660009081526065602052604081209190915560678054849290612f4e90849061484d565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016120c7565b6001600160a01b038216612fe75760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016109bd565b8060676000828254612ff99190614816565b90915550506001600160a01b03821660009081526065602052604081208054839290613026908490614816565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b8151613083906068906020850190613c7d565b508051613097906069906020840190613c7d565b505050565b600054610100900460ff16806130b5575060005460ff16155b6131185760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109bd565b600054610100900460ff1615801561313a576000805461ffff19166101011790555b61314261388f565b61314a613940565b80156124c6576000805461ff001916905550565b600054610100900460ff1680613177575060005460ff16155b6131da5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109bd565b600054610100900460ff161580156131fc576000805461ffff19166101011790555b61320461388f565b61320e8383613a35565b8015613097576000805461ff0019169055505050565b600082600001828154811061324957634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6000611e428383613b11565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038516831415613308576040513360248201523060448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b03167f23b872dd0000000000000000000000000000000000000000000000000000000017905290506134f9565b816001600160a01b0316856001600160a01b031614156134b35760008460405160240161333791815260200190565b60408051601f198184030181529181526020820180516001600160e01b03167f58178168000000000000000000000000000000000000000000000000000000001790525190915060009081906001600160a01b03891690613399908590614635565b600060405180830381855afa9150503d80600081146133d4576040519150601f19603f3d011682016040523d82523d6000602084013e6133d9565b606091505b50915091506000818060200190518101906133f49190613e6a565b905082801561340b57506001600160a01b03811633145b6134575760405162461bcd60e51b815260206004820152600d60248201527f4e6f7420746865206f776e65720000000000000000000000000000000000000060448201526064016109bd565b6040516024810189905260440160408051601f198184030181529190526020810180516001600160e01b03167f8264fe980000000000000000000000000000000000000000000000000000000017905294506134f99350505050565b6040513360248201523060448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b0316632142170760e11b17905290505b600080866001600160a01b0316836040516135149190614635565b6000604051808303816000865af19150503d8060008114613551576040519150601f19603f3d011682016040523d82523d6000602084013e613556565b606091505b5091509150818190610e455760405162461bcd60e51b81526004016109bd919061479c565b6000806135896101056122f5565b61359460014361484d565b61010054604080519240602084015282015241606090811b6bffffffffffffffffffffffff19169082015244607482015242609482015260b4016040516020818303038152906040528051906020012060001c6135f191906148ea565b9050600161010060008282546136079190614816565b909155506136199050610105826122ff565b91505090565b6000611e428383613b60565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b0386168314156136ce576040516001600160a01b03861660248201526044810185905260640160408051601f198184030181529190526020810180516001600160e01b03167fa9059cbb00000000000000000000000000000000000000000000000000000000179052905061379d565b816001600160a01b0316866001600160a01b0316141561374e576040516001600160a01b03861660248201526044810185905260640160408051601f198184030181529190526020810180516001600160e01b03167f8b72a2ec00000000000000000000000000000000000000000000000000000000179052905061379d565b6040513060248201526001600160a01b03861660448201526064810185905260840160408051601f198184030181529190526020810180516001600160e01b0316632142170760e11b17905290505b6000866001600160a01b0316826040516137b79190614635565b6000604051808303816000865af19150503d80600081146137f4576040519150601f19603f3d011682016040523d82523d6000602084013e6137f9565b606091505b5050905080612b1257600080fd5b60ff546001600160a01b03168061381c575050565b6040517f5e2f9b520000000000000000000000000000000000000000000000000000000081526001600160a01b03821690635e2f9b52906138619085906004016146e1565b600060405180830381600087803b15801561387b57600080fd5b505af1158015611d5d573d6000803e3d6000fd5b600054610100900460ff16806138a8575060005460ff16155b61390b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109bd565b600054610100900460ff1615801561314a576000805461ffff191661010117905580156124c6576000805461ff001916905550565b600054610100900460ff1680613959575060005460ff16155b6139bc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109bd565b600054610100900460ff161580156139de576000805461ffff19166101011790555b603380546001600160a01b0319163390811790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156124c6576000805461ff001916905550565b600054610100900460ff1680613a4e575060005460ff16155b613ab15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109bd565b600054610100900460ff16158015613ad3576000805461ffff19166101011790555b8251613ae6906068906020860190613c7d565b508151613afa906069906020850190613c7d565b508015613097576000805461ff0019169055505050565b6000818152600183016020526040812054613b585750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561086c565b50600061086c565b60008181526001830160205260408120548015613c73576000613b8460018361484d565b8554909150600090613b989060019061484d565b9050818114613c19576000866000018281548110613bc657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110613bf757634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613c3857634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061086c565b600091505061086c565b828054613c8990614894565b90600052602060002090601f016020900481019282613cab5760008555613cf1565b82601f10613cc457805160ff1916838001178555613cf1565b82800160010185558215613cf1579182015b82811115613cf1578251825591602001919060010190613cd6565b50613cfd929150613d01565b5090565b5b80821115613cfd5760008155600101613d02565b60008083601f840112613d27578182fd5b50813567ffffffffffffffff811115613d3e578182fd5b6020830191508360208260051b8501011115613d5957600080fd5b9250929050565b600082601f830112613d70578081fd5b8135602067ffffffffffffffff821115613d8c57613d8c614920565b8160051b613d9b8282016147e5565b838152828101908684018388018501891015613db5578687fd5b8693505b85841015613dd7578035835260019390930192918401918401613db9565b50979650505050505050565b600082601f830112613df3578081fd5b813567ffffffffffffffff811115613e0d57613e0d614920565b613e20601f8201601f19166020016147e5565b818152846020838601011115613e34578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215613e5f578081fd5b8135611e4281614936565b600060208284031215613e7b578081fd5b8151611e4281614936565b60008060408385031215613e98578081fd5b8235613ea381614936565b91506020830135613eb381614936565b809150509250929050565b600080600080600060a08688031215613ed5578081fd5b8535613ee081614936565b94506020860135613ef081614936565b9350604086013567ffffffffffffffff80821115613f0c578283fd5b613f1889838a01613d60565b94506060880135915080821115613f2d578283fd5b613f3989838a01613d60565b93506080880135915080821115613f4e578283fd5b50613f5b88828901613de3565b9150509295509295909350565b600080600060608486031215613f7c578283fd5b8335613f8781614936565b92506020840135613f9781614936565b929592945050506040919091013590565b60008060008060808587031215613fbd578384fd5b8435613fc881614936565b93506020850135613fd881614936565b925060408501359150606085013567ffffffffffffffff811115613ffa578182fd5b61400687828801613de3565b91505092959194509250565b600080600080600060a08688031215614029578283fd5b853561403481614936565b9450602086013561404481614936565b93506040860135925060608601359150608086013567ffffffffffffffff81111561406d578182fd5b613f5b88828901613de3565b6000806040838503121561408b578182fd5b823561409681614936565b946020939093013593505050565b600080600080604085870312156140b9578182fd5b843567ffffffffffffffff808211156140d0578384fd5b6140dc88838901613d16565b909650945060208701359150808211156140f4578384fd5b5061410187828801613d16565b95989497509550505050565b60008060008060008060608789031215614125578384fd5b863567ffffffffffffffff8082111561413c578586fd5b6141488a838b01613d16565b90985096506020890135915080821115614160578586fd5b61416c8a838b01613d16565b90965094506040890135915080821115614184578283fd5b5061419189828a01613d16565b979a9699509497509295939492505050565b6000602082840312156141b4578081fd5b813567ffffffffffffffff8111156141ca578182fd5b6117dd84828501613d60565b6000806000606084860312156141ea578081fd5b833567ffffffffffffffff80821115614201578283fd5b61420d87838801613d60565b94506020860135915080821115614222578283fd5b5061422f86828701613d60565b925050604084013561424081614936565b809150509250925092565b60008060008060808587031215614260578182fd5b843567ffffffffffffffff80821115614277578384fd5b61428388838901613d60565b95506020870135915080821115614298578384fd5b6142a488838901613d60565b945060408701359150808211156142b9578384fd5b506142c687828801613d60565b92505060608501356142d781614936565b939692955090935050565b6000602082840312156142f3578081fd5b8151611e428161494b565b600080600060608486031215614312578081fd5b833561431d8161494b565b9250602084013561432d8161494b565b915060408401356142408161494b565b60006020828403121561434e578081fd5b5051919050565b600060208284031215614366578081fd5b81356001600160e01b031981168114611e42578182fd5b60008060008060808587031215613fbd578182fd5b600080604083850312156143a4578182fd5b823567ffffffffffffffff808211156143bb578384fd5b6143c786838701613de3565b935060208501359150808211156143dc578283fd5b506143e985828601613de3565b9150509250929050565b600080600080600060a0868803121561440a578283fd5b853567ffffffffffffffff80821115614421578485fd5b61442d89838a01613de3565b96506020880135915080821115614442578485fd5b5061444f88828901613de3565b945050604086013561446081614936565b925060608601356144708161494b565b915060808601356144808161494b565b809150509295509295909350565b60006020828403121561449f578081fd5b5035919050565b6000806000604084860312156144ba578081fd5b83359250602084013567ffffffffffffffff8111156144d7578182fd5b6144e386828701613d16565b9497909650939450505050565b600080600060608486031215614504578081fd5b83359250602084013567ffffffffffffffff811115614521578182fd5b61422f86828701613d60565b600080600060408486031215614541578081fd5b83359250602084013567ffffffffffffffff8082111561455f578283fd5b818601915086601f830112614572578283fd5b813581811115614580578384fd5b876020828501011115614591578384fd5b6020830194508093505050509250925092565b6000806000606084860312156145b8578081fd5b505081359360208301359350604090920135919050565b6000815180845260208085019450808401835b838110156145fe578151875295820195908201906001016145e2565b509495945050505050565b60008151808452614621816020860160208601614864565b601f01601f19169290920160200192915050565b60008251614647818460208701614864565b9190910192915050565b60006001600160a01b03808716835280861660208401525060a0604083015261467d60a08301856145cf565b828103606084015261468f81856145cf565b838103608090940193909352508152602001949350505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152611a7460a0830184614609565b602081526000611e4260208301846145cf565b60608152600061470760608301866145cf565b828103602084015261471981866145cf565b9150506001600160a01b0383166040830152949350505050565b60a08152600061474660a08301886145cf565b828103602084015261475881886145cf565b9050828103604084015261476c81876145cf565b9050828103606084015261478081866145cf565b9150506001600160a01b03831660808301529695505050505050565b602081526000611e426020830184614609565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561480e5761480e614920565b604052919050565b600082198211156148295761482961490a565b500190565b60008160001904831182151516156148485761484861490a565b500290565b60008282101561485f5761485f61490a565b500390565b60005b8381101561487f578181015183820152602001614867565b8381111561488e576000848401525b50505050565b600181811c908216806148a857607f821691505b602082108114156148c957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156148e3576148e361490a565b5060010190565b60008261490557634e487b7160e01b81526012600452602481fd5b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146124c657600080fd5b80151581146124c657600080fdfea2646970667358221220e5328ca19483f2e306655c61a643e2234f71818f508499b11f8d17346ecf87fe64736f6c63430008040033
Deployed Bytecode Sourcemap
66861:18549:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42140:269;;;;;;:::i;:::-;;:::i;:::-;;;23565:14:1;;23558:22;23540:41;;23528:2;23513:18;42140:269:0;;;;;;;;67580:27;;;;;;;;;24292:100;;;:::i;:::-;;;;;;;:::i;26459:169::-;;;;;;:::i;:::-;;:::i;67448:31::-;;;;;;;;;37144:25:1;;;37132:2;37117:18;67448:31:0;37099:76:1;38131:216:0;;;;;;:::i;:::-;38309:30;38131:216;;;;;;;;;;-1:-1:-1;;;;;;23754:79:1;;;23736:98;;23724:2;23709:18;38131:216:0;23691:149:1;25412:108:0;25500:12;;25412:108;;67268:36;;;;;-1:-1:-1;;;;;67268:36:0;;;;;;-1:-1:-1;;;;;18204:55:1;;;18186:74;;18174:2;18159:18;67268:36:0;18141:125:1;27110:422:0;;;;;;:::i;:::-;;:::i;77720:310::-;;;:::i;:::-;;;;;;;:::i;25254:93::-;;;25337:2;38091:36:1;;38079:2;38064:18;25254:93:0;38046:87:1;67192:31:0;;;;;;27941:215;;;;;;:::i;:::-;;:::i;73230:235::-;;;;;;:::i;:::-;;:::i;67655:31::-;;;;;;;;;;;;77546:141;;;;;;:::i;:::-;;:::i;67230:31::-;;;;;-1:-1:-1;;;;;67230:31:0;;;72258:964;;;:::i;:::-;;69063:498;;;;;;:::i;:::-;;:::i;78213:91::-;78281:15;;;;;;;;;;;;;;;;;78213:91;;70463:835;;;;;;:::i;:::-;;:::i;76784:297::-;;;;;;:::i;:::-;;:::i;34166:164::-;;;;;;:::i;:::-;;:::i;67614:34::-;;;;;;;;;;;;25583:127;;;;;;:::i;:::-;-1:-1:-1;;;;;25684:18:0;25657:7;25684:18;;;:9;:18;;;;;;;25583:127;53691:148;;;:::i;67739:39::-;;;;;;;;;;;;75520:1256;;;;;;:::i;:::-;;:::i;53040:87::-;53113:6;;-1:-1:-1;;;;;53113:6:0;53040:87;;67364:51;;;;;-1:-1:-1;;;;;67364:51:0;;;24511:104;;;:::i;74322:880::-;;;;;;:::i;:::-;;:::i;28659:377::-;;;;;;:::i;:::-;;:::i;25923:175::-;;;;;;:::i;:::-;;:::i;73473:608::-;;;;;;:::i;:::-;;:::i;42837:212::-;;;;;;:::i;:::-;43005:36;42837:212;;;;;;;;68736:92;;;:::i;74089:225::-;;;;;;:::i;:::-;;:::i;69569:637::-;;;;;;:::i;:::-;;:::i;72088:162::-;;;;;;:::i;:::-;;:::i;75214:298::-;;;;;;:::i;:::-;;:::i;67311:46::-;;;;;-1:-1:-1;;;;;67311:46:0;;;34729:297;;;;;;:::i;:::-;;:::i;26161:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;26277:18:0;;;26250:7;26277:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;26161:151;68861:194;;;;;;:::i;:::-;;:::i;67884:844::-;;;;;;:::i;:::-;;:::i;78063:117::-;;;:::i;77089:449::-;;;;;;:::i;:::-;;:::i;42645:184::-;;;;;;:::i;:::-;42790:31;42645:184;;;;;;;;53994:244;;;;;;:::i;:::-;;:::i;67486:39::-;;;;;;67693;;;;;;;;;;;;67532;;;;;;42140:269;42264:4;-1:-1:-1;;;;;;42288:60:0;;42303:45;42288:60;;:113;;-1:-1:-1;41778:36:0;-1:-1:-1;;;;;;41763:51:0;;;42365:36;42281:120;42140:269;-1:-1:-1;;42140:269:0:o;24292:100::-;24346:13;24379:5;24372:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24292:100;:::o;26459:169::-;26542:4;26559:39;21505:10;26582:7;26591:6;26559:8;:39::i;:::-;-1:-1:-1;26616:4:0;26459:169;;;;:::o;27110:422::-;27216:4;27233:36;27243:6;27251:9;27262:6;27233:9;:36::i;:::-;-1:-1:-1;;;;;27309:19:0;;27282:24;27309:19;;;:11;:19;;;;;;;;21505:10;27309:33;;;;;;;;27361:26;;;;27353:79;;;;-1:-1:-1;;;27353:79:0;;31499:2:1;27353:79:0;;;31481:21:1;31538:2;31518:18;;;31511:30;31577:34;31557:18;;;31550:62;31648:10;31628:18;;;31621:38;31676:19;;27353:79:0;;;;;;;;;27443:57;27452:6;21505:10;27474:25;27493:6;27474:16;:25;:::i;:::-;27443:8;:57::i;:::-;-1:-1:-1;27520:4:0;;27110:422;-1:-1:-1;;;;27110:422:0:o;77720:310::-;77783:16;77812:11;77826:17;:8;:15;:17::i;:::-;77812:31;;77854:24;77895:3;77881:18;;;;;;-1:-1:-1;;;77881:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;77881:18:0;;77854:45;;77915:9;77910:88;77934:3;77930:1;:7;77910:88;;;77972:14;:8;77984:1;77972:11;:14::i;:::-;77959:7;77967:1;77959:10;;;;;;-1:-1:-1;;;77959:10:0;;;;;;;;;;;;;;;;;;:27;77939:3;;;;:::i;:::-;;;;77910:88;;;-1:-1:-1;78015:7:0;77720:310;-1:-1:-1;;77720:310:0:o;27941:215::-;21505:10;28029:4;28078:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;28078:34:0;;;;;;;;;;28029:4;;28046:80;;28069:7;;28078:47;;28115:10;;28078:47;:::i;73230:235::-;73393:7;73420:37;73427:8;;73420:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;73420:37:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73437:7:0;;-1:-1:-1;73437:7:0;;;;73420:37;;;73437:7;;73420:37;73437:7;73420:37;;;;;;;;;-1:-1:-1;73446:10:0;;-1:-1:-1;73420:6:0;;-1:-1:-1;;73420:37:0:i;:::-;73413:44;73230:235;-1:-1:-1;;;;;73230:235:0:o;77546:141::-;77626:7;77653:26;:8;77665:13;77653:11;:26::i;72258:964::-;72323:42;72309:10;:56;72301:94;;;;-1:-1:-1;;;72301:94:0;;32962:2:1;72301:94:0;;;32944:21:1;33001:1;32981:18;;;32974:29;33039:10;33019:18;;;33012:38;33067:18;;72301:94:0;32934:157:1;72301:94:0;72428:12;;:29;;;-1:-1:-1;;;72428:29:0;;;;72406:19;;-1:-1:-1;;;;;72428:12:0;;:27;;:29;;;;;;;;;;;;;;:12;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72406:51;;72468:17;72508:11;-1:-1:-1;;;;;72488:42:0;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72562:7;;72641:65;;;;;;;;37144:25:1;;;72468:64:0;;-1:-1:-1;72562:7:0;72543:16;;-1:-1:-1;;;;;72641:55:0;;;;;37117:18:1;;72641:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72620:86;;72717:22;72742:21;72752:10;-1:-1:-1;;;;;25684:18:0;25657:7;25684:18;;;:9;:18;;;;;;;25583:127;72742:21;72827:42;72813:11;25684:18;;;:9;:18;;;;72717:46;;-1:-1:-1;72827:42:0;;25684:18;72932:23;25684:18;72717:46;72932:23;:::i;:::-;:27;72924:44;;;;-1:-1:-1;;;72924:44:0;;;;;;27072:2:1;27054:21;;;27111:1;27091:18;;;27084:29;27149:6;27144:2;27129:18;;27122:34;27188:2;27173:18;;27044:153;72924:44:0;73065:42;73132:43;73142:10;73065:42;73160:14;73132:9;:43::i;:::-;73186:28;73196:3;73201:4;73207:6;73186:9;:28::i;:::-;72258:964;;;;;;;;:::o;69063:498::-;69228:16;:14;:16::i;:::-;69255:10;:24;;-1:-1:-1;;69290:40:0;69255:24;;;;;;;-1:-1:-1;;69290:40:0;;;;;;;;;;;-1:-1:-1;;69341:40:0;;;;;;;;;;69399:30;;23540:41:1;;;69399:30:0;;23528:2:1;23513:18;69399:30:0;;;;;;;69445:46;;23565:14:1;;23558:22;23540:41;;69445:46:0;;23528:2:1;23513:18;69445:46:0;;;;;;;69507;;23565:14:1;;23558:22;23540:41;;69507:46:0;;23528:2:1;23513:18;69507:46:0;;;;;;;;69063:498;;;:::o;70463:835::-;70603:7;70623:16;:14;:16::i;:::-;70680:18;;-1:-1:-1;;;;;70680:18:0;70672:41;70650:125;;;;-1:-1:-1;;;70650:125:0;;30325:2:1;70650:125:0;;;30307:21:1;30364:2;30344:18;;;30337:30;30403:34;30383:18;;;30376:62;30474:4;30454:18;;;30447:32;30496:19;;70650:125:0;30297:224:1;70650:125:0;70862:12;;:33;;;;;;;;70786:35;;-1:-1:-1;;;;;70862:12:0;;:31;;:33;;;;;;;;;;;;;;:12;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70786:120;;70917:20;70940:11;-1:-1:-1;;;;;70940:29:0;;70984:11;71010:8;;70940:89;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71040:18;:51;;-1:-1:-1;;;;;;71040:51:0;-1:-1:-1;;;;;71040:51:0;;;;;;;;71177:13;:21;;-1:-1:-1;;71177:21:0;;;71214:46;;;37354:25:1;;;37410:2;37395:18;;37388:83;;;;71040:51:0;;-1:-1:-1;71214:46:0;;37327:18:1;71214:46:0;;;;;;;71278:12;70463:835;-1:-1:-1;;;;;70463:835:0:o;76784:297::-;76972:4;76989:20;77007:1;76989:17;:20::i;:::-;77027:46;77043:8;77053:5;77060:6;77068:4;77027:15;:46::i;34166:164::-;34233:7;-1:-1:-1;;;;;34260:22:0;;34277:4;34260:22;:62;;34321:1;34260:62;;;25500:12;;34285:33;;-1:-1:-1;;34285:33:0;:::i;53691:148::-;53113:6;;-1:-1:-1;;;;;53113:6:0;21505:10;53260:23;53252:68;;;;-1:-1:-1;;;53252:68:0;;32253:2:1;53252:68:0;;;32235:21:1;;;32272:18;;;32265:30;32331:34;32311:18;;;32304:62;32383:18;;53252:68:0;32225:182:1;53252:68:0;53782:6:::1;::::0;53761:40:::1;::::0;53798:1:::1;::::0;-1:-1:-1;;;;;53782:6:0::1;::::0;53761:40:::1;::::0;53798:1;;53761:40:::1;53812:6;:19:::0;;-1:-1:-1;;;;;;53812:19:0::1;::::0;;53691:148::o;75520:1256::-;75752:16;56055:1;56818:7;;:19;;56810:63;;;;-1:-1:-1;;;56810:63:0;;35253:2:1;56810:63:0;;;35235:21:1;35292:2;35272:18;;;35265:30;35331:33;35311:18;;;35304:61;35382:18;;56810:63:0;35225:181:1;56810:63:0;56055:1;56951:7;:18;75781:20:::1;75799:1;75781:17;:20::i;:::-;75820:10;::::0;;;::::1;;;:56:::0;::::1;;;-1:-1:-1::0;75835:18:0::1;::::0;;;::::1;;;::::0;:40:::1;;-1:-1:-1::0;75857:18:0::1;::::0;;;::::1;;;75835:40;75812:101;;;::::0;-1:-1:-1;;;75812:101:0;;29964:2:1;75812:101:0::1;::::0;::::1;29946:21:1::0;;;29983:18;;;29976:30;30042:34;30022:18;;;30015:62;30094:18;;75812:101:0::1;29936:182:1::0;75812:101:0::1;76104:13;76120:30;76132:8;76142:7;76120:11;:30::i;:::-;76104:46;;76319:17;76422:11;:18;76414:5;:26;;;;:::i;:::-;76395:15;;:46;;;;:::i;:::-;76358:11;:18;76340:15;;:36;;;;:::i;:::-;76339:113;;;;:::i;:::-;76319:133;;76463:16;76502:9;76493:5;76483:7;;:15;;;;:::i;:::-;76482:29;;;;:::i;:::-;76463:48;;76522:46;76547:10;76559:8;76522:24;:46::i;:::-;76622:20;76645:38;76660:5;76667:11;76680:2;76645:14;:38::i;:::-;76622:61;;76699:48;76707:8;76717:7;76726:11;76739:3;76744:2;76699:48;;;;;;;;;;:::i;:::-;;;;;;;;56011:1:::0;57130:7;:22;76765:3;75520:1256;-1:-1:-1;;;;;;;;75520:1256:0:o;24511:104::-;24567:13;24600:7;24593:14;;;;;:::i;74322:880::-;74489:16;56055:1;56818:7;;:19;;56810:63;;;;-1:-1:-1;;;56810:63:0;;35253:2:1;56810:63:0;;;35235:21:1;35292:2;35272:18;;;35265:30;35331:33;35311:18;;;35304:61;35382:18;;56810:63:0;35225:181:1;56810:63:0;56055:1;56951:7;:18;;;74523:20:::1;::::0;:17:::1;:20::i;:::-;74562:18;::::0;;;::::1;;;::::0;:40:::1;;-1:-1:-1::0;74584:18:0::1;::::0;;;::::1;;;74562:40;74554:74;;;::::0;-1:-1:-1;;;74554:74:0;;29272:2:1;74554:74:0::1;::::0;::::1;29254:21:1::0;29311:2;29291:18;;;29284:30;29350:23;29330:18;;;29323:51;29391:18;;74554:74:0::1;29244:171:1::0;74554:74:0::1;74727:32;74733:10;74745:13;74752:6:::0;67177::::1;74745:13;:::i;:::-;74727:5;:32::i;:::-;74805:16;74908:11;:18;74899:6;:27;;;;:::i;:::-;74880:15;;:47;;;;:::i;:::-;74843:11;:18;74825:15;;:36;;;;:::i;:::-;74824:114;;;;:::i;:::-;74805:133;;74949:46;74974:10;74986:8;74949:24;:46::i;:::-;75041:28;75072:39;75087:6;75095:11;75108:2;75072:14;:39::i;:::-;75041:70;;75127:38;75136:11;75149;75162:2;75127:38;;;;;;;;:::i;:::-;;;;;;;;56011:1:::0;57130:7;:22;75183:11;74322:880;-1:-1:-1;;;;;74322:880:0:o;28659:377::-;21505:10;28752:4;28796:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;28796:34:0;;;;;;;;;;28849:35;;;;28841:85;;;;-1:-1:-1;;;28841:85:0;;36029:2:1;28841:85:0;;;36011:21:1;36068:2;36048:18;;;36041:30;36107:34;36087:18;;;36080:62;36178:7;36158:18;;;36151:35;36203:19;;28841:85:0;36001:227:1;28841:85:0;28937:67;21505:10;28960:7;28969:34;28988:15;28969:16;:34;:::i;28937:67::-;-1:-1:-1;29024:4:0;;28659:377;-1:-1:-1;;;28659:377:0:o;25923:175::-;26009:4;26026:42;21505:10;26050:9;26061:6;26026:9;:42::i;73473:608::-;73666:7;56055:1;56818:7;;:19;;56810:63;;;;-1:-1:-1;;;56810:63:0;;35253:2:1;56810:63:0;;;35235:21:1;35292:2;35272:18;;;35265:30;35331:33;35311:18;;;35304:61;35382:18;;56810:63:0;35225:181:1;56810:63:0;56055:1;56951:7;:18;73686:20:::1;73704:1;73686:17;:20::i;:::-;73725:10;::::0;;;::::1;;;73717:42;;;::::0;-1:-1:-1;;;73717:42:0;;32614:2:1;73717:42:0::1;::::0;::::1;32596:21:1::0;32653:2;32633:18;;;32626:30;32692:21;32672:18;;;32665:49;32731:18;;73717:42:0::1;32586:169:1::0;73717:42:0::1;73797:13;73813:30;73825:8;73835:7;73813:11;:30::i;:::-;73797:46:::0;-1:-1:-1;73886:23:0::1;73892:2:::0;73896:12:::1;73797:46:::0;67177:6:::1;73896:12;:::i;:::-;73886:5;:23::i;:::-;73920:16;73949:5;73939:7;;:15;;;;:::i;:::-;73920:34;;73965:38;73990:2;73994:8;73965:24;:38::i;:::-;74021:29;74028:8;74038:7;74047:2;74021:29;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;56011:1:0;57130:7;:22;74068:5;73473:608;-1:-1:-1;;;;73473:608:0:o;68736:92::-;68798:22;68817:1;68798:10;:22::i;:::-;68736:92::o;74089:225::-;74224:16;74265:41;74274:6;74282:11;;74265:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;74295:10:0;;-1:-1:-1;74265:8:0;;-1:-1:-1;;74265:41:0:i;:::-;74258:48;74089:225;-1:-1:-1;;;;74089:225:0:o;69569:637::-;69725:16;:14;:16::i;:::-;67177:6;69760:8;:16;;69752:45;;;;-1:-1:-1;;;69752:45:0;;31908:2:1;69752:45:0;;;31890:21:1;31947:2;31927:18;;;31920:30;-1:-1:-1;;;31966:18:1;;;31959:46;32022:18;;69752:45:0;31880:166:1;69752:45:0;67177:6;69816:16;:24;;69808:53;;;;-1:-1:-1;;;69808:53:0;;31908:2:1;69808:53:0;;;31890:21:1;31947:2;31927:18;;;31920:30;-1:-1:-1;;;31966:18:1;;;31959:46;32022:18;;69808:53:0;31880:166:1;69808:53:0;67177:6;69880:16;:24;;69872:53;;;;-1:-1:-1;;;69872:53:0;;31908:2:1;69872:53:0;;;31890:21:1;31947:2;31927:18;;;31920:30;-1:-1:-1;;;31966:18:1;;;31959:46;32022:18;;69872:53:0;31880:166:1;69872:53:0;69936:7;:18;;;69965:15;:34;;;70010:15;:34;;;70062:24;;37144:25:1;;;70062:24:0;;37132:2:1;37117:18;70062:24:0;;;;;;;70102:40;;37144:25:1;;;70102:40:0;;37132:2:1;37117:18;70102:40:0;;;;;;;70158;;37144:25:1;;;70158:40:0;;37132:2:1;37117:18;70158:40:0;37099:76:1;72088:162:0;72161:16;:14;:16::i;:::-;72188:7;:18;;-1:-1:-1;;;;;;72188:18:0;-1:-1:-1;;;;;72188:18:0;;;;;;;;72222:20;;18186:74:1;;;72222:20:0;;18174:2:1;18159:18;72222:20:0;;;;;;;72088:162;:::o;75214:298::-;75418:16;75454:50;75461:8;;75454:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;75454:50:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75471:7:0;;-1:-1:-1;75471:7:0;;;;75454:50;;;75471:7;;75454:50;75471:7;75454:50;;;;;;;;;-1:-1:-1;;75454:50:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75480:11:0;;-1:-1:-1;75480:11:0;;;;75454:50;;;75480:11;;75454:50;75480:11;75454:50;;;;;;;;;-1:-1:-1;75493:10:0;;-1:-1:-1;75454:6:0;;-1:-1:-1;;75454:50:0:i;:::-;75447:57;75214:298;-1:-1:-1;;;;;;;75214:298:0:o;34729:297::-;34816:7;-1:-1:-1;;;;;34844:22:0;;34861:4;34844:22;34836:62;;;;-1:-1:-1;;;34836:62:0;;31143:2:1;34836:62:0;;;31125:21:1;31182:2;31162:18;;;31155:30;31221:29;31201:18;;;31194:57;31268:18;;34836:62:0;31115:177:1;34836:62:0;-1:-1:-1;35017:1:0;34729:297;;;;:::o;68861:194::-;68992:16;:14;:16::i;:::-;69019:28;69032:5;69039:7;69019:12;:28::i;:::-;68861:194;;:::o;67884:844::-;20246:13;;;;;;;;:30;;-1:-1:-1;20264:12:0;;;;20263:13;20246:30;20238:89;;;;-1:-1:-1;;;20238:89:0;;30728:2:1;20238:89:0;;;30710:21:1;30767:2;30747:18;;;30740:30;30806:34;30786:18;;;30779:62;-1:-1:-1;;;30857:18:1;;;30850:44;30911:19;;20238:89:0;30700:236:1;20238:89:0;20340:19;20363:13;;;;;;20362:14;20387:101;;;;20422:13;:20;;-1:-1:-1;;20457:19:0;;;;;20387:101;68111:16:::1;:14;:16::i;:::-;68138:28;68151:5;68158:7;68138:12;:28::i;:::-;-1:-1:-1::0;;;;;68185:27:0;::::1;68177:59;;;::::0;-1:-1:-1;;;68177:59:0;;28163:2:1;68177:59:0::1;::::0;::::1;28145:21:1::0;28202:2;28182:18;;;28175:30;28241:21;28221:18;;;28214:49;28280:18;;68177:59:0::1;28135:169:1::0;68177:59:0::1;68247:12;:28:::0;;-1:-1:-1;;;;;;68247:28:0;;::::1;-1:-1:-1::0;;;;;68247:28:0;::::1;;::::0;;;68286:12:::1;:44:::0;;68319:10:::1;68286:44:::0;::::1;::::0;::::1;::::0;;68351:24:::1;::::0;;;;;;;:22:::1;::::0;:24:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;68319:10;68351:24;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68341:7;:34:::0;;;68386:6:::1;:16:::0;;68413:30;::::1;;68386:16;68413:30:::0;::::1;-1:-1:-1::0;;68386:16:0;::::1;;68413:30:::0;;;-1:-1:-1;;68413:30:0;;;;;;;::::1;::::0;;;68459:58:::1;::::0;;-1:-1:-1;;;;;21056:55:1;;21038:74;;21143:2;21128:18;;21121:50;;;;21187:18;;21180:50;;;;68459:58:0::1;::::0;21026:2:1;21011:18;68459:58:0::1;;;;;;;68528:95;68545:4;68566::::0;68595::::1;68528:16;:95::i;:::-;68634:86;68642:10;68666:1;68689:10;68634:7;:86::i;:::-;20518:14:::0;20514:68;;;20565:5;20549:21;;-1:-1:-1;;20549:21:0;;;20514:68;67884:844;;;;;;:::o;78063:117::-;78128:7;78155:17;:8;:15;:17::i;:::-;78148:24;;78063:117;:::o;77089:449::-;77247:13;;77221:4;;77247:13;;;;;77243:57;;;-1:-1:-1;77284:4:0;;77089:449;-1:-1:-1;77089:449:0:o;77243:57::-;77351:18;;-1:-1:-1;;;;;77351:18:0;77384:42;77380:87;;-1:-1:-1;77450:5:0;;77089:449;-1:-1:-1;;77089:449:0:o;77380:87::-;77484:46;;;;;-1:-1:-1;;;;;77484:36:0;;;;;:46;;77521:8;;77484:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77477:53;77089:449;-1:-1:-1;;;77089:449:0:o;53994:244::-;53113:6;;-1:-1:-1;;;;;53113:6:0;21505:10;53260:23;53252:68;;;;-1:-1:-1;;;53252:68:0;;32253:2:1;53252:68:0;;;32235:21:1;;;32272:18;;;32265:30;32331:34;32311:18;;;32304:62;32383:18;;53252:68:0;32225:182:1;53252:68:0;-1:-1:-1;;;;;54083:22:0;::::1;54075:73;;;::::0;-1:-1:-1;;;54075:73:0;;26262:2:1;54075:73:0::1;::::0;::::1;26244:21:1::0;26301:2;26281:18;;;26274:30;26340:34;26320:18;;;26313:62;26411:8;26391:18;;;26384:36;26437:19;;54075:73:0::1;26234:228:1::0;54075:73:0::1;54185:6;::::0;54164:38:::1;::::0;-1:-1:-1;;;;;54164:38:0;;::::1;::::0;54185:6:::1;::::0;54164:38:::1;::::0;54185:6:::1;::::0;54164:38:::1;54213:6;:17:::0;;-1:-1:-1;;;;;;54213:17:0::1;-1:-1:-1::0;;;;;54213:17:0;;;::::1;::::0;;;::::1;::::0;;53994:244::o;32020:346::-;-1:-1:-1;;;;;32122:19:0;;32114:68;;;;-1:-1:-1;;;32114:68:0;;34848:2:1;32114:68:0;;;34830:21:1;34887:2;34867:18;;;34860:30;34926:34;34906:18;;;34899:62;34997:6;34977:18;;;34970:34;35021:19;;32114:68:0;34820:226:1;32114:68:0;-1:-1:-1;;;;;32201:21:0;;32193:68;;;;-1:-1:-1;;;32193:68:0;;26669:2:1;32193:68:0;;;26651:21:1;26708:2;26688:18;;;26681:30;26747:34;26727:18;;;26720:62;26818:4;26798:18;;;26791:32;26840:19;;32193:68:0;26641:224:1;32193:68:0;-1:-1:-1;;;;;32274:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;32326:32;;37144:25:1;;;32326:32:0;;37117:18:1;32326:32:0;;;;;;;;32020:346;;;:::o;29526:604::-;-1:-1:-1;;;;;29632:20:0;;29624:70;;;;-1:-1:-1;;;29624:70:0;;34105:2:1;29624:70:0;;;34087:21:1;34144:2;34124:18;;;34117:30;34183:34;34163:18;;;34156:62;34254:7;34234:18;;;34227:35;34279:19;;29624:70:0;34077:227:1;29624:70:0;-1:-1:-1;;;;;29713:23:0;;29705:71;;;;-1:-1:-1;;;29705:71:0;;24781:2:1;29705:71:0;;;24763:21:1;24820:2;24800:18;;;24793:30;24859:34;24839:18;;;24832:62;24930:5;24910:18;;;24903:33;24953:19;;29705:71:0;24753:225:1;29705:71:0;-1:-1:-1;;;;;29873:17:0;;29849:21;29873:17;;;:9;:17;;;;;;29909:23;;;;29901:74;;;;-1:-1:-1;;;29901:74:0;;27404:2:1;29901:74:0;;;27386:21:1;27443:2;27423:18;;;27416:30;27482:34;27462:18;;;27455:62;27553:8;27533:18;;;27526:36;27579:19;;29901:74:0;27376:228:1;29901:74:0;30006:22;30022:6;30006:13;:22;:::i;:::-;-1:-1:-1;;;;;29986:17:0;;;;;;;:9;:17;;;;;;:42;;;;30039:20;;;;;;;;:30;;30063:6;;29986:17;30039:30;;30063:6;;30039:30;:::i;:::-;;;;;;;;30104:9;-1:-1:-1;;;;;30087:35:0;30096:6;-1:-1:-1;;;;;30087:35:0;;30115:6;30087:35;;;;37144:25:1;;37132:2;37117:18;;37099:76;30087:35:0;;;;;;;;29526:604;;;;:::o;66101:114::-;66161:7;66188:19;66196:3;61311:18;;61228:109;66559:137;66630:7;66665:22;66669:3;66681:5;66665:3;:22::i;85016:233::-;85071:7;;-1:-1:-1;;;;;85071:7:0;85067:175;;53113:6;;-1:-1:-1;;;;;53113:6:0;85117:10;:21;85109:43;;;;-1:-1:-1;;;85109:43:0;;34511:2:1;85109:43:0;;;34493:21:1;34550:1;34530:18;;;34523:29;34588:11;34568:18;;;34561:39;34617:18;;85109:43:0;34483:158:1;85067:175:0;85207:7;;-1:-1:-1;;;;;85207:7:0;85193:10;:21;85185:45;;;;-1:-1:-1;;;85185:45:0;;25185:2:1;85185:45:0;;;25167:21:1;25224:2;25204:18;;;25197:30;25263:13;25243:18;;;25236:41;25294:18;;85185:45:0;25157:161:1;85257:150:0;85334:12;;:29;;;;;;;;37144:25:1;;;-1:-1:-1;;;;;85334:12:0;;;;:21;;37117:18:1;;85334:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;85333:30;:55;;;-1:-1:-1;53113:6:0;;-1:-1:-1;;;;;53113:6:0;85367:10;:21;85333:55;85325:74;;;;-1:-1:-1;;;85325:74:0;;25525:2:1;85325:74:0;;;25507:21:1;25564:1;25544:18;;;25537:29;25602:8;25582:18;;;25575:36;25628:18;;85325:74:0;25497:155:1;85325:74:0;85257:150;:::o;35816:782::-;36013:4;36035:11;36049:23;36058:5;36065:6;36049:8;:23::i;:::-;36035:37;;36083:32;36097:8;36108:6;36083:5;:32::i;:::-;36134:58;;;;;33904:45;;-1:-1:-1;;;;;36134:20:0;;;;;:58;;36155:10;;36167:5;;36174:6;;36182:3;;36187:4;;36134:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:74;36126:123;;;;-1:-1:-1;;;36126:123:0;;28867:2:1;36126:123:0;;;28849:21:1;28906:2;28886:18;;;28879:30;28945:34;28925:18;;;28918:62;29016:6;28996:18;;;28989:34;29040:19;;36126:123:0;28839:226:1;36126:123:0;-1:-1:-1;;;;;26277:18:0;;36260:24;26277:18;;;:11;:18;;;;;;;;36324:4;26277:27;;;;;;;;36369:12;36378:3;36369:6;:12;:::i;:::-;36349:16;:32;;36341:92;;;;-1:-1:-1;;;36341:92:0;;35613:2:1;36341:92:0;;;35595:21:1;35652:2;35632:18;;;35625:30;35691:34;35671:18;;;35664:62;35762:17;35742:18;;;35735:45;35797:19;;36341:92:0;35585:237:1;36341:92:0;36444:75;36461:8;36480:4;36515:3;36487:25;36506:6;36487:16;:25;:::i;:::-;:31;;;;:::i;36444:75::-;36530:38;36544:8;36555:12;36564:3;36555:6;:12;:::i;36530:38::-;-1:-1:-1;36586:4:0;;35816:782;-1:-1:-1;;;;;;35816:782:0:o;78729:1375::-;78856:7;78889:22;78902:8;78889:12;:22::i;:::-;78881:58;;;;-1:-1:-1;;;78881:58:0;;27811:2:1;78881:58:0;;;27793:21:1;27850:2;27830:18;;;27823:30;27889:25;27869:18;;;27862:53;27932:18;;78881:58:0;27783:173:1;78881:58:0;78954:6;;;;78950:1147;;;79075:12;;79055:205;;;;;-1:-1:-1;;;;;79075:12:0;;;;79055:55;;:205;;79129:10;;79166:4;;79190:8;;79217:7;;79055:205;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;79277:13:0;;-1:-1:-1;79277:13:0;;-1:-1:-1;;79305:423:0;79329:8;:15;79325:1;:19;79305:423;;;79370:15;79388:8;79397:1;79388:11;;;;;;-1:-1:-1;;;79388:11:0;;;;;;;;;;;;;;;79370:29;;79418:14;79435:7;79443:1;79435:10;;;;;;-1:-1:-1;;;79435:10:0;;;;;;;;;;;;;;;79418:27;;79481:1;79472:6;:10;79464:50;;;;-1:-1:-1;;;79464:50:0;;28511:2:1;79464:50:0;;;28493:21:1;28550:2;28530:18;;;28523:30;28589:29;28569:18;;;28562:57;28636:18;;79464:50:0;28483:177:1;79464:50:0;79537:21;;;;:12;:21;;;;;;79533:96;;79588:21;:8;79601:7;79588:12;:21::i;:::-;;79533:96;79647:21;;;;:12;:21;;;;;:31;;79672:6;;79647:21;:31;;79672:6;;79647:31;:::i;:::-;;;;-1:-1:-1;79697:15:0;;-1:-1:-1;79706:6:0;79697:15;;:::i;:::-;;;79305:423;;79346:3;;;;;:::i;:::-;;;;79305:423;;;-1:-1:-1;79749:5:0;-1:-1:-1;79742:12:0;;78950:1147;79811:12;;-1:-1:-1;;;;;79811:12:0;79787:21;79838:211;79862:8;:15;79858:1;:19;79838:211;;;79903:15;79921:8;79930:1;79921:11;;;;;;-1:-1:-1;;;79921:11:0;;;;;;;;;;;;;;;79903:29;;79951:42;79970:13;79985:7;79951:18;:42::i;:::-;80012:21;:8;80025:7;80012:12;:21::i;:::-;;79838:211;79879:3;;;;;:::i;:::-;;;;79838:211;;;;80070:8;:15;80063:22;;;;;81653:659;81870:12;;:41;;;;;81900:10;81870:41;;;18186:74:1;-1:-1:-1;;;;;81870:12:0;;;;:29;;18159:18:1;;81870:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81866:80;;;81653:659;;:::o;81866:80::-;82036:10;;82032:273;;82088:12;;:29;;;-1:-1:-1;;;82088:29:0;;;;82063:22;;-1:-1:-1;;;;;82088:12:0;;:27;;:29;;;;;;;;;;;;;;:12;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;82063:54;;82184:39;82194:4;82200:14;82216:6;82184:9;:39::i;:::-;82285:7;;82238:55;;;;;;;;37144:25:1;;;;-1:-1:-1;;;;;82238:46:0;;;;;37117:18:1;;82238:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82032:273;81653:659;;:::o;80112:1533::-;80254:16;80315:11;:18;80305:6;:28;:50;;;-1:-1:-1;80337:18:0;;;;;;;80305:50;80283:136;;;;-1:-1:-1;;;80283:136:0;;33700:2:1;80283:136:0;;;33682:21:1;33739:2;33719:18;;;33712:30;33778:34;33758:18;;;33751:62;-1:-1:-1;;;33829:18:1;;;33822:34;33873:19;;80283:136:0;33672:226:1;80283:136:0;80452:18;;:23;;:45;;-1:-1:-1;80479:18:0;;;;;;;80452:45;80430:131;;;;-1:-1:-1;;;80430:131:0;;36795:2:1;80430:131:0;;;36777:21:1;36834:2;36814:18;;;36807:30;36873:34;36853:18;;;36846:62;-1:-1:-1;;;36924:18:1;;;36917:34;36968:19;;80430:131:0;36767:226:1;80430:131:0;80589:6;;80630:12;;80589:6;;;;;-1:-1:-1;;;;;80630:12:0;80574;80698:6;80684:21;;;;;;-1:-1:-1;;;80684:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;80684:21:0;;80653:52;;80721:9;80716:854;80740:6;80736:1;:10;80716:854;;;80850:15;80872:11;:18;80868:1;:22;:87;;80928:27;:25;:27::i;:::-;80868:87;;;80911:11;80923:1;80911:14;;;;;;-1:-1:-1;;;80911:14:0;;;;;;;;;;;;;;;80868:87;80850:105;;80987:7;80970:11;80982:1;80970:14;;;;;;-1:-1:-1;;;80970:14:0;;;;;;;;;;;;;;:24;;;;;81015:7;81011:548;;;81043:21;;;;:12;:21;;;;;:26;;81068:1;;81043:21;:26;;81068:1;;81043:26;:::i;:::-;;;;-1:-1:-1;;81092:21:0;;;;:12;:21;;;;;;81088:99;;81143:24;:8;81159:7;81143:15;:24::i;:::-;;81088:99;81207:210;;;;;81289:4;81207:210;;;19958:34:1;-1:-1:-1;;;;;20028:15:1;;;20008:18;;;20001:43;20060:18;;;20053:34;;;81372:1:0;20103:18:1;;;20096:34;20167:3;20146:19;;;20139:32;-1:-1:-1;20187:19:1;;;20180:33;81207:51:0;;;;;20230:19:1;;81207:210:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81011:548;;;81458:24;:8;81474:7;81458:15;:24::i;:::-;;81501:42;81516:13;81531:2;81535:7;81501:14;:42::i;:::-;-1:-1:-1;80748:3:0;;;;:::i;:::-;;;;80716:854;;;;81580:28;81596:11;81580:15;:28::i;:::-;81626:11;80112:1533;-1:-1:-1;;;;;;80112:1533:0:o;31088:494::-;-1:-1:-1;;;;;31172:21:0;;31164:67;;;;-1:-1:-1;;;31164:67:0;;33298:2:1;31164:67:0;;;33280:21:1;33337:2;33317:18;;;33310:30;33376:34;33356:18;;;33349:62;33447:3;33427:18;;;33420:31;33468:19;;31164:67:0;33270:223:1;31164:67:0;-1:-1:-1;;;;;31331:18:0;;31306:22;31331:18;;;:9;:18;;;;;;31368:24;;;;31360:71;;;;-1:-1:-1;;;31360:71:0;;25859:2:1;31360:71:0;;;25841:21:1;25898:2;25878:18;;;25871:30;25937:34;25917:18;;;25910:62;26008:4;25988:18;;;25981:32;26030:19;;31360:71:0;25831:224:1;31360:71:0;31463:23;31480:6;31463:14;:23;:::i;:::-;-1:-1:-1;;;;;31442:18:0;;;;;;:9;:18;;;;;:44;;;;31497:12;:22;;31513:6;;31442:18;31497:22;;31513:6;;31497:22;:::i;:::-;;;;-1:-1:-1;;31537:37:0;;37144:25:1;;;31563:1:0;;-1:-1:-1;;;;;31537:37:0;;;;;37132:2:1;37117:18;31537:37:0;37099:76:1;30417:338:0;-1:-1:-1;;;;;30501:21:0;;30493:65;;;;-1:-1:-1;;;30493:65:0;;36435:2:1;30493:65:0;;;36417:21:1;36474:2;36454:18;;;36447:30;36513:33;36493:18;;;36486:61;36564:18;;30493:65:0;36407:181:1;30493:65:0;30649:6;30633:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;30666:18:0;;;;;;:9;:18;;;;;:28;;30688:6;;30666:18;:28;;30688:6;;30666:28;:::i;:::-;;;;-1:-1:-1;;30710:37:0;;37144:25:1;;;-1:-1:-1;;;;;30710:37:0;;;30727:1;;30710:37;;37132:2:1;37117:18;30710:37:0;;;;;;;30417:338;;:::o;24087:135::-;24173:13;;;;:5;;:13;;;;;:::i;:::-;-1:-1:-1;24197:17:0;;;;:7;;:17;;;;;:::i;:::-;;24087:135;;:::o;52626:129::-;20246:13;;;;;;;;:30;;-1:-1:-1;20264:12:0;;;;20263:13;20246:30;20238:89;;;;-1:-1:-1;;;20238:89:0;;30728:2:1;20238:89:0;;;30710:21:1;30767:2;30747:18;;;30740:30;30806:34;30786:18;;;30779:62;-1:-1:-1;;;30857:18:1;;;30850:44;30911:19;;20238:89:0;30700:236:1;20238:89:0;20340:19;20363:13;;;;;;20362:14;20387:101;;;;20422:13;:20;;-1:-1:-1;;20457:19:0;;;;;20387:101;52684:26:::1;:24;:26::i;:::-;52721;:24;:26::i;:::-;20518:14:::0;20514:68;;;20565:5;20549:21;;-1:-1:-1;;20549:21:0;;;52626:129;:::o;23733:181::-;20246:13;;;;;;;;:30;;-1:-1:-1;20264:12:0;;;;20263:13;20246:30;20238:89;;;;-1:-1:-1;;;20238:89:0;;30728:2:1;20238:89:0;;;30710:21:1;30767:2;30747:18;;;30740:30;30806:34;30786:18;;;30779:62;-1:-1:-1;;;30857:18:1;;;30850:44;30911:19;;20238:89:0;30700:236:1;20238:89:0;20340:19;20363:13;;;;;;20362:14;20387:101;;;;20422:13;:20;;-1:-1:-1;;20457:19:0;;;;;20387:101;23831:26:::1;:24;:26::i;:::-;23868:38;23891:5;23898:7;23868:22;:38::i;:::-;20518:14:::0;20514:68;;;20565:5;20549:21;;-1:-1:-1;;20549:21:0;;;23733:181;;;:::o;61681:120::-;61748:7;61775:3;:11;;61787:5;61775:18;;;;;;-1:-1:-1;;;61775:18:0;;;;;;;;;;;;;;;;;61768:25;;61681:120;;;;:::o;65339:131::-;65406:4;65430:32;65435:3;65455:5;65430:4;:32::i;83171:1321::-;83281:42;83350;83403:17;-1:-1:-1;;;;;83435:20:0;;;;83431:925;;;83510:100;;83575:10;83510:100;;;19454:34:1;83595:4:0;19504:18:1;;;19497:43;19556:18;;;19549:34;;;19366:18;;83510:100:0;;;-1:-1:-1;;83510:100:0;;;;;;;;;;;;;;-1:-1:-1;;;;;83510:100:0;;;;;;-1:-1:-1;83431:925:0;;;83645:5;-1:-1:-1;;;;;83632:18:0;:9;-1:-1:-1;;;;;83632:18:0;;83628:728;;;83759:31;83848:7;83793:63;;;;;;37144:25:1;;37132:2;37117:18;;37099:76;83793:63:0;;;;-1:-1:-1;;83793:63:0;;;;;;;;;;;;;;-1:-1:-1;;;;;83793:63:0;;;;;83914:49;83793:63;;-1:-1:-1;;;;;;;;;;83914:29:0;;;:49;;83793:63;;83914:49;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83871:92;;;;83979:13;84007:6;83996:29;;;;;;;;;;;;:::i;:::-;83978:47;;84048:12;:35;;;;-1:-1:-1;;;;;;84064:19:0;;84073:10;84064:19;84048:35;84040:61;;;;-1:-1:-1;;;84040:61:0;;29622:2:1;84040:61:0;;;29604:21:1;29661:2;29641:18;;;29634:30;29700:15;29680:18;;;29673:43;29733:18;;84040:61:0;29594:163:1;84040:61:0;84123:52;;;;;37144:25:1;;;37117:18;;84123:52:0;;;-1:-1:-1;;84123:52:0;;;;;;;;;;;;;;-1:-1:-1;;;;;84123:52:0;;;;;;-1:-1:-1;83628:728:0;;-1:-1:-1;;;;83628:728:0;;84240:104;;84309:10;84240:104;;;19454:34:1;84329:4:0;19504:18:1;;;19497:43;19556:18;;;19549:34;;;19366:18;;84240:104:0;;;-1:-1:-1;;84240:104:0;;;;;;;;;;;;;;-1:-1:-1;;;;;84240:104:0;-1:-1:-1;;;84240:104:0;;;;-1:-1:-1;83628:728:0;84367:12;84381:23;84416:9;-1:-1:-1;;;;;84408:23:0;84432:4;84408:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84366:71;;;;84456:7;84472:10;84448:36;;;;;-1:-1:-1;;;84448:36:0;;;;;;;;:::i;84500:508::-;84563:7;84583:19;84916:17;:8;:15;:17::i;:::-;84704:16;84719:1;84704:12;:16;:::i;:::-;84745:9;;84655:232;;;84694:27;;84655:232;;;17506:19:1;17541:12;;17534:28;84777:14:0;17600:2:1;17596:15;;;-1:-1:-1;;17592:53:1;17578:12;;;17571:75;84814:16:0;17662:12:1;;;17655:28;84853:15:0;17699:13:1;;;17692:29;17737:13;;84655:232:0;;;;;;;;;;;;84627:275;;;;;;84605:308;;:328;;;;:::i;:::-;84583:350;;84957:1;84944:9;;:14;;;;;;;:::i;:::-;;;;-1:-1:-1;84976:24:0;;-1:-1:-1;84976:8:0;84988:11;84976;:24::i;:::-;84969:31;;;84500:508;:::o;65646:137::-;65716:4;65740:35;65748:3;65768:5;65740:7;:35::i;82320:843::-;82438:42;82507;82560:17;-1:-1:-1;;;;;82592:20:0;;;;82588:483;;;82671:65;;-1:-1:-1;;;;;21433:55:1;;82671:65:0;;;21415:74:1;21505:18;;;21498:34;;;21388:18;;82671:65:0;;;-1:-1:-1;;82671:65:0;;;;;;;;;;;;;;-1:-1:-1;;;;;82671:65:0;;;;;;-1:-1:-1;82588:483:0;;;82771:5;-1:-1:-1;;;;;82758:18:0;:9;-1:-1:-1;;;;;82758:18:0;;82754:317;;;82829:69;;-1:-1:-1;;;;;21433:55:1;;82829:69:0;;;21415:74:1;21505:18;;;21498:34;;;21388:18;;82829:69:0;;;-1:-1:-1;;82829:69:0;;;;;;;;;;;;;;-1:-1:-1;;;;;82829:69:0;;;;;;-1:-1:-1;82754:317:0;;;82963:96;;83040:4;82963:96;;;19454:34:1;-1:-1:-1;;;;;19524:15:1;;19504:18;;;19497:43;19556:18;;;19549:34;;;19366:18;;82963:96:0;;;-1:-1:-1;;82963:96:0;;;;;;;;;;;;;;-1:-1:-1;;;;;82963:96:0;-1:-1:-1;;;82963:96:0;;;;-1:-1:-1;82754:317:0;83082:12;83107:9;-1:-1:-1;;;;;83099:23:0;83123:4;83099:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83081:47;;;83147:7;83139:16;;;;;78429:292;78548:18;;-1:-1:-1;;;;;78548:18:0;78581:42;78577:81;;78640:7;78429:292;:::o;78577:81::-;78668:45;;;;;-1:-1:-1;;;;;78668:35:0;;;;;:45;;78704:8;;78668:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21354:65;20246:13;;;;;;;;:30;;-1:-1:-1;20264:12:0;;;;20263:13;20246:30;20238:89;;;;-1:-1:-1;;;20238:89:0;;30728:2:1;20238:89:0;;;30710:21:1;30767:2;30747:18;;;30740:30;30806:34;30786:18;;;30779:62;-1:-1:-1;;;30857:18:1;;;30850:44;30911:19;;20238:89:0;30700:236:1;20238:89:0;20340:19;20363:13;;;;;;20362:14;20387:101;;;;20422:13;:20;;-1:-1:-1;;20457:19:0;;;;;20514:68;;;;20565:5;20549:21;;-1:-1:-1;;20549:21:0;;;21354:65;:::o;52763:196::-;20246:13;;;;;;;;:30;;-1:-1:-1;20264:12:0;;;;20263:13;20246:30;20238:89;;;;-1:-1:-1;;;20238:89:0;;30728:2:1;20238:89:0;;;30710:21:1;30767:2;30747:18;;;30740:30;30806:34;30786:18;;;30779:62;-1:-1:-1;;;30857:18:1;;;30850:44;30911:19;;20238:89:0;30700:236:1;20238:89:0;20340:19;20363:13;;;;;;20362:14;20387:101;;;;20422:13;:20;;-1:-1:-1;;20457:19:0;;;;;20387:101;52874:6:::1;:18:::0;;-1:-1:-1;;;;;;52874:18:0::1;21505:10:::0;52874:18;;::::1;::::0;;;52908:43:::1;::::0;21505:10;;52831:17:::1;::::0;52908:43:::1;::::0;52831:17;;52908:43:::1;20500:1;20518:14:::0;20514:68;;;20565:5;20549:21;;-1:-1:-1;;20549:21:0;;;52763:196;:::o;23922:157::-;20246:13;;;;;;;;:30;;-1:-1:-1;20264:12:0;;;;20263:13;20246:30;20238:89;;;;-1:-1:-1;;;20238:89:0;;30728:2:1;20238:89:0;;;30710:21:1;30767:2;30747:18;;;30740:30;30806:34;30786:18;;;30779:62;-1:-1:-1;;;30857:18:1;;;30850:44;30911:19;;20238:89:0;30700:236:1;20238:89:0;20340:19;20363:13;;;;;;20362:14;20387:101;;;;20422:13;:20;;-1:-1:-1;;20457:19:0;;;;;20387:101;24030:13;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;24054:17:0;;::::1;::::0;:7:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;:::-;;20518:14:::0;20514:68;;;20565:5;20549:21;;-1:-1:-1;;20549:21:0;;;23922:157;;;:::o;58930:414::-;58993:4;61110:19;;;:12;;;:19;;;;;;59010:327;;-1:-1:-1;59053:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;59236:18;;59214:19;;;:12;;;:19;;;;;;:40;;;;59269:11;;59010:327;-1:-1:-1;59320:5:0;59313:12;;59520:1407;59586:4;59725:19;;;:12;;;:19;;;;;;59761:15;;59757:1163;;60123:21;60147:14;60160:1;60147:10;:14;:::i;:::-;60196:18;;60123:38;;-1:-1:-1;60176:17:0;;60196:22;;60217:1;;60196:22;:::i;:::-;60176:42;;60252:13;60239:9;:26;60235:405;;60286:17;60306:3;:11;;60318:9;60306:22;;;;;;-1:-1:-1;;;60306:22:0;;;;;;;;;;;;;;;;;60286:42;;60460:9;60431:3;:11;;60443:13;60431:26;;;;;;-1:-1:-1;;;60431:26:0;;;;;;;;;;;;;;;;;;;;:38;;;;60545:23;;;:12;;;:23;;;;;:36;;;60235:405;60721:17;;:3;;:17;;;-1:-1:-1;;;60721:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;60816:3;:12;;:19;60829:5;60816:19;;;;;;;;;;;60809:26;;;60859:4;60852:11;;;;;;;59757:1163;60903:5;60896:12;;;;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:395:1;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:2;;166:8;156;149:26;108:2;-1:-1:-1;196:20:1;;239:18;228:30;;225:2;;;278:8;268;261:26;225:2;322:4;314:6;310:17;298:29;;382:3;375:4;365:6;362:1;358:14;350:6;346:27;342:38;339:47;336:2;;;399:1;396;389:12;336:2;98:311;;;;;:::o;414:743::-;468:5;521:3;514:4;506:6;502:17;498:27;488:2;;543:5;536;529:20;488:2;583:6;570:20;609:4;632:18;628:2;625:26;622:2;;;654:18;;:::i;:::-;700:2;697:1;693:10;723:28;747:2;743;739:11;723:28;:::i;:::-;785:15;;;816:12;;;;848:15;;;882;;;878:24;;875:33;-1:-1:-1;872:2:1;;;925:5;918;911:20;872:2;951:5;942:14;;965:163;979:2;976:1;973:9;965:163;;;1036:17;;1024:30;;997:1;990:9;;;;;1074:12;;;;1106;;965:163;;;-1:-1:-1;1146:5:1;478:679;-1:-1:-1;;;;;;;478:679:1:o;1162:550::-;1204:5;1257:3;1250:4;1242:6;1238:17;1234:27;1224:2;;1279:5;1272;1265:20;1224:2;1319:6;1306:20;1345:18;1341:2;1338:26;1335:2;;;1367:18;;:::i;:::-;1411:55;1454:2;1435:13;;-1:-1:-1;;1431:27:1;1460:4;1427:38;1411:55;:::i;:::-;1491:2;1482:7;1475:19;1537:3;1530:4;1525:2;1517:6;1513:15;1509:26;1506:35;1503:2;;;1558:5;1551;1544:20;1503:2;1627;1620:4;1612:6;1608:17;1601:4;1592:7;1588:18;1575:55;1650:16;;;1668:4;1646:27;1639:42;;;;1654:7;1214:498;-1:-1:-1;;1214:498:1:o;1717:257::-;1776:6;1829:2;1817:9;1808:7;1804:23;1800:32;1797:2;;;1850:6;1842;1835:22;1797:2;1894:9;1881:23;1913:31;1938:5;1913:31;:::i;1979:261::-;2049:6;2102:2;2090:9;2081:7;2077:23;2073:32;2070:2;;;2123:6;2115;2108:22;2070:2;2160:9;2154:16;2179:31;2204:5;2179:31;:::i;2519:398::-;2587:6;2595;2648:2;2636:9;2627:7;2623:23;2619:32;2616:2;;;2669:6;2661;2654:22;2616:2;2713:9;2700:23;2732:31;2757:5;2732:31;:::i;:::-;2782:5;-1:-1:-1;2839:2:1;2824:18;;2811:32;2852:33;2811:32;2852:33;:::i;:::-;2904:7;2894:17;;;2606:311;;;;;:::o;2922:1111::-;3076:6;3084;3092;3100;3108;3161:3;3149:9;3140:7;3136:23;3132:33;3129:2;;;3183:6;3175;3168:22;3129:2;3227:9;3214:23;3246:31;3271:5;3246:31;:::i;:::-;3296:5;-1:-1:-1;3353:2:1;3338:18;;3325:32;3366:33;3325:32;3366:33;:::i;:::-;3418:7;-1:-1:-1;3476:2:1;3461:18;;3448:32;3499:18;3529:14;;;3526:2;;;3561:6;3553;3546:22;3526:2;3589:61;3642:7;3633:6;3622:9;3618:22;3589:61;:::i;:::-;3579:71;;3703:2;3692:9;3688:18;3675:32;3659:48;;3732:2;3722:8;3719:16;3716:2;;;3753:6;3745;3738:22;3716:2;3781:63;3836:7;3825:8;3814:9;3810:24;3781:63;:::i;:::-;3771:73;;3897:3;3886:9;3882:19;3869:33;3853:49;;3927:2;3917:8;3914:16;3911:2;;;3948:6;3940;3933:22;3911:2;;3976:51;4019:7;4008:8;3997:9;3993:24;3976:51;:::i;:::-;3966:61;;;3119:914;;;;;;;;:::o;4038:466::-;4115:6;4123;4131;4184:2;4172:9;4163:7;4159:23;4155:32;4152:2;;;4205:6;4197;4190:22;4152:2;4249:9;4236:23;4268:31;4293:5;4268:31;:::i;:::-;4318:5;-1:-1:-1;4375:2:1;4360:18;;4347:32;4388:33;4347:32;4388:33;:::i;:::-;4142:362;;4440:7;;-1:-1:-1;;;4494:2:1;4479:18;;;;4466:32;;4142:362::o;4509:685::-;4604:6;4612;4620;4628;4681:3;4669:9;4660:7;4656:23;4652:33;4649:2;;;4703:6;4695;4688:22;4649:2;4747:9;4734:23;4766:31;4791:5;4766:31;:::i;:::-;4816:5;-1:-1:-1;4873:2:1;4858:18;;4845:32;4886:33;4845:32;4886:33;:::i;:::-;4938:7;-1:-1:-1;4992:2:1;4977:18;;4964:32;;-1:-1:-1;5047:2:1;5032:18;;5019:32;5074:18;5063:30;;5060:2;;;5111:6;5103;5096:22;5060:2;5139:49;5180:7;5171:6;5160:9;5156:22;5139:49;:::i;:::-;5129:59;;;4639:555;;;;;;;:::o;5199:754::-;5303:6;5311;5319;5327;5335;5388:3;5376:9;5367:7;5363:23;5359:33;5356:2;;;5410:6;5402;5395:22;5356:2;5454:9;5441:23;5473:31;5498:5;5473:31;:::i;:::-;5523:5;-1:-1:-1;5580:2:1;5565:18;;5552:32;5593:33;5552:32;5593:33;:::i;:::-;5645:7;-1:-1:-1;5699:2:1;5684:18;;5671:32;;-1:-1:-1;5750:2:1;5735:18;;5722:32;;-1:-1:-1;5805:3:1;5790:19;;5777:33;5833:18;5822:30;;5819:2;;;5870:6;5862;5855:22;5819:2;5898:49;5939:7;5930:6;5919:9;5915:22;5898:49;:::i;5958:325::-;6026:6;6034;6087:2;6075:9;6066:7;6062:23;6058:32;6055:2;;;6108:6;6100;6093:22;6055:2;6152:9;6139:23;6171:31;6196:5;6171:31;:::i;:::-;6221:5;6273:2;6258:18;;;;6245:32;;-1:-1:-1;;;6045:238:1:o;6288:803::-;6410:6;6418;6426;6434;6487:2;6475:9;6466:7;6462:23;6458:32;6455:2;;;6508:6;6500;6493:22;6455:2;6553:9;6540:23;6582:18;6623:2;6615:6;6612:14;6609:2;;;6644:6;6636;6629:22;6609:2;6688:70;6750:7;6741:6;6730:9;6726:22;6688:70;:::i;:::-;6777:8;;-1:-1:-1;6662:96:1;-1:-1:-1;6865:2:1;6850:18;;6837:32;;-1:-1:-1;6881:16:1;;;6878:2;;;6915:6;6907;6900:22;6878:2;;6959:72;7023:7;7012:8;7001:9;6997:24;6959:72;:::i;:::-;6445:646;;;;-1:-1:-1;7050:8:1;-1:-1:-1;;;;6445:646:1:o;7096:1128::-;7254:6;7262;7270;7278;7286;7294;7347:2;7335:9;7326:7;7322:23;7318:32;7315:2;;;7368:6;7360;7353:22;7315:2;7413:9;7400:23;7442:18;7483:2;7475:6;7472:14;7469:2;;;7504:6;7496;7489:22;7469:2;7548:70;7610:7;7601:6;7590:9;7586:22;7548:70;:::i;:::-;7637:8;;-1:-1:-1;7522:96:1;-1:-1:-1;7725:2:1;7710:18;;7697:32;;-1:-1:-1;7741:16:1;;;7738:2;;;7775:6;7767;7760:22;7738:2;7819:72;7883:7;7872:8;7861:9;7857:24;7819:72;:::i;:::-;7910:8;;-1:-1:-1;7793:98:1;-1:-1:-1;7998:2:1;7983:18;;7970:32;;-1:-1:-1;8014:16:1;;;8011:2;;;8048:6;8040;8033:22;8011:2;;8092:72;8156:7;8145:8;8134:9;8130:24;8092:72;:::i;:::-;7305:919;;;;-1:-1:-1;7305:919:1;;-1:-1:-1;7305:919:1;;8183:8;;7305:919;-1:-1:-1;;;7305:919:1:o;8229:368::-;8313:6;8366:2;8354:9;8345:7;8341:23;8337:32;8334:2;;;8387:6;8379;8372:22;8334:2;8432:9;8419:23;8465:18;8457:6;8454:30;8451:2;;;8502:6;8494;8487:22;8451:2;8530:61;8583:7;8574:6;8563:9;8559:22;8530:61;:::i;8602:760::-;8729:6;8737;8745;8798:2;8786:9;8777:7;8773:23;8769:32;8766:2;;;8819:6;8811;8804:22;8766:2;8864:9;8851:23;8893:18;8934:2;8926:6;8923:14;8920:2;;;8955:6;8947;8940:22;8920:2;8983:61;9036:7;9027:6;9016:9;9012:22;8983:61;:::i;:::-;8973:71;;9097:2;9086:9;9082:18;9069:32;9053:48;;9126:2;9116:8;9113:16;9110:2;;;9147:6;9139;9132:22;9110:2;;9175:63;9230:7;9219:8;9208:9;9204:24;9175:63;:::i;:::-;9165:73;;;9288:2;9277:9;9273:18;9260:32;9301:31;9326:5;9301:31;:::i;:::-;9351:5;9341:15;;;8756:606;;;;;:::o;9367:997::-;9528:6;9536;9544;9552;9605:3;9593:9;9584:7;9580:23;9576:33;9573:2;;;9627:6;9619;9612:22;9573:2;9672:9;9659:23;9701:18;9742:2;9734:6;9731:14;9728:2;;;9763:6;9755;9748:22;9728:2;9791:61;9844:7;9835:6;9824:9;9820:22;9791:61;:::i;:::-;9781:71;;9905:2;9894:9;9890:18;9877:32;9861:48;;9934:2;9924:8;9921:16;9918:2;;;9955:6;9947;9940:22;9918:2;9983:63;10038:7;10027:8;10016:9;10012:24;9983:63;:::i;:::-;9973:73;;10099:2;10088:9;10084:18;10071:32;10055:48;;10128:2;10118:8;10115:16;10112:2;;;10149:6;10141;10134:22;10112:2;;10177:63;10232:7;10221:8;10210:9;10206:24;10177:63;:::i;:::-;10167:73;;;10290:2;10279:9;10275:18;10262:32;10303:31;10328:5;10303:31;:::i;:::-;9563:801;;;;-1:-1:-1;9563:801:1;;-1:-1:-1;;9563:801:1:o;10369:255::-;10436:6;10489:2;10477:9;10468:7;10464:23;10460:32;10457:2;;;10510:6;10502;10495:22;10457:2;10547:9;10541:16;10566:28;10588:5;10566:28;:::i;10629:521::-;10697:6;10705;10713;10766:2;10754:9;10745:7;10741:23;10737:32;10734:2;;;10787:6;10779;10772:22;10734:2;10831:9;10818:23;10850:28;10872:5;10850:28;:::i;:::-;10897:5;-1:-1:-1;10954:2:1;10939:18;;10926:32;10967:30;10926:32;10967:30;:::i;:::-;11016:7;-1:-1:-1;11075:2:1;11060:18;;11047:32;11088:30;11047:32;11088:30;:::i;11155:194::-;11225:6;11278:2;11266:9;11257:7;11253:23;11249:32;11246:2;;;11299:6;11291;11284:22;11246:2;-1:-1:-1;11327:16:1;;11236:113;-1:-1:-1;11236:113:1:o;11354:352::-;11412:6;11465:2;11453:9;11444:7;11440:23;11436:32;11433:2;;;11486:6;11478;11471:22;11433:2;11530:9;11517:23;-1:-1:-1;;;;;;11573:5:1;11569:78;11562:5;11559:89;11549:2;;11667:6;11659;11652:22;11711:725;11846:6;11854;11862;11870;11923:3;11911:9;11902:7;11898:23;11894:33;11891:2;;;11945:6;11937;11930:22;12441:571;12529:6;12537;12590:2;12578:9;12569:7;12565:23;12561:32;12558:2;;;12611:6;12603;12596:22;12558:2;12656:9;12643:23;12685:18;12726:2;12718:6;12715:14;12712:2;;;12747:6;12739;12732:22;12712:2;12775:49;12816:7;12807:6;12796:9;12792:22;12775:49;:::i;:::-;12765:59;;12877:2;12866:9;12862:18;12849:32;12833:48;;12906:2;12896:8;12893:16;12890:2;;;12927:6;12919;12912:22;12890:2;;12955:51;12998:7;12987:8;12976:9;12972:24;12955:51;:::i;:::-;12945:61;;;12548:464;;;;;:::o;13017:978::-;13126:6;13134;13142;13150;13158;13211:3;13199:9;13190:7;13186:23;13182:33;13179:2;;;13233:6;13225;13218:22;13179:2;13278:9;13265:23;13307:18;13348:2;13340:6;13337:14;13334:2;;;13369:6;13361;13354:22;13334:2;13397:49;13438:7;13429:6;13418:9;13414:22;13397:49;:::i;:::-;13387:59;;13499:2;13488:9;13484:18;13471:32;13455:48;;13528:2;13518:8;13515:16;13512:2;;;13549:6;13541;13534:22;13512:2;;13577:51;13620:7;13609:8;13598:9;13594:24;13577:51;:::i;:::-;13567:61;;;13678:2;13667:9;13663:18;13650:32;13691:31;13716:5;13691:31;:::i;:::-;13741:5;-1:-1:-1;13798:2:1;13783:18;;13770:32;13811:30;13770:32;13811:30;:::i;:::-;13860:7;-1:-1:-1;13919:3:1;13904:19;;13891:33;13933:30;13891:33;13933:30;:::i;:::-;13982:7;13972:17;;;13169:826;;;;;;;;:::o;14000:190::-;14059:6;14112:2;14100:9;14091:7;14087:23;14083:32;14080:2;;;14133:6;14125;14118:22;14080:2;-1:-1:-1;14161:23:1;;14070:120;-1:-1:-1;14070:120:1:o;14394:525::-;14489:6;14497;14505;14558:2;14546:9;14537:7;14533:23;14529:32;14526:2;;;14579:6;14571;14564:22;14526:2;14620:9;14607:23;14597:33;;14681:2;14670:9;14666:18;14653:32;14708:18;14700:6;14697:30;14694:2;;;14745:6;14737;14730:22;14694:2;14789:70;14851:7;14842:6;14831:9;14827:22;14789:70;:::i;:::-;14516:403;;14878:8;;-1:-1:-1;14763:96:1;;-1:-1:-1;;;;14516:403:1:o;14924:571::-;15026:6;15034;15042;15095:2;15083:9;15074:7;15070:23;15066:32;15063:2;;;15116:6;15108;15101:22;15063:2;15157:9;15144:23;15134:33;;15218:2;15207:9;15203:18;15190:32;15245:18;15237:6;15234:30;15231:2;;;15282:6;15274;15267:22;15231:2;15310:61;15363:7;15354:6;15343:9;15339:22;15310:61;:::i;15500:709::-;15579:6;15587;15595;15648:2;15636:9;15627:7;15623:23;15619:32;15616:2;;;15669:6;15661;15654:22;15616:2;15710:9;15697:23;15687:33;;15771:2;15760:9;15756:18;15743:32;15794:18;15835:2;15827:6;15824:14;15821:2;;;15856:6;15848;15841:22;15821:2;15899:6;15888:9;15884:22;15874:32;;15944:7;15937:4;15933:2;15929:13;15925:27;15915:2;;15971:6;15963;15956:22;15915:2;16016;16003:16;16042:2;16034:6;16031:14;16028:2;;;16063:6;16055;16048:22;16028:2;16113:7;16108:2;16099:6;16095:2;16091:15;16087:24;16084:37;16081:2;;;16139:6;16131;16124:22;16081:2;16175;16171;16167:11;16157:21;;16197:6;16187:16;;;;;15606:603;;;;;:::o;16214:326::-;16291:6;16299;16307;16360:2;16348:9;16339:7;16335:23;16331:32;16328:2;;;16381:6;16373;16366:22;16328:2;-1:-1:-1;;16409:23:1;;;16479:2;16464:18;;16451:32;;-1:-1:-1;16530:2:1;16515:18;;;16502:32;;16318:222;-1:-1:-1;16318:222:1:o;16545:437::-;16598:3;16636:5;16630:12;16663:6;16658:3;16651:19;16689:4;16718:2;16713:3;16709:12;16702:19;;16755:2;16748:5;16744:14;16776:3;16788:169;16802:6;16799:1;16796:13;16788:169;;;16863:13;;16851:26;;16897:12;;;;16932:15;;;;16824:1;16817:9;16788:169;;;-1:-1:-1;16973:3:1;;16606:376;-1:-1:-1;;;;;16606:376:1:o;16987:257::-;17028:3;17066:5;17060:12;17093:6;17088:3;17081:19;17109:63;17165:6;17158:4;17153:3;17149:14;17142:4;17135:5;17131:16;17109:63;:::i;:::-;17226:2;17205:15;-1:-1:-1;;17201:29:1;17192:39;;;;17233:4;17188:50;;17036:208;-1:-1:-1;;17036:208:1:o;17761:274::-;17890:3;17928:6;17922:13;17944:53;17990:6;17985:3;17978:4;17970:6;17966:17;17944:53;:::i;:::-;18013:16;;;;;17898:137;-1:-1:-1;;17898:137:1:o;18271:915::-;18647:4;-1:-1:-1;;;;;18757:2:1;18749:6;18745:15;18734:9;18727:34;18809:2;18801:6;18797:15;18792:2;18781:9;18777:18;18770:43;;18849:3;18844:2;18833:9;18829:18;18822:31;18876:57;18928:3;18917:9;18913:19;18905:6;18876:57;:::i;:::-;18981:9;18973:6;18969:22;18964:2;18953:9;18949:18;18942:50;19015:44;19052:6;19044;19015:44;:::i;:::-;19096:22;;;19090:3;19075:19;;;19068:51;;;;-1:-1:-1;19128:20:1;;19177:2;19165:15;;18656:530;-1:-1:-1;;;;18656:530:1:o;20260:583::-;20482:4;-1:-1:-1;;;;;20592:2:1;20584:6;20580:15;20569:9;20562:34;20644:2;20636:6;20632:15;20627:2;20616:9;20612:18;20605:43;;20684:6;20679:2;20668:9;20664:18;20657:34;20727:6;20722:2;20711:9;20707:18;20700:34;20771:3;20765;20754:9;20750:19;20743:32;20792:45;20832:3;20821:9;20817:19;20809:6;20792:45;:::i;21543:261::-;21722:2;21711:9;21704:21;21685:4;21742:56;21794:2;21783:9;21779:18;21771:6;21742:56;:::i;21809:585::-;22094:2;22083:9;22076:21;22057:4;22120:56;22172:2;22161:9;22157:18;22149:6;22120:56;:::i;:::-;22224:9;22216:6;22212:22;22207:2;22196:9;22192:18;22185:50;22252:44;22289:6;22281;22252:44;:::i;:::-;22244:52;;;-1:-1:-1;;;;;22336:6:1;22332:55;22327:2;22316:9;22312:18;22305:83;22066:328;;;;;;:::o;22399:996::-;22840:3;22829:9;22822:22;22803:4;22867:57;22919:3;22908:9;22904:19;22896:6;22867:57;:::i;:::-;22972:9;22964:6;22960:22;22955:2;22944:9;22940:18;22933:50;23006:44;23043:6;23035;23006:44;:::i;:::-;22992:58;;23098:9;23090:6;23086:22;23081:2;23070:9;23066:18;23059:50;23132:44;23169:6;23161;23132:44;:::i;:::-;23118:58;;23224:9;23216:6;23212:22;23207:2;23196:9;23192:18;23185:50;23252:44;23289:6;23281;23252:44;:::i;:::-;23244:52;;;-1:-1:-1;;;;;23337:6:1;23333:55;23327:3;23316:9;23312:19;23305:84;22812:583;;;;;;;;:::o;24355:219::-;24504:2;24493:9;24486:21;24467:4;24524:44;24564:2;24553:9;24549:18;24541:6;24524:44;:::i;37482:462::-;37667:6;37656:9;37649:25;37710:2;37705;37694:9;37690:18;37683:30;37749:6;37744:2;37733:9;37729:18;37722:34;37806:6;37798;37793:2;37782:9;37778:18;37765:48;37630:4;37833:22;;;37857:2;37829:31;;;37822:45;;;;37928:2;37907:15;;;-1:-1:-1;;37903:29:1;37888:45;37884:54;;37639:305;-1:-1:-1;;37639:305:1:o;38138:275::-;38209:2;38203:9;38274:2;38255:13;;-1:-1:-1;;38251:27:1;38239:40;;38309:18;38294:34;;38330:22;;;38291:62;38288:2;;;38356:18;;:::i;:::-;38392:2;38385:22;38183:230;;-1:-1:-1;38183:230:1:o;38418:128::-;38458:3;38489:1;38485:6;38482:1;38479:13;38476:2;;;38495:18;;:::i;:::-;-1:-1:-1;38531:9:1;;38466:80::o;38551:168::-;38591:7;38657:1;38653;38649:6;38645:14;38642:1;38639:21;38634:1;38627:9;38620:17;38616:45;38613:2;;;38664:18;;:::i;:::-;-1:-1:-1;38704:9:1;;38603:116::o;38724:125::-;38764:4;38792:1;38789;38786:8;38783:2;;;38797:18;;:::i;:::-;-1:-1:-1;38834:9:1;;38773:76::o;38854:258::-;38926:1;38936:113;38950:6;38947:1;38944:13;38936:113;;;39026:11;;;39020:18;39007:11;;;39000:39;38972:2;38965:10;38936:113;;;39067:6;39064:1;39061:13;39058:2;;;39102:1;39093:6;39088:3;39084:16;39077:27;39058:2;;38907:205;;;:::o;39117:437::-;39196:1;39192:12;;;;39239;;;39260:2;;39314:4;39306:6;39302:17;39292:27;;39260:2;39367;39359:6;39356:14;39336:18;39333:38;39330:2;;;-1:-1:-1;;;39401:1:1;39394:88;39505:4;39502:1;39495:15;39533:4;39530:1;39523:15;39330:2;;39172:382;;;:::o;39559:135::-;39598:3;-1:-1:-1;;39619:17:1;;39616:2;;;39639:18;;:::i;:::-;-1:-1:-1;39686:1:1;39675:13;;39606:88::o;39699:266::-;39731:1;39757;39747:2;;-1:-1:-1;;;39789:1:1;39782:88;39893:4;39890:1;39883:15;39921:4;39918:1;39911:15;39747:2;-1:-1:-1;39950:9:1;;39737:228::o;39970:184::-;-1:-1:-1;;;40019:1:1;40012:88;40119:4;40116:1;40109:15;40143:4;40140:1;40133:15;40159:184;-1:-1:-1;;;40208:1:1;40201:88;40308:4;40305:1;40298:15;40332:4;40329:1;40322:15;40348:154;-1:-1:-1;;;;;40427:5:1;40423:54;40416:5;40413:65;40403:2;;40492:1;40489;40482:12;40507:118;40593:5;40586:13;40579:21;40572:5;40569:32;40559:2;;40615:1;40612;40605:12
Swarm Source
ipfs://e5328ca19483f2e306655c61a643e2234f71818f508499b11f8d17346ecf87fe
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.