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
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 11933144 | 1344 days ago | IN | 0 ETH | 0.24788756 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
13075284 | 1167 days ago | 0.04990371 ETH | ||||
13075284 | 1167 days ago | 0.04990371 ETH | ||||
13075004 | 1167 days ago | 0.09951761 ETH | ||||
13075004 | 1167 days ago | 0.09951761 ETH | ||||
13074951 | 1167 days ago | 0.2 ETH | ||||
13074951 | 1167 days ago | 0.2 ETH | ||||
13074946 | 1167 days ago | 0.2 ETH | ||||
13074946 | 1167 days ago | 0.2 ETH | ||||
13074895 | 1167 days ago | 0.07949688 ETH | ||||
13074895 | 1167 days ago | 0.07949688 ETH | ||||
13074848 | 1167 days ago | 0.04978441 ETH | ||||
13074848 | 1167 days ago | 0.04978441 ETH | ||||
13074828 | 1167 days ago | 0.2 ETH | ||||
13074828 | 1167 days ago | 0.2 ETH | ||||
13074428 | 1167 days ago | 0.2 ETH | ||||
13074428 | 1167 days ago | 0.2 ETH | ||||
13074418 | 1167 days ago | 0.2 ETH | ||||
13074418 | 1167 days ago | 0.2 ETH | ||||
13074418 | 1167 days ago | 0.2 ETH | ||||
13074418 | 1167 days ago | 0.2 ETH | ||||
13074411 | 1167 days ago | 0.2 ETH | ||||
13074411 | 1167 days ago | 0.2 ETH | ||||
13074286 | 1167 days ago | 0.2 ETH | ||||
13074286 | 1167 days ago | 0.2 ETH | ||||
13074280 | 1167 days ago | 0.2 ETH |
Loading...
Loading
Contract Name:
DFSExchange
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-02-26 */ pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; interface ERC20 { function totalSupply() external view returns (uint256 supply); function balanceOf(address _owner) external view returns (uint256 balance); function transfer(address _to, uint256 _value) external returns (bool success); function transferFrom(address _from, address _to, uint256 _value) external returns (bool success); function approve(address _spender, uint256 _value) external returns (bool success); function allowance(address _owner, address _spender) external view returns (uint256 remaining); function decimals() external view returns (uint256 digits); event Approval(address indexed _owner, address indexed _spender, uint256 _value); } abstract contract GasTokenInterface is ERC20 { function free(uint256 value) public virtual returns (bool success); function freeUpTo(uint256 value) public virtual returns (uint256 freed); function freeFrom(address from, uint256 value) public virtual returns (bool success); function freeFromUpTo(address from, uint256 value) public virtual returns (uint256 freed); } contract DSMath { function add(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x + y) >= x); } function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x - y) <= x); } function mul(uint256 x, uint256 y) internal pure returns (uint256 z) { require(y == 0 || (z = x * y) / y == x); } function div(uint256 x, uint256 y) internal pure returns (uint256 z) { return x / y; } function min(uint256 x, uint256 y) internal pure returns (uint256 z) { return x <= y ? x : y; } function max(uint256 x, uint256 y) internal pure returns (uint256 z) { return x >= y ? x : y; } function imin(int256 x, int256 y) internal pure returns (int256 z) { return x <= y ? x : y; } function imax(int256 x, int256 y) internal pure returns (int256 z) { return x >= y ? x : y; } uint256 constant WAD = 10**18; uint256 constant RAY = 10**27; function wmul(uint256 x, uint256 y) internal pure returns (uint256 z) { z = add(mul(x, y), WAD / 2) / WAD; } function rmul(uint256 x, uint256 y) internal pure returns (uint256 z) { z = add(mul(x, y), RAY / 2) / RAY; } function wdiv(uint256 x, uint256 y) internal pure returns (uint256 z) { z = add(mul(x, WAD), y / 2) / y; } function rdiv(uint256 x, uint256 y) internal pure returns (uint256 z) { z = add(mul(x, RAY), y / 2) / y; } // This famous algorithm is called "exponentiation by squaring" // and calculates x^n with x as fixed-point and n as regular unsigned. // // It's O(log n), instead of O(n) for naive repeated multiplication. // // These facts are why it works: // // If n is even, then x^n = (x^2)^(n/2). // If n is odd, then x^n = x * x^(n-1), // and applying the equation for even x gives // x^n = x * (x^2)^((n-1) / 2). // // Also, EVM division is flooring and // floor[(n-1) / 2] = floor[n / 2]. // function rpow(uint256 x, uint256 n) internal pure returns (uint256 z) { z = n % 2 != 0 ? x : RAY; for (n /= 2; n != 0; n /= 2) { x = rmul(x, x); if (n % 2 != 0) { z = rmul(z, x); } } } } abstract contract TokenInterface { address public constant WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; function allowance(address, address) public virtual returns (uint256); function balanceOf(address) public virtual returns (uint256); function approve(address, uint256) public virtual; function transfer(address, uint256) public virtual returns (bool); function transferFrom(address, address, uint256) public virtual returns (bool); function deposit() public virtual payable; function withdraw(uint256) public virtual; } interface ExchangeInterfaceV3 { function sell(address _srcAddr, address _destAddr, uint _srcAmount, bytes memory _additionalData) external payable returns (uint); function buy(address _srcAddr, address _destAddr, uint _destAmount, bytes memory _additionalData) external payable returns(uint); function getSellRate(address _srcAddr, address _destAddr, uint _srcAmount, bytes memory _additionalData) external view returns (uint); function getBuyRate(address _srcAddr, address _destAddr, uint _srcAmount, bytes memory _additionalData) external view returns (uint); } library Address { function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(ERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(ERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. */ function safeApprove(ERC20 token, address spender, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(ERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(ERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function _callOptionalReturn(ERC20 token, bytes memory data) private { bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } contract AdminAuth { using SafeERC20 for ERC20; address public owner; address public admin; modifier onlyOwner() { require(owner == msg.sender); _; } modifier onlyAdmin() { require(admin == msg.sender); _; } constructor() public { owner = msg.sender; admin = 0x25eFA336886C74eA8E282ac466BdCd0199f85BB9; } /// @notice Admin is set by owner first time, after that admin is super role and has permission to change owner /// @param _admin Address of multisig that becomes admin function setAdminByOwner(address _admin) public { require(msg.sender == owner); require(admin == address(0)); admin = _admin; } /// @notice Admin is able to set new admin /// @param _admin Address of multisig that becomes new admin function setAdminByAdmin(address _admin) public { require(msg.sender == admin); admin = _admin; } /// @notice Admin is able to change owner /// @param _owner Address of new owner function setOwnerByAdmin(address _owner) public { require(msg.sender == admin); owner = _owner; } /// @notice Destroy the contract function kill() public onlyOwner { selfdestruct(payable(owner)); } /// @notice withdraw stuck funds function withdrawStuckFunds(address _token, uint _amount) public onlyOwner { if (_token == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) { payable(owner).transfer(_amount); } else { ERC20(_token).safeTransfer(owner, _amount); } } } contract ZrxAllowlist is AdminAuth { mapping (address => bool) public zrxAllowlist; mapping(address => bool) private nonPayableAddrs; constructor() public { zrxAllowlist[0x6958F5e95332D93D21af0D7B9Ca85B8212fEE0A5] = true; zrxAllowlist[0x61935CbDd02287B511119DDb11Aeb42F1593b7Ef] = true; zrxAllowlist[0xDef1C0ded9bec7F1a1670819833240f027b25EfF] = true; zrxAllowlist[0x080bf510FCbF18b91105470639e9561022937712] = true; nonPayableAddrs[0x080bf510FCbF18b91105470639e9561022937712] = true; } function setAllowlistAddr(address _zrxAddr, bool _state) public onlyOwner { zrxAllowlist[_zrxAddr] = _state; } function isZrxAddr(address _zrxAddr) public view returns (bool) { return zrxAllowlist[_zrxAddr]; } function addNonPayableAddr(address _nonPayableAddr) public onlyOwner { nonPayableAddrs[_nonPayableAddr] = true; } function removeNonPayableAddr(address _nonPayableAddr) public onlyOwner { nonPayableAddrs[_nonPayableAddr] = false; } function isNonPayableAddr(address _addr) public view returns(bool) { return nonPayableAddrs[_addr]; } } contract DFSExchangeData { // first is empty to keep the legacy order in place enum ExchangeType { _, OASIS, KYBER, UNISWAP, ZEROX } enum ActionType { SELL, BUY } struct OffchainData { address wrapper; address exchangeAddr; address allowanceTarget; uint256 price; uint256 protocolFee; bytes callData; } struct ExchangeData { address srcAddr; address destAddr; uint256 srcAmount; uint256 destAmount; uint256 minPrice; uint256 dfsFeeDivider; // service fee divider address user; // user to check special fee address wrapper; bytes wrapperData; OffchainData offchainData; } function packExchangeData(ExchangeData memory _exData) public pure returns(bytes memory) { return abi.encode(_exData); } function unpackExchangeData(bytes memory _data) public pure returns(ExchangeData memory _exData) { _exData = abi.decode(_data, (ExchangeData)); } } contract Discount { address public owner; mapping(address => CustomServiceFee) public serviceFees; uint256 constant MAX_SERVICE_FEE = 400; struct CustomServiceFee { bool active; uint256 amount; } constructor() public { owner = msg.sender; } function isCustomFeeSet(address _user) public view returns (bool) { return serviceFees[_user].active; } function getCustomServiceFee(address _user) public view returns (uint256) { return serviceFees[_user].amount; } function setServiceFee(address _user, uint256 _fee) public { require(msg.sender == owner, "Only owner"); require(_fee >= MAX_SERVICE_FEE || _fee == 0); serviceFees[_user] = CustomServiceFee({active: true, amount: _fee}); } function disableServiceFee(address _user) public { require(msg.sender == owner, "Only owner"); serviceFees[_user] = CustomServiceFee({active: false, amount: 0}); } } // SPDX-License-Identifier: MIT abstract contract IFeeRecipient { function getFeeAddr() public view virtual returns (address); function changeWalletAddr(address _newWallet) public virtual; } contract DFSExchangeHelper { string public constant ERR_OFFCHAIN_DATA_INVALID = "Offchain data invalid"; using SafeERC20 for ERC20; address public constant KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; address public constant EXCHANGE_WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; IFeeRecipient public constant _feeRecipient = IFeeRecipient(0x39C4a92Dc506300c3Ea4c67ca4CA611102ee6F2A); address public constant DISCOUNT_ADDRESS = 0x1b14E8D511c9A4395425314f849bD737BAF8208F; address public constant SAVER_EXCHANGE_REGISTRY = 0x25dd3F51e0C3c3Ff164DDC02A8E4D65Bb9cBB12D; address public constant ZRX_ALLOWLIST_ADDR = 0x4BA1f38427b33B8ab7Bb0490200dAE1F1C36823F; function getDecimals(address _token) internal view returns (uint256) { if (_token == KYBER_ETH_ADDRESS) return 18; return ERC20(_token).decimals(); } function getBalance(address _tokenAddr) internal view returns (uint balance) { if (_tokenAddr == KYBER_ETH_ADDRESS) { balance = address(this).balance; } else { balance = ERC20(_tokenAddr).balanceOf(address(this)); } } function sendLeftover(address _srcAddr, address _destAddr, address payable _to) internal { // send back any leftover ether or tokens if (address(this).balance > 0) { _to.transfer(address(this).balance); } if (getBalance(_srcAddr) > 0) { ERC20(_srcAddr).safeTransfer(_to, getBalance(_srcAddr)); } if (getBalance(_destAddr) > 0) { ERC20(_destAddr).safeTransfer(_to, getBalance(_destAddr)); } } /// @notice Takes a feePercentage and sends it to wallet /// @param _amount Dai amount of the whole trade /// @param _user Address of the user /// @param _token Address of the token /// @param _dfsFeeDivider Dfs fee divider /// @return feeAmount Amount in Dai owner earned on the fee function getFee(uint256 _amount, address _user, address _token, uint256 _dfsFeeDivider) internal returns (uint256 feeAmount) { if (_dfsFeeDivider != 0 && Discount(DISCOUNT_ADDRESS).isCustomFeeSet(_user)) { _dfsFeeDivider = Discount(DISCOUNT_ADDRESS).getCustomServiceFee(_user); } if (_dfsFeeDivider == 0) { feeAmount = 0; } else { feeAmount = _amount / _dfsFeeDivider; // fee can't go over 10% of the whole amount if (feeAmount > (_amount / 10)) { feeAmount = _amount / 10; } address walletAddr = _feeRecipient.getFeeAddr(); if (_token == KYBER_ETH_ADDRESS) { payable(walletAddr).transfer(feeAmount); } else { ERC20(_token).safeTransfer(walletAddr, feeAmount); } } } function sliceUint(bytes memory bs, uint256 start) internal pure returns (uint256) { require(bs.length >= start + 32, "slicing out of range"); uint256 x; assembly { x := mload(add(bs, add(0x20, start))) } return x; } function writeUint256(bytes memory _b, uint256 _index, uint _input) internal pure { if (_b.length < _index + 32) { revert(ERR_OFFCHAIN_DATA_INVALID); } bytes32 input = bytes32(_input); _index += 32; // Read the bytes32 from array memory assembly { mstore(add(_b, _index), input) } } /// @notice Converts Kybers Eth address -> Weth /// @param _src Input address function ethToWethAddr(address _src) internal pure returns (address) { return _src == KYBER_ETH_ADDRESS ? EXCHANGE_WETH_ADDRESS : _src; } } contract SaverExchangeRegistry is AdminAuth { mapping(address => bool) private wrappers; constructor() public { wrappers[0x880A845A85F843a5c67DB2061623c6Fc3bB4c511] = true; wrappers[0x4c9B55f2083629A1F7aDa257ae984E03096eCD25] = true; wrappers[0x42A9237b872368E1bec4Ca8D26A928D7d39d338C] = true; } function addWrapper(address _wrapper) public onlyOwner { wrappers[_wrapper] = true; } function removeWrapper(address _wrapper) public onlyOwner { wrappers[_wrapper] = false; } function isWrapper(address _wrapper) public view returns(bool) { return wrappers[_wrapper]; } } abstract contract OffchainWrapperInterface is DFSExchangeData { function takeOrder( ExchangeData memory _exData, ActionType _type ) virtual public payable returns (bool success, uint256); } contract DFSExchangeCore is DFSExchangeHelper, DSMath, DFSExchangeData { string public constant ERR_SLIPPAGE_HIT = "Slippage hit"; string public constant ERR_DEST_AMOUNT_MISSING = "Dest amount missing"; string public constant ERR_WRAPPER_INVALID = "Wrapper invalid"; string public constant ERR_NOT_ZEROX_EXCHANGE = "Zerox exchange invalid"; /// @notice Internal method that preforms a sell on 0x/on-chain /// @dev Usefull for other DFS contract to integrate for exchanging /// @param exData Exchange data struct /// @return (address, uint) Address of the wrapper used and destAmount function _sell(ExchangeData memory exData) internal returns (address, uint) { address wrapper; uint swapedTokens; bool success; // if selling eth, convert to weth if (exData.srcAddr == KYBER_ETH_ADDRESS) { exData.srcAddr = ethToWethAddr(exData.srcAddr); TokenInterface(EXCHANGE_WETH_ADDRESS).deposit{value: exData.srcAmount}(); } exData.srcAmount -= getFee(exData.srcAmount, exData.user, exData.srcAddr, exData.dfsFeeDivider); // Try 0x first and then fallback on specific wrapper if (exData.offchainData.price > 0) { (success, swapedTokens) = takeOrder(exData, ActionType.SELL); if (success) { wrapper = exData.offchainData.exchangeAddr; } } // fallback to desired wrapper if 0x failed if (!success) { swapedTokens = saverSwap(exData, ActionType.SELL); wrapper = exData.wrapper; } // if anything is left in weth, pull it to user as eth if (getBalance(EXCHANGE_WETH_ADDRESS) > 0) { TokenInterface(EXCHANGE_WETH_ADDRESS).withdraw( TokenInterface(EXCHANGE_WETH_ADDRESS).balanceOf(address(this)) ); } if (exData.destAddr == EXCHANGE_WETH_ADDRESS) { require(getBalance(KYBER_ETH_ADDRESS) >= wmul(exData.minPrice, exData.srcAmount), ERR_SLIPPAGE_HIT); } else { require(getBalance(exData.destAddr) >= wmul(exData.minPrice, exData.srcAmount), ERR_SLIPPAGE_HIT); } return (wrapper, swapedTokens); } /// @notice Internal method that preforms a buy on 0x/on-chain /// @dev Usefull for other DFS contract to integrate for exchanging /// @param exData Exchange data struct /// @return (address, uint) Address of the wrapper used and srcAmount function _buy(ExchangeData memory exData) internal returns (address, uint) { address wrapper; uint swapedTokens; bool success; require(exData.destAmount != 0, ERR_DEST_AMOUNT_MISSING); exData.srcAmount -= getFee(exData.srcAmount, exData.user, exData.srcAddr, exData.dfsFeeDivider); // if selling eth, convert to weth if (exData.srcAddr == KYBER_ETH_ADDRESS) { exData.srcAddr = ethToWethAddr(exData.srcAddr); TokenInterface(EXCHANGE_WETH_ADDRESS).deposit{value: exData.srcAmount}(); } if (exData.offchainData.price > 0) { (success, swapedTokens) = takeOrder(exData, ActionType.BUY); if (success) { wrapper = exData.offchainData.exchangeAddr; } } // fallback to desired wrapper if 0x failed if (!success) { swapedTokens = saverSwap(exData, ActionType.BUY); wrapper = exData.wrapper; } // if anything is left in weth, pull it to user as eth if (getBalance(EXCHANGE_WETH_ADDRESS) > 0) { TokenInterface(EXCHANGE_WETH_ADDRESS).withdraw( TokenInterface(EXCHANGE_WETH_ADDRESS).balanceOf(address(this)) ); } if (exData.destAddr == EXCHANGE_WETH_ADDRESS) { require(getBalance(KYBER_ETH_ADDRESS) >= exData.destAmount, ERR_SLIPPAGE_HIT); } else { require(getBalance(exData.destAddr) >= exData.destAmount, ERR_SLIPPAGE_HIT); } return (wrapper, getBalance(exData.destAddr)); } /// @notice Takes order from 0x and returns bool indicating if it is successful /// @param _exData Exchange data function takeOrder( ExchangeData memory _exData, ActionType _type ) private returns (bool success, uint256) { if (!ZrxAllowlist(ZRX_ALLOWLIST_ADDR).isZrxAddr(_exData.offchainData.exchangeAddr)) { return (false, 0); } if (!SaverExchangeRegistry(SAVER_EXCHANGE_REGISTRY).isWrapper(_exData.offchainData.wrapper)) { return (false, 0); } // send src amount ERC20(_exData.srcAddr).safeTransfer(_exData.offchainData.wrapper, _exData.srcAmount); return OffchainWrapperInterface(_exData.offchainData.wrapper).takeOrder{value: _exData.offchainData.protocolFee}(_exData, _type); } /// @notice Calls wraper contract for exchage to preform an on-chain swap /// @param _exData Exchange data struct /// @param _type Type of action SELL|BUY /// @return swapedTokens For Sell that the destAmount, for Buy thats the srcAmount function saverSwap(ExchangeData memory _exData, ActionType _type) internal returns (uint swapedTokens) { require(SaverExchangeRegistry(SAVER_EXCHANGE_REGISTRY).isWrapper(_exData.wrapper), ERR_WRAPPER_INVALID); ERC20(_exData.srcAddr).safeTransfer(_exData.wrapper, _exData.srcAmount); if (_type == ActionType.SELL) { swapedTokens = ExchangeInterfaceV3(_exData.wrapper). sell(_exData.srcAddr, _exData.destAddr, _exData.srcAmount, _exData.wrapperData); } else { swapedTokens = ExchangeInterfaceV3(_exData.wrapper). buy(_exData.srcAddr, _exData.destAddr, _exData.destAmount, _exData.wrapperData); } } // solhint-disable-next-line no-empty-blocks receive() external virtual payable {} } contract DefisaverLogger { event LogEvent( address indexed contractAddress, address indexed caller, string indexed logName, bytes data ); // solhint-disable-next-line func-name-mixedcase function Log(address _contract, address _caller, string memory _logName, bytes memory _data) public { emit LogEvent(_contract, _caller, _logName, _data); } } contract GasBurner { // solhint-disable-next-line const-name-snakecase GasTokenInterface public constant gasToken = GasTokenInterface(0x0000000000b3F879cb30FE243b4Dfee438691c04); modifier burnGas(uint _amount) { if (gasToken.balanceOf(address(this)) >= _amount) { gasToken.free(_amount); } _; } } contract DFSExchange is DFSExchangeCore, AdminAuth, GasBurner { using SafeERC20 for ERC20; uint256 public constant SERVICE_FEE = 800; // 0.125% Fee // solhint-disable-next-line const-name-snakecase DefisaverLogger public constant logger = DefisaverLogger(0x5c55B921f590a89C1Ebe84dF170E655a82b62126); uint public burnAmount = 10; /// @notice Takes a src amount of tokens and converts it into the dest token /// @dev Takes fee from the _srcAmount before the exchange /// @param exData [srcAddr, destAddr, srcAmount, destAmount, minPrice, exchangeType, exchangeAddr, callData, price0x] /// @param _user User address who called the exchange function sell(ExchangeData memory exData, address payable _user) public payable burnGas(burnAmount) { exData.dfsFeeDivider = SERVICE_FEE; exData.user = _user; // Perform the exchange (address wrapper, uint destAmount) = _sell(exData); // send back any leftover ether or tokens sendLeftover(exData.srcAddr, exData.destAddr, _user); // log the event logger.Log(address(this), msg.sender, "ExchangeSell", abi.encode(wrapper, exData.srcAddr, exData.destAddr, exData.srcAmount, destAmount)); } /// @notice Takes a dest amount of tokens and converts it from the src token /// @dev Send always more than needed for the swap, extra will be returned /// @param exData [srcAddr, destAddr, srcAmount, destAmount, minPrice, exchangeType, exchangeAddr, callData, price0x] /// @param _user User address who called the exchange function buy(ExchangeData memory exData, address payable _user) public payable burnGas(burnAmount){ exData.dfsFeeDivider = SERVICE_FEE; exData.user = _user; // Perform the exchange (address wrapper, uint srcAmount) = _buy(exData); // send back any leftover ether or tokens sendLeftover(exData.srcAddr, exData.destAddr, _user); // log the event logger.Log(address(this), msg.sender, "ExchangeBuy", abi.encode(wrapper, exData.srcAddr, exData.destAddr, srcAmount, exData.destAmount)); } /// @notice Changes the amount of gas token we burn for each call /// @dev Only callable by the owner /// @param _newBurnAmount New amount of gas tokens to be burned function changeBurnAmount(uint _newBurnAmount) public { require(owner == msg.sender); burnAmount = _newBurnAmount; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"name":"DISCOUNT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERR_DEST_AMOUNT_MISSING","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERR_NOT_ZEROX_EXCHANGE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERR_OFFCHAIN_DATA_INVALID","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERR_SLIPPAGE_HIT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERR_WRAPPER_INVALID","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXCHANGE_WETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KYBER_ETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SAVER_EXCHANGE_REGISTRY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SERVICE_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZRX_ALLOWLIST_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_feeRecipient","outputs":[{"internalType":"contract IFeeRecipient","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAddr","type":"address"},{"internalType":"address","name":"destAddr","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"destAmount","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"dfsFeeDivider","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"bytes","name":"wrapperData","type":"bytes"},{"components":[{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"address","name":"allowanceTarget","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct DFSExchangeData.OffchainData","name":"offchainData","type":"tuple"}],"internalType":"struct DFSExchangeData.ExchangeData","name":"exData","type":"tuple"},{"internalType":"address payable","name":"_user","type":"address"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newBurnAmount","type":"uint256"}],"name":"changeBurnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasToken","outputs":[{"internalType":"contract GasTokenInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"logger","outputs":[{"internalType":"contract DefisaverLogger","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAddr","type":"address"},{"internalType":"address","name":"destAddr","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"destAmount","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"dfsFeeDivider","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"bytes","name":"wrapperData","type":"bytes"},{"components":[{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"address","name":"allowanceTarget","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct DFSExchangeData.OffchainData","name":"offchainData","type":"tuple"}],"internalType":"struct DFSExchangeData.ExchangeData","name":"_exData","type":"tuple"}],"name":"packExchangeData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAddr","type":"address"},{"internalType":"address","name":"destAddr","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"destAmount","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"dfsFeeDivider","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"bytes","name":"wrapperData","type":"bytes"},{"components":[{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"address","name":"allowanceTarget","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct DFSExchangeData.OffchainData","name":"offchainData","type":"tuple"}],"internalType":"struct DFSExchangeData.ExchangeData","name":"exData","type":"tuple"},{"internalType":"address payable","name":"_user","type":"address"}],"name":"sell","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdminByAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdminByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwnerByAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"unpackExchangeData","outputs":[{"components":[{"internalType":"address","name":"srcAddr","type":"address"},{"internalType":"address","name":"destAddr","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"destAmount","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"dfsFeeDivider","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"bytes","name":"wrapperData","type":"bytes"},{"components":[{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"address","name":"allowanceTarget","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct DFSExchangeData.OffchainData","name":"offchainData","type":"tuple"}],"internalType":"struct DFSExchangeData.ExchangeData","name":"_exData","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawStuckFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600a60025534801561001557600080fd5b50600080546001600160a01b03199081163317909155600180549091167325efa336886c74ea8e282ac466bdcd0199f85bb9179055612763806100596000396000f3fe6080604052600436106101a05760003560e01c806381b94280116100ec578063ae08fd101161008a578063cc694d4811610064578063cc694d481461040c578063deca5f8814610421578063f24ccbfe14610441578063f851a44014610456576101a7565b8063ae08fd10146103cd578063c50ebaf8146103e2578063c91d59fe146103f7576101a7565b8063a342f238116100c6578063a342f23814610356578063a3b8e5d11461036b578063a46a66c914610398578063a7304bf7146103ad576101a7565b806381b94280146103175780638c8a79581461032c5780638da5cb5b14610341576101a7565b8063314b63321161015957806341c0e1b51161013357806341c0e1b5146102b6578063449b9ffa146102cb578063486a7e6b146102e057806350c86de514610302576101a7565b8063314b63321461026e57806332bf1a82146102835780633a12832214610296576101a7565b806308d4f52a146101ac5780630f7379b7146101e25780631e48907b146101f75780631f80d86814610217578063278d58311461023757806329f7fc9e1461024c576101a7565b366101a757005b600080fd5b3480156101b857600080fd5b506101cc6101c736600461216e565b61046b565b6040516101d991906125be565b60405180910390f35b6101f56101f03660046122a9565b610495565b005b34801561020357600080fd5b506101f5610212366004612087565b610687565b34801561022357600080fd5b506101f56102323660046122f9565b6106c0565b34801561024357600080fd5b506101cc6106dc565b34801561025857600080fd5b50610261610704565b6040516101d99190612482565b34801561027a57600080fd5b5061026161071c565b6101f56102913660046122a9565b610734565b3480156102a257600080fd5b506101f56102b13660046120bf565b6108ec565b3480156102c257600080fd5b506101f5610985565b3480156102d757600080fd5b506101cc6109aa565b3480156102ec57600080fd5b506102f56109dc565b6040516101d99190612691565b34801561030e57600080fd5b506102f56109e2565b34801561032357600080fd5b506102616109e8565b34801561033857600080fd5b50610261610a00565b34801561034d57600080fd5b50610261610a18565b34801561036257600080fd5b50610261610a27565b34801561037757600080fd5b5061038b61038636600461213b565b610a3f565b6040516101d99190612652565b3480156103a457600080fd5b50610261610a61565b3480156103b957600080fd5b506101f56103c8366004612087565b610a79565b3480156103d957600080fd5b506101cc610ab2565b3480156103ee57600080fd5b506101cc610ae3565b34801561040357600080fd5b50610261610b12565b34801561041857600080fd5b506101cc610b25565b34801561042d57600080fd5b506101f561043c366004612087565b610b50565b34801561044d57600080fd5b50610261610b7d565b34801561046257600080fd5b50610261610b95565b60608160405160200161047e9190612652565b60405160208183030381529060405290505b919050565b6002546040516370a0823160e01b815281906eb3f879cb30fe243b4dfee438691c04906370a08231906104cc903090600401612482565b60206040518083038186803b1580156104e457600080fd5b505afa1580156104f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c9190612311565b106105a75760405163d8ccd0f360e01b81526eb3f879cb30fe243b4dfee438691c049063d8ccd0f390610553908490600401612691565b602060405180830381600087803b15801561056d57600080fd5b505af1158015610581573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a591906120ea565b505b61032060a08401526001600160a01b03821660c08401526000806105ca85610ba4565b915091506105e18560000151866020015186610f31565b84516020808701516060880151604051735c55b921f590a89c1ebe84df170e655a82b621269463d061ce509430943394610621948b94938b92910161253e565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161064e93929190612496565b600060405180830381600087803b15801561066857600080fd5b505af115801561067c573d6000803e3d6000fd5b505050505050505050565b6001546001600160a01b0316331461069e57600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146106d757600080fd5b600255565b6040518060400160405280600c81526020016b14db1a5c1c1859d9481a1a5d60a21b81525081565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b7325dd3f51e0c3c3ff164ddc02a8e4d65bb9cbb12d81565b6002546040516370a0823160e01b815281906eb3f879cb30fe243b4dfee438691c04906370a082319061076b903090600401612482565b60206040518083038186803b15801561078357600080fd5b505afa158015610797573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107bb9190612311565b106108465760405163d8ccd0f360e01b81526eb3f879cb30fe243b4dfee438691c049063d8ccd0f3906107f2908490600401612691565b602060405180830381600087803b15801561080c57600080fd5b505af1158015610820573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084491906120ea565b505b61032060a08401526001600160a01b03821660c084015260008061086985610fd1565b915091506108808560000151866020015186610f31565b84516020808701516040808901519051735c55b921f590a89c1ebe84df170e655a82b621269463d061ce5094309433946108bf948b94938b910161253e565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161064e939291906124ee565b6000546001600160a01b0316331461090357600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038316141561096757600080546040516001600160a01b039091169183156108fc02918491818181858888f19350505050158015610961573d6000803e3d6000fd5b50610981565b600054610981906001600160a01b03848116911683611318565b5050565b6000546001600160a01b0316331461099c57600080fd5b6000546001600160a01b0316ff5b6040518060400160405280601681526020017516995c9bde08195e18da185b99d9481a5b9d985b1a5960521b81525081565b60025481565b61032081565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b734ba1f38427b33b8ab7bb0490200dae1f1c36823f81565b6000546001600160a01b031681565b7339c4a92dc506300c3ea4c67ca4ca611102ee6f2a81565b610a47611cf9565b81806020019051810190610a5b91906121a1565b92915050565b731b14e8d511c9a4395425314f849bd737baf8208f81565b6001546001600160a01b03163314610a9057600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6040518060400160405280601581526020017413d99998da185a5b8819185d18481a5b9d985b1a59605a1b81525081565b604051806040016040528060138152602001724465737420616d6f756e74206d697373696e6760681b81525081565b6eb3f879cb30fe243b4dfee438691c0481565b6040518060400160405280600f81526020016e15dc985c1c195c881a5b9d985b1a59608a1b81525081565b6000546001600160a01b03163314610b6757600080fd5b6001546001600160a01b031615610a9057600080fd5b735c55b921f590a89c1ebe84df170e655a82b6212681565b6001546001600160a01b031681565b6000806000806000856060015160001415604051806040016040528060138152602001724465737420616d6f756e74206d697373696e6760681b81525090610c085760405162461bcd60e51b8152600401610bff91906125be565b60405180910390fd5b50610c2586604001518760c0015188600001518960a0015161136e565b60408701805191909103905285516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610cd8578551610c62906115c2565b6001600160a01b031686526040808701518151630d0e30db60e41b8152915173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29263d0e30db09291600480830192600092919082900301818588803b158015610cbe57600080fd5b505af1158015610cd2573d6000803e3d6000fd5b50505050505b6101208601516060015115610d0957610cf2866001611609565b925090508015610d09578561012001516020015192505b80610d2357610d19866001611807565b91508560e0015192505b6000610d4273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2611a50565b1115610e28576040516370a0823160e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d9082906370a0823190610d87903090600401612482565b602060405180830381600087803b158015610da157600080fd5b505af1158015610db5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd99190612311565b6040518263ffffffff1660e01b8152600401610df59190612691565b600060405180830381600087803b158015610e0f57600080fd5b505af1158015610e23573d6000803e3d6000fd5b505050505b60208601516001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21415610ebe578560600151610e7373eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611a50565b10156040518060400160405280600c81526020016b14db1a5c1c1859d9481a1a5d60a21b81525090610eb85760405162461bcd60e51b8152600401610bff91906125be565b50610f17565b8560600151610ed08760200151611a50565b10156040518060400160405280600c81526020016b14db1a5c1c1859d9481a1a5d60a21b81525090610f155760405162461bcd60e51b8152600401610bff91906125be565b505b82610f258760200151611a50565b94509450505050915091565b4715610f6e576040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610f6c573d6000803e3d6000fd5b505b6000610f7984611a50565b1115610f9d57610f9d81610f8c85611a50565b6001600160a01b0386169190611318565b6000610fa883611a50565b1115610fcc57610fcc81610fbb84611a50565b6001600160a01b0385169190611318565b505050565b600080600080600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b031686600001516001600160a01b0316141561108c578551611016906115c2565b6001600160a01b031686526040808701518151630d0e30db60e41b8152915173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29263d0e30db09291600480830192600092919082900301818588803b15801561107257600080fd5b505af1158015611086573d6000803e3d6000fd5b50505050505b6110a886604001518760c0015188600001518960a0015161136e565b60408701805191909103905261012086015160600151156110e5576110ce866000611609565b9250905080156110e5578561012001516020015192505b806110ff576110f5866000611807565b91508560e0015192505b600061111e73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2611a50565b1115611204576040516370a0823160e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d9082906370a0823190611163903090600401612482565b602060405180830381600087803b15801561117d57600080fd5b505af1158015611191573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b59190612311565b6040518263ffffffff1660e01b81526004016111d19190612691565b600060405180830381600087803b1580156111eb57600080fd5b505af11580156111ff573d6000803e3d6000fd5b505050505b60208601516001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214156112a75761123f86608001518760400151611afa565b61125c73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611a50565b10156040518060400160405280600c81526020016b14db1a5c1c1859d9481a1a5d60a21b815250906112a15760405162461bcd60e51b8152600401610bff91906125be565b5061130d565b6112b986608001518760400151611afa565b6112c68760200151611a50565b10156040518060400160405280600c81526020016b14db1a5c1c1859d9481a1a5d60a21b8152509061130b5760405162461bcd60e51b8152600401610bff91906125be565b505b509092509050915091565b610fcc8363a9059cbb60e01b84846040516024016113379291906125a5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611b2f565b600081158015906114015750604051632cdc77ab60e21b8152731b14e8d511c9a4395425314f849bd737baf8208f9063b371deac906113b1908790600401612482565b60206040518083038186803b1580156113c957600080fd5b505afa1580156113dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140191906120ea565b1561149057604051636eeb543160e01b8152731b14e8d511c9a4395425314f849bd737baf8208f90636eeb54319061143d908790600401612482565b60206040518083038186803b15801561145557600080fd5b505afa158015611469573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148d9190612311565b91505b8161149d575060006115ba565b8185816114a657fe5b049050600a85048111156114ba5750600a84045b60007339c4a92dc506300c3ea4c67ca4ca611102ee6f2a6001600160a01b031663b38779eb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561150957600080fd5b505afa15801561151d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154191906120a3565b90506001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156115a4576040516001600160a01b0382169083156108fc029084906000818181858888f1935050505015801561159e573d6000803e3d6000fd5b506115b8565b6115b86001600160a01b0385168284611318565b505b949350505050565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146115ee5781610a5b565b5073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2919050565b610120820151602001516040516302f5cc7960e11b81526000918291734ba1f38427b33b8ab7bb0490200dae1f1c36823f916305eb98f29161164e9190600401612482565b60206040518083038186803b15801561166657600080fd5b505afa15801561167a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169e91906120ea565b6116ad57506000905080611800565b6101208401515160405163e0aa279760e01b81527325dd3f51e0c3c3ff164ddc02a8e4d65bb9cbb12d9163e0aa2797916116ea9190600401612482565b60206040518083038186803b15801561170257600080fd5b505afa158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a91906120ea565b61174957506000905080611800565b610120840151516040850151855161176c926001600160a01b0390911691611318565b610120840151805160809091015160405163097396a160e31b81526001600160a01b0390921691634b9cb50891906117aa9088908890600401612665565b60408051808303818588803b1580156117c257600080fd5b505af11580156117d6573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117fb919061210a565b915091505b9250929050565b60e082015160405163e0aa279760e01b81526000917325dd3f51e0c3c3ff164ddc02a8e4d65bb9cbb12d9163e0aa27979161184491600401612482565b60206040518083038186803b15801561185c57600080fd5b505afa158015611870573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189491906120ea565b6040518060400160405280600f81526020016e15dc985c1c195c881a5b9d985b1a59608a1b815250906118da5760405162461bcd60e51b8152600401610bff91906125be565b5060e0830151604084015184516118fc926001600160a01b0390911691611318565b600082600181111561190a57fe5b14156119b0578260e001516001600160a01b0316635b6f36fc8460000151856020015186604001518761010001516040518563ffffffff1660e01b81526004016119579493929190612572565b602060405180830381600087803b15801561197157600080fd5b505af1158015611985573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a99190612311565b9050610a5b565b8260e001516001600160a01b0316633924db668460000151856020015186606001518761010001516040518563ffffffff1660e01b81526004016119f79493929190612572565b602060405180830381600087803b158015611a1157600080fd5b505af1158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a499190612311565b9392505050565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611a7e575047610490565b6040516370a0823160e01b81526001600160a01b038316906370a0823190611aaa903090600401612482565b60206040518083038186803b158015611ac257600080fd5b505afa158015611ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5b9190612311565b6000670de0b6b3a7640000611b20611b128585611bbe565b6706f05b59d3b20000611be2565b81611b2757fe5b049392505050565b6060611b84826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611bf29092919063ffffffff16565b805190915015610fcc5780806020019051810190611ba291906120ea565b610fcc5760405162461bcd60e51b8152600401610bff90612608565b6000811580611bd957505080820282828281611bd657fe5b04145b610a5b57600080fd5b80820182811015610a5b57600080fd5b60606115ba84846000856060611c0785611cc0565b611c235760405162461bcd60e51b8152600401610bff906125d1565b60006060866001600160a01b03168587604051611c409190612466565b60006040518083038185875af1925050503d8060008114611c7d576040519150601f19603f3d011682016040523d82523d6000602084013e611c82565b606091505b50915091508115611c965791506115ba9050565b805115611ca65780518082602001fd5b8360405162461bcd60e51b8152600401610bff91906125be565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906115ba575050151592915050565b60405180610140016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160608152602001611d70611d75565b905290565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001606081525090565b8035610a5b81612715565b8051610a5b81612715565b600082601f830112611dec578081fd5b8135611dff611dfa826126c1565b61269a565b9150808252836020828501011115611e1657600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112611e3f578081fd5b8151611e4d611dfa826126c1565b9150808252836020828501011115611e6457600080fd5b611e758160208401602086016126e5565b5092915050565b6000610140808385031215611e8f578182fd5b611e988161269a565b915050611ea58383611dc6565b8152611eb48360208401611dc6565b602082015260408201356040820152606082013560608201526080820135608082015260a082013560a0820152611eee8360c08401611dc6565b60c0820152611f008360e08401611dc6565b60e08201526101008083013567ffffffffffffffff80821115611f2257600080fd5b611f2e86838701611ddc565b83850152610120925082850135915080821115611f4a57600080fd5b50611f5785828601611f63565b82840152505092915050565b600060c08284031215611f74578081fd5b611f7e60c061269a565b90508135611f8b81612715565b81526020820135611f9b81612715565b60208201526040820135611fae81612715565b80604083015250606082013560608201526080820135608082015260a082013567ffffffffffffffff811115611fe357600080fd5b611fef84828501611ddc565b60a08301525092915050565b600060c0828403121561200c578081fd5b61201660c061269a565b9050815161202381612715565b8152602082015161203381612715565b6020820152604082015161204681612715565b80604083015250606082015160608201526080820151608082015260a082015167ffffffffffffffff81111561207b57600080fd5b611fef84828501611e2f565b600060208284031215612098578081fd5b8135611a4981612715565b6000602082840312156120b4578081fd5b8151611a4981612715565b600080604083850312156120d1578081fd5b82356120dc81612715565b946020939093013593505050565b6000602082840312156120fb578081fd5b81518015158114611a49578182fd5b6000806040838503121561211c578182fd5b8251801515811461212b578283fd5b6020939093015192949293505050565b60006020828403121561214c578081fd5b813567ffffffffffffffff811115612162578182fd5b6115ba84828501611ddc565b60006020828403121561217f578081fd5b813567ffffffffffffffff811115612195578182fd5b6115ba84828501611e7c565b6000602082840312156121b2578081fd5b815167ffffffffffffffff808211156121c9578283fd5b81840191506101408083870312156121df578384fd5b6121e88161269a565b90506121f48684611dd1565b81526122038660208501611dd1565b602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015261223d8660c08501611dd1565b60c082015261224f8660e08501611dd1565b60e08201526101008084015183811115612267578586fd5b61227388828701611e2f565b828401525050610120808401518381111561228c578586fd5b61229888828701611ffb565b918301919091525095945050505050565b600080604083850312156122bb578182fd5b823567ffffffffffffffff8111156122d1578283fd5b6122dd85828601611e7c565b92505060208301356122ee81612715565b809150509250929050565b60006020828403121561230a578081fd5b5035919050565b600060208284031215612322578081fd5b5051919050565b6001600160a01b03169052565b6000815180845261234e8160208601602086016126e5565b601f01601f19169290920160200192915050565b6000610140612372848451612329565b60208301516123846020860182612329565b5060408301516040850152606083015160608501526080830151608085015260a083015160a085015260c08301516123bf60c0860182612329565b5060e08301516123d260e0860182612329565b506101008084015182828701526123eb83870182612336565b9250505061012080840151858303828701526124078382612411565b9695505050505050565b600060018060a01b0380835116845280602084015116602085015280604084015116604085015250606082015160608401526080820151608084015260a082015160c060a08501526115ba60c0850182612336565b600082516124788184602087016126e5565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03848116825283166020820152608060408201819052600b908201526a45786368616e676542757960a81b60a082015260c0606082018190526000906124e590830184612336565b95945050505050565b6001600160a01b03848116825283166020820152608060408201819052600c908201526b115e18da185b99d954d95b1b60a21b60a082015260c0606082018190526000906124e590830184612336565b6001600160a01b03958616815293851660208501529190931660408301526060820192909252608081019190915260a00190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061240790830184612336565b6001600160a01b03929092168252602082015260400190565b600060208252611a496020830184612336565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b600060208252611a496020830184612362565b6000604082526126786040830185612362565b90506002831061268457fe5b8260208301529392505050565b90815260200190565b60405181810167ffffffffffffffff811182821017156126b957600080fd5b604052919050565b600067ffffffffffffffff8211156126d7578081fd5b50601f01601f191660200190565b60005b838110156127005781810151838201526020016126e8565b8381111561270f576000848401525b50505050565b6001600160a01b038116811461272a57600080fd5b5056fea26469706673582212200d80e72ad52fa4ee242c0dd79cce5b92b7979c9824049b91fed183c259220f9364736f6c634300060c0033
Deployed Bytecode
0x6080604052600436106101a05760003560e01c806381b94280116100ec578063ae08fd101161008a578063cc694d4811610064578063cc694d481461040c578063deca5f8814610421578063f24ccbfe14610441578063f851a44014610456576101a7565b8063ae08fd10146103cd578063c50ebaf8146103e2578063c91d59fe146103f7576101a7565b8063a342f238116100c6578063a342f23814610356578063a3b8e5d11461036b578063a46a66c914610398578063a7304bf7146103ad576101a7565b806381b94280146103175780638c8a79581461032c5780638da5cb5b14610341576101a7565b8063314b63321161015957806341c0e1b51161013357806341c0e1b5146102b6578063449b9ffa146102cb578063486a7e6b146102e057806350c86de514610302576101a7565b8063314b63321461026e57806332bf1a82146102835780633a12832214610296576101a7565b806308d4f52a146101ac5780630f7379b7146101e25780631e48907b146101f75780631f80d86814610217578063278d58311461023757806329f7fc9e1461024c576101a7565b366101a757005b600080fd5b3480156101b857600080fd5b506101cc6101c736600461216e565b61046b565b6040516101d991906125be565b60405180910390f35b6101f56101f03660046122a9565b610495565b005b34801561020357600080fd5b506101f5610212366004612087565b610687565b34801561022357600080fd5b506101f56102323660046122f9565b6106c0565b34801561024357600080fd5b506101cc6106dc565b34801561025857600080fd5b50610261610704565b6040516101d99190612482565b34801561027a57600080fd5b5061026161071c565b6101f56102913660046122a9565b610734565b3480156102a257600080fd5b506101f56102b13660046120bf565b6108ec565b3480156102c257600080fd5b506101f5610985565b3480156102d757600080fd5b506101cc6109aa565b3480156102ec57600080fd5b506102f56109dc565b6040516101d99190612691565b34801561030e57600080fd5b506102f56109e2565b34801561032357600080fd5b506102616109e8565b34801561033857600080fd5b50610261610a00565b34801561034d57600080fd5b50610261610a18565b34801561036257600080fd5b50610261610a27565b34801561037757600080fd5b5061038b61038636600461213b565b610a3f565b6040516101d99190612652565b3480156103a457600080fd5b50610261610a61565b3480156103b957600080fd5b506101f56103c8366004612087565b610a79565b3480156103d957600080fd5b506101cc610ab2565b3480156103ee57600080fd5b506101cc610ae3565b34801561040357600080fd5b50610261610b12565b34801561041857600080fd5b506101cc610b25565b34801561042d57600080fd5b506101f561043c366004612087565b610b50565b34801561044d57600080fd5b50610261610b7d565b34801561046257600080fd5b50610261610b95565b60608160405160200161047e9190612652565b60405160208183030381529060405290505b919050565b6002546040516370a0823160e01b815281906eb3f879cb30fe243b4dfee438691c04906370a08231906104cc903090600401612482565b60206040518083038186803b1580156104e457600080fd5b505afa1580156104f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051c9190612311565b106105a75760405163d8ccd0f360e01b81526eb3f879cb30fe243b4dfee438691c049063d8ccd0f390610553908490600401612691565b602060405180830381600087803b15801561056d57600080fd5b505af1158015610581573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a591906120ea565b505b61032060a08401526001600160a01b03821660c08401526000806105ca85610ba4565b915091506105e18560000151866020015186610f31565b84516020808701516060880151604051735c55b921f590a89c1ebe84df170e655a82b621269463d061ce509430943394610621948b94938b92910161253e565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161064e93929190612496565b600060405180830381600087803b15801561066857600080fd5b505af115801561067c573d6000803e3d6000fd5b505050505050505050565b6001546001600160a01b0316331461069e57600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146106d757600080fd5b600255565b6040518060400160405280600c81526020016b14db1a5c1c1859d9481a1a5d60a21b81525081565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b7325dd3f51e0c3c3ff164ddc02a8e4d65bb9cbb12d81565b6002546040516370a0823160e01b815281906eb3f879cb30fe243b4dfee438691c04906370a082319061076b903090600401612482565b60206040518083038186803b15801561078357600080fd5b505afa158015610797573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107bb9190612311565b106108465760405163d8ccd0f360e01b81526eb3f879cb30fe243b4dfee438691c049063d8ccd0f3906107f2908490600401612691565b602060405180830381600087803b15801561080c57600080fd5b505af1158015610820573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084491906120ea565b505b61032060a08401526001600160a01b03821660c084015260008061086985610fd1565b915091506108808560000151866020015186610f31565b84516020808701516040808901519051735c55b921f590a89c1ebe84df170e655a82b621269463d061ce5094309433946108bf948b94938b910161253e565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161064e939291906124ee565b6000546001600160a01b0316331461090357600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038316141561096757600080546040516001600160a01b039091169183156108fc02918491818181858888f19350505050158015610961573d6000803e3d6000fd5b50610981565b600054610981906001600160a01b03848116911683611318565b5050565b6000546001600160a01b0316331461099c57600080fd5b6000546001600160a01b0316ff5b6040518060400160405280601681526020017516995c9bde08195e18da185b99d9481a5b9d985b1a5960521b81525081565b60025481565b61032081565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b734ba1f38427b33b8ab7bb0490200dae1f1c36823f81565b6000546001600160a01b031681565b7339c4a92dc506300c3ea4c67ca4ca611102ee6f2a81565b610a47611cf9565b81806020019051810190610a5b91906121a1565b92915050565b731b14e8d511c9a4395425314f849bd737baf8208f81565b6001546001600160a01b03163314610a9057600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6040518060400160405280601581526020017413d99998da185a5b8819185d18481a5b9d985b1a59605a1b81525081565b604051806040016040528060138152602001724465737420616d6f756e74206d697373696e6760681b81525081565b6eb3f879cb30fe243b4dfee438691c0481565b6040518060400160405280600f81526020016e15dc985c1c195c881a5b9d985b1a59608a1b81525081565b6000546001600160a01b03163314610b6757600080fd5b6001546001600160a01b031615610a9057600080fd5b735c55b921f590a89c1ebe84df170e655a82b6212681565b6001546001600160a01b031681565b6000806000806000856060015160001415604051806040016040528060138152602001724465737420616d6f756e74206d697373696e6760681b81525090610c085760405162461bcd60e51b8152600401610bff91906125be565b60405180910390fd5b50610c2586604001518760c0015188600001518960a0015161136e565b60408701805191909103905285516001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415610cd8578551610c62906115c2565b6001600160a01b031686526040808701518151630d0e30db60e41b8152915173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29263d0e30db09291600480830192600092919082900301818588803b158015610cbe57600080fd5b505af1158015610cd2573d6000803e3d6000fd5b50505050505b6101208601516060015115610d0957610cf2866001611609565b925090508015610d09578561012001516020015192505b80610d2357610d19866001611807565b91508560e0015192505b6000610d4273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2611a50565b1115610e28576040516370a0823160e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d9082906370a0823190610d87903090600401612482565b602060405180830381600087803b158015610da157600080fd5b505af1158015610db5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd99190612311565b6040518263ffffffff1660e01b8152600401610df59190612691565b600060405180830381600087803b158015610e0f57600080fd5b505af1158015610e23573d6000803e3d6000fd5b505050505b60208601516001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21415610ebe578560600151610e7373eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611a50565b10156040518060400160405280600c81526020016b14db1a5c1c1859d9481a1a5d60a21b81525090610eb85760405162461bcd60e51b8152600401610bff91906125be565b50610f17565b8560600151610ed08760200151611a50565b10156040518060400160405280600c81526020016b14db1a5c1c1859d9481a1a5d60a21b81525090610f155760405162461bcd60e51b8152600401610bff91906125be565b505b82610f258760200151611a50565b94509450505050915091565b4715610f6e576040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610f6c573d6000803e3d6000fd5b505b6000610f7984611a50565b1115610f9d57610f9d81610f8c85611a50565b6001600160a01b0386169190611318565b6000610fa883611a50565b1115610fcc57610fcc81610fbb84611a50565b6001600160a01b0385169190611318565b505050565b600080600080600073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b031686600001516001600160a01b0316141561108c578551611016906115c2565b6001600160a01b031686526040808701518151630d0e30db60e41b8152915173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29263d0e30db09291600480830192600092919082900301818588803b15801561107257600080fd5b505af1158015611086573d6000803e3d6000fd5b50505050505b6110a886604001518760c0015188600001518960a0015161136e565b60408701805191909103905261012086015160600151156110e5576110ce866000611609565b9250905080156110e5578561012001516020015192505b806110ff576110f5866000611807565b91508560e0015192505b600061111e73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2611a50565b1115611204576040516370a0823160e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d9082906370a0823190611163903090600401612482565b602060405180830381600087803b15801561117d57600080fd5b505af1158015611191573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b59190612311565b6040518263ffffffff1660e01b81526004016111d19190612691565b600060405180830381600087803b1580156111eb57600080fd5b505af11580156111ff573d6000803e3d6000fd5b505050505b60208601516001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc214156112a75761123f86608001518760400151611afa565b61125c73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee611a50565b10156040518060400160405280600c81526020016b14db1a5c1c1859d9481a1a5d60a21b815250906112a15760405162461bcd60e51b8152600401610bff91906125be565b5061130d565b6112b986608001518760400151611afa565b6112c68760200151611a50565b10156040518060400160405280600c81526020016b14db1a5c1c1859d9481a1a5d60a21b8152509061130b5760405162461bcd60e51b8152600401610bff91906125be565b505b509092509050915091565b610fcc8363a9059cbb60e01b84846040516024016113379291906125a5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611b2f565b600081158015906114015750604051632cdc77ab60e21b8152731b14e8d511c9a4395425314f849bd737baf8208f9063b371deac906113b1908790600401612482565b60206040518083038186803b1580156113c957600080fd5b505afa1580156113dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140191906120ea565b1561149057604051636eeb543160e01b8152731b14e8d511c9a4395425314f849bd737baf8208f90636eeb54319061143d908790600401612482565b60206040518083038186803b15801561145557600080fd5b505afa158015611469573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148d9190612311565b91505b8161149d575060006115ba565b8185816114a657fe5b049050600a85048111156114ba5750600a84045b60007339c4a92dc506300c3ea4c67ca4ca611102ee6f2a6001600160a01b031663b38779eb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561150957600080fd5b505afa15801561151d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154191906120a3565b90506001600160a01b03841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156115a4576040516001600160a01b0382169083156108fc029084906000818181858888f1935050505015801561159e573d6000803e3d6000fd5b506115b8565b6115b86001600160a01b0385168284611318565b505b949350505050565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146115ee5781610a5b565b5073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2919050565b610120820151602001516040516302f5cc7960e11b81526000918291734ba1f38427b33b8ab7bb0490200dae1f1c36823f916305eb98f29161164e9190600401612482565b60206040518083038186803b15801561166657600080fd5b505afa15801561167a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169e91906120ea565b6116ad57506000905080611800565b6101208401515160405163e0aa279760e01b81527325dd3f51e0c3c3ff164ddc02a8e4d65bb9cbb12d9163e0aa2797916116ea9190600401612482565b60206040518083038186803b15801561170257600080fd5b505afa158015611716573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173a91906120ea565b61174957506000905080611800565b610120840151516040850151855161176c926001600160a01b0390911691611318565b610120840151805160809091015160405163097396a160e31b81526001600160a01b0390921691634b9cb50891906117aa9088908890600401612665565b60408051808303818588803b1580156117c257600080fd5b505af11580156117d6573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117fb919061210a565b915091505b9250929050565b60e082015160405163e0aa279760e01b81526000917325dd3f51e0c3c3ff164ddc02a8e4d65bb9cbb12d9163e0aa27979161184491600401612482565b60206040518083038186803b15801561185c57600080fd5b505afa158015611870573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189491906120ea565b6040518060400160405280600f81526020016e15dc985c1c195c881a5b9d985b1a59608a1b815250906118da5760405162461bcd60e51b8152600401610bff91906125be565b5060e0830151604084015184516118fc926001600160a01b0390911691611318565b600082600181111561190a57fe5b14156119b0578260e001516001600160a01b0316635b6f36fc8460000151856020015186604001518761010001516040518563ffffffff1660e01b81526004016119579493929190612572565b602060405180830381600087803b15801561197157600080fd5b505af1158015611985573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a99190612311565b9050610a5b565b8260e001516001600160a01b0316633924db668460000151856020015186606001518761010001516040518563ffffffff1660e01b81526004016119f79493929190612572565b602060405180830381600087803b158015611a1157600080fd5b505af1158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a499190612311565b9392505050565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611a7e575047610490565b6040516370a0823160e01b81526001600160a01b038316906370a0823190611aaa903090600401612482565b60206040518083038186803b158015611ac257600080fd5b505afa158015611ad6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5b9190612311565b6000670de0b6b3a7640000611b20611b128585611bbe565b6706f05b59d3b20000611be2565b81611b2757fe5b049392505050565b6060611b84826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611bf29092919063ffffffff16565b805190915015610fcc5780806020019051810190611ba291906120ea565b610fcc5760405162461bcd60e51b8152600401610bff90612608565b6000811580611bd957505080820282828281611bd657fe5b04145b610a5b57600080fd5b80820182811015610a5b57600080fd5b60606115ba84846000856060611c0785611cc0565b611c235760405162461bcd60e51b8152600401610bff906125d1565b60006060866001600160a01b03168587604051611c409190612466565b60006040518083038185875af1925050503d8060008114611c7d576040519150601f19603f3d011682016040523d82523d6000602084013e611c82565b606091505b50915091508115611c965791506115ba9050565b805115611ca65780518082602001fd5b8360405162461bcd60e51b8152600401610bff91906125be565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906115ba575050151592915050565b60405180610140016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160608152602001611d70611d75565b905290565b6040518060c0016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001606081525090565b8035610a5b81612715565b8051610a5b81612715565b600082601f830112611dec578081fd5b8135611dff611dfa826126c1565b61269a565b9150808252836020828501011115611e1657600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112611e3f578081fd5b8151611e4d611dfa826126c1565b9150808252836020828501011115611e6457600080fd5b611e758160208401602086016126e5565b5092915050565b6000610140808385031215611e8f578182fd5b611e988161269a565b915050611ea58383611dc6565b8152611eb48360208401611dc6565b602082015260408201356040820152606082013560608201526080820135608082015260a082013560a0820152611eee8360c08401611dc6565b60c0820152611f008360e08401611dc6565b60e08201526101008083013567ffffffffffffffff80821115611f2257600080fd5b611f2e86838701611ddc565b83850152610120925082850135915080821115611f4a57600080fd5b50611f5785828601611f63565b82840152505092915050565b600060c08284031215611f74578081fd5b611f7e60c061269a565b90508135611f8b81612715565b81526020820135611f9b81612715565b60208201526040820135611fae81612715565b80604083015250606082013560608201526080820135608082015260a082013567ffffffffffffffff811115611fe357600080fd5b611fef84828501611ddc565b60a08301525092915050565b600060c0828403121561200c578081fd5b61201660c061269a565b9050815161202381612715565b8152602082015161203381612715565b6020820152604082015161204681612715565b80604083015250606082015160608201526080820151608082015260a082015167ffffffffffffffff81111561207b57600080fd5b611fef84828501611e2f565b600060208284031215612098578081fd5b8135611a4981612715565b6000602082840312156120b4578081fd5b8151611a4981612715565b600080604083850312156120d1578081fd5b82356120dc81612715565b946020939093013593505050565b6000602082840312156120fb578081fd5b81518015158114611a49578182fd5b6000806040838503121561211c578182fd5b8251801515811461212b578283fd5b6020939093015192949293505050565b60006020828403121561214c578081fd5b813567ffffffffffffffff811115612162578182fd5b6115ba84828501611ddc565b60006020828403121561217f578081fd5b813567ffffffffffffffff811115612195578182fd5b6115ba84828501611e7c565b6000602082840312156121b2578081fd5b815167ffffffffffffffff808211156121c9578283fd5b81840191506101408083870312156121df578384fd5b6121e88161269a565b90506121f48684611dd1565b81526122038660208501611dd1565b602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015261223d8660c08501611dd1565b60c082015261224f8660e08501611dd1565b60e08201526101008084015183811115612267578586fd5b61227388828701611e2f565b828401525050610120808401518381111561228c578586fd5b61229888828701611ffb565b918301919091525095945050505050565b600080604083850312156122bb578182fd5b823567ffffffffffffffff8111156122d1578283fd5b6122dd85828601611e7c565b92505060208301356122ee81612715565b809150509250929050565b60006020828403121561230a578081fd5b5035919050565b600060208284031215612322578081fd5b5051919050565b6001600160a01b03169052565b6000815180845261234e8160208601602086016126e5565b601f01601f19169290920160200192915050565b6000610140612372848451612329565b60208301516123846020860182612329565b5060408301516040850152606083015160608501526080830151608085015260a083015160a085015260c08301516123bf60c0860182612329565b5060e08301516123d260e0860182612329565b506101008084015182828701526123eb83870182612336565b9250505061012080840151858303828701526124078382612411565b9695505050505050565b600060018060a01b0380835116845280602084015116602085015280604084015116604085015250606082015160608401526080820151608084015260a082015160c060a08501526115ba60c0850182612336565b600082516124788184602087016126e5565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03848116825283166020820152608060408201819052600b908201526a45786368616e676542757960a81b60a082015260c0606082018190526000906124e590830184612336565b95945050505050565b6001600160a01b03848116825283166020820152608060408201819052600c908201526b115e18da185b99d954d95b1b60a21b60a082015260c0606082018190526000906124e590830184612336565b6001600160a01b03958616815293851660208501529190931660408301526060820192909252608081019190915260a00190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061240790830184612336565b6001600160a01b03929092168252602082015260400190565b600060208252611a496020830184612336565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b600060208252611a496020830184612362565b6000604082526126786040830185612362565b90506002831061268457fe5b8260208301529392505050565b90815260200190565b60405181810167ffffffffffffffff811182821017156126b957600080fd5b604052919050565b600067ffffffffffffffff8211156126d7578081fd5b50601f01601f191660200190565b60005b838110156127005781810151838201526020016126e8565b8381111561270f576000848401525b50505050565b6001600160a01b038116811461272a57600080fd5b5056fea26469706673582212200d80e72ad52fa4ee242c0dd79cce5b92b7979c9824049b91fed183c259220f9364736f6c634300060c0033
Deployed Bytecode Sourcemap
28405:2527:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15170:134;;;;;;;;;;-1:-1:-1;15170:134:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30027:570;;;;;;:::i;:::-;;:::i;:::-;;12636:122;;;;;;;;;;-1:-1:-1;12636:122:0;;;;;:::i;:::-;;:::i;30786:141::-;;;;;;;;;;-1:-1:-1;30786:141:0;;;;;:::i;:::-;;:::i;21547:56::-;;;;;;;;;;;;;:::i;16870:86::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;17266:92::-;;;;;;;;;;;;;:::i;29102:573::-;;;;;;:::i;:::-;;:::i;12931:285::-;;;;;;;;;;-1:-1:-1;12931:285:0;;;;;:::i;:::-;;:::i;12804:80::-;;;;;;;;;;;;;:::i;21756:72::-;;;;;;;;;;;;;:::i;28738:27::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28510:41::-;;;;;;;;;;;;;:::i;16963:90::-;;;;;;;;;;;;;:::i;17367:87::-;;;;;;;;;;;;;:::i;11594:20::-;;;;;;;;;;;;;:::i;17062:103::-;;;;;;;;;;;;;:::i;15312:159::-;;;;;;;;;;-1:-1:-1;15312:159:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;17174:85::-;;;;;;;;;;;;;:::i;12415:122::-;;;;;;;;;;-1:-1:-1;12415:122:0;;;;;:::i;:::-;;:::i;16753:74::-;;;;;;;;;;;;;:::i;21610:70::-;;;;;;;;;;;;;:::i;28101:106::-;;;;;;;;;;;;;:::i;21687:62::-;;;;;;;;;;;;;:::i;12132:161::-;;;;;;;;;;-1:-1:-1;12132:161:0;;;;;:::i;:::-;;:::i;28629:100::-;;;;;;;;;;;;;:::i;11621:20::-;;;;;;;;;;;;;:::i;15170:134::-;15245:12;15288:7;15277:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;15270:26;;15170:134;;;;:::o;30027:570::-;30114:10;;28262:33;;-1:-1:-1;;;28262:33:0;;30114:10;;28164:42;;28262:18;;:33;;28289:4;;28262:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;28258:99;;28323:22;;-1:-1:-1;;;28323:22:0;;28164:42;;28323:13;;:22;;28337:7;;28323:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28258:99;28548:3:::1;30138:20;::::0;::::1;:34:::0;-1:-1:-1;;;;;30183:19:0;::::1;:11;::::0;::::1;:19:::0;-1:-1:-1;;30284:12:0::1;30138:6:::0;30284:4:::1;:12::i;:::-;30248:48;;;;30360:52;30373:6;:14;;;30389:6;:15;;;30406:5;30360:12;:52::i;:::-;30524:14:::0;;30540:15:::1;::::0;;::::1;::::0;30568:17:::1;::::0;::::1;::::0;30504:82:::1;::::0;28686:42:::1;::::0;30451:10:::1;::::0;30470:4:::1;::::0;30477:10:::1;::::0;30504:82:::1;::::0;30515:7;;30524:14;30557:9;;30568:17;30504:82:::1;;:::i;:::-;;;;;;;;;;;;;30451:136;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28369:1;;30027:570:::0;;;:::o;12636:122::-;12717:5;;-1:-1:-1;;;;;12717:5:0;12703:10;:19;12695:28;;;;;;12736:5;:14;;-1:-1:-1;;;;;;12736:14:0;-1:-1:-1;;;;;12736:14:0;;;;;;;;;;12636:122::o;30786:141::-;30859:5;;-1:-1:-1;;;;;30859:5:0;30868:10;30859:19;30851:28;;;;;;30892:10;:27;30786:141::o;21547:56::-;;;;;;;;;;;;;;-1:-1:-1;;;21547:56:0;;;;:::o;16870:86::-;16914:42;16870:86;:::o;17266:92::-;17316:42;17266:92;:::o;29102:573::-;29190:10;;28262:33;;-1:-1:-1;;;28262:33:0;;29190:10;;28164:42;;28262:18;;:33;;28289:4;;28262:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;28258:99;;28323:22;;-1:-1:-1;;;28323:22:0;;28164:42;;28323:13;;:22;;28337:7;;28323:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28258:99;28548:3:::1;29215:20;::::0;::::1;:34:::0;-1:-1:-1;;;;;29260:19:0;::::1;:11;::::0;::::1;:19:::0;-1:-1:-1;;29362:13:0::1;29215:6:::0;29362:5:::1;:13::i;:::-;29325:50;;;;29439:52;29452:6;:14;;;29468:6;:15;;;29485:5;29439:12;:52::i;:::-;29604:14:::0;;29620:15:::1;::::0;;::::1;::::0;29637:16:::1;::::0;;::::1;::::0;29584:82;;28686:42:::1;::::0;29530:10:::1;::::0;29549:4:::1;::::0;29556:10:::1;::::0;29584:82:::1;::::0;29595:7;;29604:14;29655:10;;29584:82:::1;;:::i;:::-;;;;;;;;;;;;;29530:137;;;;;;;;;;;;;;;;;:::i;12931:285::-:0;11690:5;;-1:-1:-1;;;;;11690:5:0;11699:10;11690:19;11682:28;;;;;;13031:42:::1;-1:-1:-1::0;;;;;13021:52:0;::::1;;13017:192;;;13098:5;::::0;;13090:32:::1;::::0;-1:-1:-1;;;;;13098:5:0;;::::1;::::0;13090:32;::::1;;;::::0;13114:7;;13090:32;13098:5;13090:32;13114:7;13098:5;13090:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;13017:192;;;13182:5;::::0;13155:42:::1;::::0;-1:-1:-1;;;;;13155:26:0;;::::1;::::0;13182:5:::1;13189:7:::0;13155:26:::1;:42::i;:::-;12931:285:::0;;:::o;12804:80::-;11690:5;;-1:-1:-1;;;;;11690:5:0;11699:10;11690:19;11682:28;;;;;;12869:5:::1;::::0;-1:-1:-1;;;;;12869:5:0::1;12848:28;21756:72:::0;;;;;;;;;;;;;;-1:-1:-1;;;21756:72:0;;;;:::o;28738:27::-;;;;:::o;28510:41::-;28548:3;28510:41;:::o;16963:90::-;17011:42;16963:90;:::o;17367:87::-;17412:42;17367:87;:::o;11594:20::-;;;-1:-1:-1;;;;;11594:20:0;;:::o;17062:103::-;17122:42;17062:103;:::o;15312:159::-;15380:27;;:::i;:::-;15441:5;15430:33;;;;;;;;;;;;:::i;:::-;15420:43;15312:159;-1:-1:-1;;15312:159:0:o;17174:85::-;17217:42;17174:85;:::o;12415:122::-;12496:5;;-1:-1:-1;;;;;12496:5:0;12482:10;:19;12474:28;;;;;;12515:5;:14;;-1:-1:-1;;;;;;12515:14:0;-1:-1:-1;;;;;12515:14:0;;;;;;;;;;12415:122::o;16753:74::-;;;;;;;;;;;;;;-1:-1:-1;;;16753:74:0;;;;:::o;21610:70::-;;;;;;;;;;;;;;-1:-1:-1;;;21610:70:0;;;;:::o;28101:106::-;28164:42;28101:106;:::o;21687:62::-;;;;;;;;;;;;;;-1:-1:-1;;;21687:62:0;;;;:::o;12132:161::-;12213:5;;-1:-1:-1;;;;;12213:5:0;12199:10;:19;12191:28;;;;;;12238:5;;-1:-1:-1;;;;;12238:5:0;:19;12230:28;;;;;28629:100;28686:42;28629:100;:::o;11621:20::-;;;-1:-1:-1;;;;;11621:20:0;;:::o;24037:1644::-;24097:7;24106:4;24125:15;24151:17;24179:12;24212:6;:17;;;24233:1;24212:22;;24236:23;;;;;;;;;;;;;-1:-1:-1;;;24236:23:0;;;24204:56;;;;;-1:-1:-1;;;24204:56:0;;;;;;;;:::i;:::-;;;;;;;;;;24293:75;24300:6;:16;;;24318:6;:11;;;24331:6;:14;;;24347:6;:20;;;24293:6;:75::i;:::-;24273:16;;;:95;;;;;;;;24429:14;;-1:-1:-1;;;;;24429:35:0;16914:42;24429:35;24425:201;;;24512:14;;24498:29;;:13;:29::i;:::-;-1:-1:-1;;;;;24481:46:0;;;24595:16;;;;;24542:72;;-1:-1:-1;;;24542:72:0;;;;17011:42;;24542:45;;24595:16;24542:72;;;;;24481:14;;24542:72;;;;;;;24595:16;17011:42;24542:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24425:201;24642:19;;;;:25;;;:29;24638:227;;24714:33;24724:6;24732:14;24714:9;:33::i;:::-;24688:59;-1:-1:-1;24688:59:0;-1:-1:-1;24764:90:0;;;;24806:6;:19;;;:32;;;24796:42;;24764:90;24935:7;24930:128;;24974:33;24984:6;24992:14;24974:9;:33::i;:::-;24959:48;;25032:6;:14;;;25022:24;;24930:128;25174:1;25138:33;17011:42;25138:10;:33::i;:::-;:37;25134:212;;;25257:62;;-1:-1:-1;;;25257:62:0;;17011:42;;25192:46;;17011:42;;25257:47;;:62;;25313:4;;25257:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25192:142;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25134:212;25362:15;;;;-1:-1:-1;;;;;25362:40:0;17011:42;25362:40;25358:258;;;25460:6;:17;;;25427:29;16914:42;25427:10;:29::i;:::-;:50;;25479:16;;;;;;;;;;;;;-1:-1:-1;;;25479:16:0;;;25419:77;;;;;-1:-1:-1;;;25419:77:0;;;;;;;;:::i;:::-;;25358:258;;;25568:6;:17;;;25537:27;25548:6;:15;;;25537:10;:27::i;:::-;:48;;25587:16;;;;;;;;;;;;;-1:-1:-1;;;25587:16:0;;;25529:75;;;;;-1:-1:-1;;;25529:75:0;;;;;;;;:::i;:::-;;25358:258;25636:7;25645:27;25656:6;:15;;;25645:10;:27::i;:::-;25628:45;;;;;;;24037:1644;;;:::o;17930:502::-;18085:21;:25;18081:93;;18127:35;;-1:-1:-1;;;;;18127:12:0;;;18140:21;18127:35;;;;;;;;;18140:21;18127:12;:35;;;;;;;;;;;;;;;;;;;;;18081:93;18213:1;18190:20;18201:8;18190:10;:20::i;:::-;:24;18186:112;;;18231:55;18260:3;18265:20;18276:8;18265:10;:20::i;:::-;-1:-1:-1;;;;;18231:28:0;;;:55;:28;:55::i;:::-;18338:1;18314:21;18325:9;18314:10;:21::i;:::-;:25;18310:115;;;18356:57;18386:3;18391:21;18402:9;18391:10;:21::i;:::-;-1:-1:-1;;;;;18356:29:0;;;:57;:29;:57::i;:::-;17930:502;;;:::o;22099:1670::-;22160:7;22169:4;22188:15;22214:17;22242:12;16914:42;-1:-1:-1;;;;;22315:35:0;:6;:14;;;-1:-1:-1;;;;;22315:35:0;;22311:201;;;22398:14;;22384:29;;:13;:29::i;:::-;-1:-1:-1;;;;;22367:46:0;;;22481:16;;;;;22428:72;;-1:-1:-1;;;22428:72:0;;;;17011:42;;22428:45;;22481:16;22428:72;;;;;22367:14;;22428:72;;;;;;;22481:16;17011:42;22428:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22311:201;22544:75;22551:6;:16;;;22569:6;:11;;;22582:6;:14;;;22598:6;:20;;;22544:6;:75::i;:::-;22524:16;;;:95;;;;;;;;22699:19;;;;:25;;;:29;22695:228;;22771:34;22781:6;22789:15;22771:9;:34::i;:::-;22745:60;-1:-1:-1;22745:60:0;-1:-1:-1;22822:90:0;;;;22864:6;:19;;;:32;;;22854:42;;22822:90;22993:7;22988:129;;23032:34;23042:6;23050:15;23032:9;:34::i;:::-;23017:49;;23091:6;:14;;;23081:24;;22988:129;23233:1;23197:33;17011:42;23197:10;:33::i;:::-;:37;23193:212;;;23316:62;;-1:-1:-1;;;23316:62:0;;17011:42;;23251:46;;17011:42;;23316:47;;:62;;23372:4;;23316:62;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23251:142;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23193:212;23421:15;;;;-1:-1:-1;;;;;23421:40:0;17011:42;23421:40;23417:302;;;23519:39;23524:6;:15;;;23541:6;:16;;;23519:4;:39::i;:::-;23486:29;16914:42;23486:10;:29::i;:::-;:72;;23560:16;;;;;;;;;;;;;-1:-1:-1;;;23560:16:0;;;23478:99;;;;;-1:-1:-1;;;23478:99:0;;;;;;;;:::i;:::-;;23417:302;;;23649:39;23654:6;:15;;;23671:6;:16;;;23649:4;:39::i;:::-;23618:27;23629:6;:15;;;23618:10;:27::i;:::-;:70;;23690:16;;;;;;;;;;;;;-1:-1:-1;;;23690:16:0;;;23610:97;;;;;-1:-1:-1;;;23610:97:0;;;;;;;;:::i;:::-;;23417:302;-1:-1:-1;23739:7:0;;-1:-1:-1;23748:12:0;-1:-1:-1;22099:1670:0;;;:::o;9639:176::-;9721:86;9741:5;9771:23;;;9796:2;9800:5;9748:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;9748:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;9748:58:0;-1:-1:-1;;;;;;9748:58:0;;;;;;;;;;9721:19;:86::i;18754:905::-;18860:17;18894:19;;;;;:71;;-1:-1:-1;18917:48:0;;-1:-1:-1;;;18917:48:0;;17217:42;;18917:41;;:48;;18959:5;;18917:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18890:174;;;18999:53;;-1:-1:-1;;;18999:53:0;;17217:42;;18999:46;;:53;;19046:5;;18999:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18982:70;;18890:174;19080:19;19076:576;;-1:-1:-1;19128:1:0;19076:576;;;19184:14;19174:7;:24;;;;;;;-1:-1:-1;19300:2:0;19290:7;:12;19277:9;:26;19273:91;;;-1:-1:-1;19346:2:0;19336:12;;19273:91;19380:18;17122:42;-1:-1:-1;;;;;19401:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19380:47;-1:-1:-1;;;;;;19448:27:0;;16914:42;19448:27;19444:197;;;19496:39;;-1:-1:-1;;;;;19496:28:0;;;:39;;;;;19525:9;;19496:39;;;;19525:9;19496:28;:39;;;;;;;;;;;;;;;;;;;;;19444:197;;;19576:49;-1:-1:-1;;;;;19576:26:0;;19603:10;19615:9;19576:26;:49::i;:::-;19076:576;;18754:905;;;;;;:::o;20440:151::-;20500:7;-1:-1:-1;;;;;20527:25:0;;16914:42;20527:25;:56;;20579:4;20527:56;;;-1:-1:-1;17011:42:0;;20440:151;-1:-1:-1;20440:151:0:o;25812:692::-;26002:20;;;;:33;;;25959:77;;-1:-1:-1;;;25959:77:0;;25920:12;;;;17412:42;;25959;;:77;;26002:33;25959:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25954:128;;-1:-1:-1;26061:5:0;;-1:-1:-1;26061:5:0;26053:17;;25954:128;26156:20;;;;:28;26099:86;;-1:-1:-1;;;26099:86:0;;17316:42;;26099:56;;:86;;26156:28;26099:86;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26094:137;;-1:-1:-1;26210:5:0;;-1:-1:-1;26210:5:0;26202:17;;26094:137;26307:20;;;;:28;26337:17;;;;26277:15;;26271:84;;-1:-1:-1;;;;;26271:35:0;;;;;:84::i;:::-;26400:20;;;;:28;;26447:32;;;;;26375:121;;-1:-1:-1;;;26375:121:0;;-1:-1:-1;;;;;26375:64:0;;;;;;26447:32;26375:121;;26400:7;;26490:5;;26375:121;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26368:128;;;;25812:692;;;;;;:::o;26770:717::-;26949:15;;;;26892:73;;-1:-1:-1;;;26892:73:0;;26854:17;;17316:42;;26892:56;;:73;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26967:19;;;;;;;;;;;;;-1:-1:-1;;;26967:19:0;;;26884:103;;;;;-1:-1:-1;;;26884:103:0;;;;;;;;:::i;:::-;-1:-1:-1;27036:15:0;;;;27053:17;;;;27006:15;;27000:71;;-1:-1:-1;;;;;27000:35:0;;;;;:71::i;:::-;27097:15;27088:5;:24;;;;;;;;;27084:396;;;27164:7;:15;;;-1:-1:-1;;;;;27144:63:0;;27208:7;:15;;;27225:7;:16;;;27243:7;:17;;;27262:7;:19;;;27144:138;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27129:153;;27084:396;;;27350:7;:15;;;-1:-1:-1;;;;;27330:62:0;;27393:7;:15;;;27410:7;:16;;;27428:7;:18;;;27448:7;:19;;;27330:138;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27315:153;26770:717;-1:-1:-1;;;26770:717:0:o;17647:275::-;17710:12;-1:-1:-1;;;;;17739:31:0;;16914:42;17739:31;17735:180;;;-1:-1:-1;17797:21:0;17735:180;;;17861:42;;-1:-1:-1;;;17861:42:0;;-1:-1:-1;;;;;17861:27:0;;;;;:42;;17897:4;;17861:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2239:122::-;2298:9;2188:6;2324:23;2328:9;2332:1;2335;2328:3;:9::i;:::-;2339:7;2324:3;:23::i;:::-;:29;;;;;;;2239:122;-1:-1:-1;;;2239:122:0:o;11108:419::-;11190:23;11216:69;11244:4;11216:69;;;;;;;;;;;;;;;;;11224:5;-1:-1:-1;;;;;11216:27:0;;;:69;;;;;:::i;:::-;11300:17;;11190:95;;-1:-1:-1;11300:21:0;11296:224;;11442:10;11431:30;;;;;;;;;;;;:::i;:::-;11423:85;;;;-1:-1:-1;;;11423:85:0;;;;;;;:::i;1458:127::-;1516:9;1546:6;;;:30;;-1:-1:-1;;1561:5:0;;;1575:1;1570;1561:5;1570:1;1556:15;;;;;:20;1546:30;1538:39;;;;;1216:113;1309:5;;;1304:16;;;;1296:25;;;;;6030:196;6133:12;6165:53;6188:6;6196:4;6202:1;6205:12;6922;6955:18;6966:6;6955:10;:18::i;:::-;6947:60;;;;-1:-1:-1;;;6947:60:0;;;;;;;:::i;:::-;7081:12;7095:23;7122:6;-1:-1:-1;;;;;7122:11:0;7142:8;7153:4;7122:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7080:78;;;;7173:7;7169:595;;;7204:10;-1:-1:-1;7197:17:0;;-1:-1:-1;7197:17:0;7169:595;7318:17;;:21;7314:439;;7581:10;7575:17;7642:15;7629:10;7625:2;7621:19;7614:44;7529:148;7724:12;7717:20;;-1:-1:-1;;;7717:20:0;;;;;;;;:::i;4817:619::-;4877:4;5345:20;;5188:66;5385:23;;;;;;:42;;-1:-1:-1;;5412:15:0;;;5377:51;-1:-1:-1;;4817:619:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;72:20;;97:33;72:20;97:33;:::i;142:134::-;220:13;;238:33;220:13;238:33;:::i;572:440::-;;673:3;666:4;658:6;654:17;650:27;640:2;;-1:-1;;681:12;640:2;728:6;715:20;750:64;765:48;806:6;765:48;:::i;:::-;750:64;:::i;:::-;741:73;;834:6;827:5;820:21;938:3;870:4;929:6;862;920:16;;917:25;914:2;;;955:1;;945:12;914:2;30815:6;870:4;862:6;858:17;870:4;896:5;892:16;30792:30;30871:1;30853:16;;;870:4;30853:16;30846:27;896:5;633:379;-1:-1;;633:379::o;1021:442::-;;1133:3;1126:4;1118:6;1114:17;1110:27;1100:2;;-1:-1;;1141:12;1100:2;1181:6;1175:13;1203:64;1218:48;1259:6;1218:48;:::i;1203:64::-;1194:73;;1287:6;1280:5;1273:21;1391:3;1323:4;1382:6;1315;1373:16;;1370:25;1367:2;;;1408:1;;1398:12;1367:2;1418:39;1450:6;1323:4;1349:5;1345:16;1323:4;1315:6;1311:17;1418:39;:::i;:::-;;1093:370;;;;:::o;1513:1898::-;;1632:6;;1620:9;1615:3;1611:19;1607:32;1604:2;;;-1:-1;;1642:12;1604:2;1670:22;1632:6;1670:22;:::i;:::-;1661:31;;;1777:49;1822:3;1798:22;1777:49;:::i;:::-;1759:16;1752:75;1925:49;1970:3;1892:2;1950:9;1946:22;1925:49;:::i;:::-;1892:2;1911:5;1907:16;1900:75;2041:2;2099:9;2095:22;8065:20;2041:2;2060:5;2056:16;2049:75;2191:2;2249:9;2245:22;8065:20;2191:2;2210:5;2206:16;2199:75;2339:3;2398:9;2394:22;8065:20;2339:3;2359:5;2355:16;2348:75;2493:3;2552:9;2548:22;8065:20;2493:3;2513:5;2509:16;2502:75;2672:49;2717:3;2638;2697:9;2693:22;2672:49;:::i;:::-;2638:3;2658:5;2654:16;2647:75;2820:49;2865:3;2786;2845:9;2841:22;2820:49;:::i;:::-;2786:3;2806:5;2802:16;2795:75;2966:3;;2955:9;2951:19;2938:33;2991:18;;2983:6;2980:30;2977:2;;;1745:1;;3013:12;2977:2;3060:58;3114:3;3105:6;3094:9;3090:22;3060:58;:::i;:::-;2966:3;3044:5;3040:18;3033:86;3216:3;;;;3205:9;3201:19;3188:33;3174:47;;2991:18;3233:6;3230:30;3227:2;;;1745:1;;3263:12;3227:2;;3310:79;3385:3;3376:6;3365:9;3361:22;3310:79;:::i;:::-;3216:3;3294:5;3290:18;3283:107;;;1598:1813;;;;:::o;5514:1179::-;;5633:4;5621:9;5616:3;5612:19;5608:30;5605:2;;;-1:-1;;5641:12;5605:2;5669:20;5633:4;5669:20;:::i;:::-;5660:29;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5749:75;;5893:2;5947:22;;72:20;97:33;72:20;97:33;:::i;:::-;5893:2;5908:16;;5901:75;6048:2;6102:22;;72:20;97:33;72:20;97:33;:::i;:::-;6081:49;6048:2;6067:5;6063:16;6056:75;;6193:2;6251:9;6247:22;8065:20;6193:2;6212:5;6208:16;6201:75;6344:3;6403:9;6399:22;8065:20;6344:3;6364:5;6360:16;6353:75;6521:3;6510:9;6506:19;6493:33;6546:18;6538:6;6535:30;6532:2;;;-1:-1;;6568:12;6532:2;6613:58;6667:3;6658:6;6647:9;6643:22;6613:58;:::i;:::-;6521:3;6599:5;6595:16;6588:84;;5599:1094;;;;:::o;6742:1249::-;;6872:4;6860:9;6855:3;6851:19;6847:30;6844:2;;;-1:-1;;6880:12;6844:2;6908:20;6872:4;6908:20;:::i;:::-;6899:29;;226:6;220:13;238:33;265:5;238:33;:::i;:::-;6988:86;;7143:2;7208:22;;220:13;238:33;220:13;238:33;:::i;:::-;7143:2;7158:16;;7151:86;7309:2;7374:22;;220:13;238:33;220:13;238:33;:::i;:::-;7342:60;7309:2;7328:5;7324:16;7317:86;;7465:2;7534:9;7530:22;8213:13;7465:2;7484:5;7480:16;7473:86;7627:3;7697:9;7693:22;8213:13;7627:3;7647:5;7643:16;7636:86;7808:3;7797:9;7793:19;7787:26;7833:18;7825:6;7822:30;7819:2;;;-1:-1;;7855:12;7819:2;7900:69;7965:3;7956:6;7945:9;7941:22;7900:69;:::i;8276:241::-;;8380:2;8368:9;8359:7;8355:23;8351:32;8348:2;;;-1:-1;;8386:12;8348:2;85:6;72:20;97:33;124:5;97:33;:::i;8524:263::-;;8639:2;8627:9;8618:7;8614:23;8610:32;8607:2;;;-1:-1;;8645:12;8607:2;226:6;220:13;238:33;265:5;238:33;:::i;8794:366::-;;;8915:2;8903:9;8894:7;8890:23;8886:32;8883:2;;;-1:-1;;8921:12;8883:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;8973:63;9073:2;9112:22;;;;8065:20;;-1:-1;;;8877:283::o;9167:257::-;;9279:2;9267:9;9258:7;9254:23;9250:32;9247:2;;;-1:-1;;9285:12;9247:2;517:6;511:13;31727:5;28893:13;28886:21;31705:5;31702:32;31692:2;;-1:-1;;31738:12;9431:393;;;9560:2;9548:9;9539:7;9535:23;9531:32;9528:2;;;-1:-1;;9566:12;9528:2;517:6;511:13;31727:5;28893:13;28886:21;31705:5;31702:32;31692:2;;-1:-1;;31738:12;31692:2;9726;9776:22;;;;8213:13;9618:71;;8213:13;;-1:-1;;;9522:302::o;9831:345::-;;9944:2;9932:9;9923:7;9919:23;9915:32;9912:2;;;-1:-1;;9950:12;9912:2;10008:17;9995:31;10046:18;10038:6;10035:30;10032:2;;;-1:-1;;10068:12;10032:2;10098:62;10152:7;10143:6;10132:9;10128:22;10098:62;:::i;10183:387::-;;10317:2;10305:9;10296:7;10292:23;10288:32;10285:2;;;-1:-1;;10323:12;10285:2;10381:17;10368:31;10419:18;10411:6;10408:30;10405:2;;;-1:-1;;10441:12;10405:2;10471:83;10546:7;10537:6;10526:9;10522:22;10471:83;:::i;10577:402::-;;10722:2;10710:9;10701:7;10697:23;10693:32;10690:2;;;-1:-1;;10728:12;10690:2;10779:17;10773:24;10817:18;;10809:6;10806:30;10803:2;;;-1:-1;;10839:12;10803:2;10946:6;10935:9;10931:22;;;3590:6;;3578:9;3573:3;3569:19;3565:32;3562:2;;;-1:-1;;3600:12;3562:2;3628:22;3590:6;3628:22;:::i;:::-;3619:31;;3735:60;3791:3;3767:22;3735:60;:::i;:::-;3717:16;3710:86;3894:60;3950:3;10722:2;3930:9;3926:22;3894:60;:::i;:::-;10722:2;3880:5;3876:16;3869:86;4021:2;4090:9;4086:22;8213:13;4021:2;4040:5;4036:16;4029:86;4182:2;4251:9;4247:22;8213:13;4182:2;4201:5;4197:16;4190:86;4341:3;4411:9;4407:22;8213:13;4341:3;4361:5;4357:16;4350:86;4506:3;4576:9;4572:22;8213:13;4506:3;4526:5;4522:16;4515:86;4696:60;4752:3;4662;4732:9;4728:22;4696:60;:::i;:::-;4662:3;4682:5;4678:16;4671:86;4855:60;4911:3;4821;4891:9;4887:22;4855:60;:::i;:::-;4821:3;4841:5;4837:16;4830:86;5005:3;;4994:9;4990:19;4984:26;10817:18;5022:6;5019:30;5016:2;;;-1:-1;;5052:12;5016:2;5099:69;5164:3;5155:6;5144:9;5140:22;5099:69;:::i;:::-;5005:3;5083:5;5079:18;5072:97;;;5259:3;;5248:9;5244:19;5238:26;10817:18;5276:6;5273:30;5270:2;;;-1:-1;;5306:12;5270:2;5353:90;5439:3;5430:6;5419:9;5415:22;5353:90;:::i;:::-;5333:18;;;5326:118;;;;-1:-1;5337:5;10684:295;-1:-1;;;;;10684:295::o;10986:528::-;;;11145:2;11133:9;11124:7;11120:23;11116:32;11113:2;;;-1:-1;;11151:12;11113:2;11209:17;11196:31;11247:18;11239:6;11236:30;11233:2;;;-1:-1;;11269:12;11233:2;11299:83;11374:7;11365:6;11354:9;11350:22;11299:83;:::i;:::-;11289:93;;;11419:2;11470:9;11466:22;358:20;383:41;418:5;383:41;:::i;:::-;11427:71;;;;11107:407;;;;;:::o;11521:241::-;;11625:2;11613:9;11604:7;11600:23;11596:32;11593:2;;;-1:-1;;11631:12;11593:2;-1:-1;8065:20;;11587:175;-1:-1;11587:175::o;11769:263::-;;11884:2;11872:9;11863:7;11859:23;11855:32;11852:2;;;-1:-1;;11890:12;11852:2;-1:-1;8213:13;;11846:186;-1:-1;11846:186::o;12188:103::-;-1:-1;;;;;29124:54;12249:37;;12243:48::o;12418:323::-;;12550:5;27796:12;28071:6;28066:3;28059:19;12633:52;12678:6;28108:4;28103:3;28099:14;28108:4;12659:5;12655:16;12633:52;:::i;:::-;31248:7;31232:14;-1:-1;;31228:28;12697:39;;;;28108:4;12697:39;;12498:243;-1:-1;;12498:243::o;15963:1986::-;;16124:6;16224:63;16272:14;16201:16;16195:23;16224:63;:::i;:::-;16370:4;16363:5;16359:16;16353:23;16382:63;16370:4;16434:3;16430:14;16416:12;16382:63;:::i;:::-;;16529:4;16522:5;16518:16;16512:23;16529:4;16593:3;16589:14;19324:37;16689:4;16682:5;16678:16;16672:23;16689:4;16753:3;16749:14;19324:37;16847:4;16840:5;16836:16;16830:23;16847:4;16911:3;16907:14;19324:37;17010:4;17003:5;16999:16;16993:23;17010:4;17074:3;17070:14;19324:37;17164:4;17157:5;17153:16;17147:23;17176:63;17164:4;17228:3;17224:14;17210:12;17176:63;:::i;:::-;;17321:4;17314:5;17310:16;17304:23;17333:63;17321:4;17385:3;17381:14;17367:12;17333:63;:::i;:::-;;17482:6;;17475:5;17471:18;17465:25;16124:6;17482;17514:3;17510:16;17503:40;17558:71;16124:6;16119:3;16115:16;17610:12;17558:71;:::i;:::-;17550:79;;;;17722:6;;17715:5;17711:18;17705:25;17778:3;17772:4;17768:14;17722:6;17754:3;17750:16;17743:40;17798:113;17906:4;17892:12;17798:113;:::i;:::-;17933:11;16097:1852;-1:-1;;;;;;16097:1852::o;18037:1219::-;;2991:18;;29135:42;;;;18263:16;18257:23;29124:54;12256:3;12249:37;29135:42;18436:4;18429:5;18425:16;18419:23;29124:54;18436:4;18500:3;18496:14;12249:37;29135:42;18601:4;18594:5;18590:16;18584:23;29124:54;18601:4;18665:3;18661:14;12249:37;;18756:4;18749:5;18745:16;18739:23;18756:4;18820:3;18816:14;19324:37;18917:4;18910:5;18906:16;18900:23;18917:4;18981:3;18977:14;19324:37;19075:4;19068:5;19064:16;19058:23;18188:4;19075;19105:3;19101:14;19094:38;19147:71;18188:4;18183:3;18179:14;19199:12;19147:71;:::i;19493:271::-;;13258:5;27796:12;13369:52;13414:6;13409:3;13402:4;13395:5;13391:16;13369:52;:::i;:::-;13433:16;;;;;19627:137;-1:-1;;19627:137::o;19771:222::-;-1:-1;;;;;29124:54;;;;12249:37;;19898:2;19883:18;;19869:124::o;20245:866::-;-1:-1;;;;;29124:54;;;12118:58;;29124:54;;20744:2;20729:18;;12118:58;20563:3;20781:2;20766:18;;20759:48;;;15078:2;20548:19;;;28059;-1:-1;;;29135:42;28099:14;;15094:34;15147:12;20985:2;20970:18;;20963:48;;;20245:866;;21025:76;;15147:12;;21087:6;21025:76;:::i;:::-;21017:84;20534:577;-1:-1;;;;;20534:577::o;21118:866::-;-1:-1;;;;;29124:54;;;12118:58;;29124:54;;21617:2;21602:18;;12118:58;21436:3;21654:2;21639:18;;21632:48;;;15398:2;21421:19;;;28059;-1:-1;;;29135:42;28099:14;;15414:35;15468:12;21858:2;21843:18;;21836:48;;;21118:866;;21898:76;;15468:12;;21960:6;21898:76;:::i;21991:668::-;-1:-1;;;;;29124:54;;;12249:37;;29124:54;;;22395:2;22380:18;;12249:37;29124:54;;;;22478:2;22463:18;;12249:37;22561:2;22546:18;;19324:37;;;;22644:3;22629:19;;19324:37;;;;22230:3;22215:19;;22201:458::o;22666:640::-;-1:-1;;;;;29124:54;;;12249:37;;29124:54;;23060:2;23045:18;;12249:37;23143:2;23128:18;;19324:37;;;22895:3;23180:2;23165:18;;23158:48;;;22666:640;;23220:76;;22880:19;;23282:6;23220:76;:::i;23313:333::-;-1:-1;;;;;29124:54;;;;12249:37;;23632:2;23617:18;;19324:37;23468:2;23453:18;;23439:207::o;23653:306::-;;23798:2;23819:17;23812:47;23873:76;23798:2;23787:9;23783:18;23935:6;23873:76;:::i;25112:416::-;25312:2;25326:47;;;14740:2;25297:18;;;28059:19;14776:31;28099:14;;;14756:52;14827:12;;;25283:245::o;25535:416::-;25735:2;25749:47;;;15719:2;25720:18;;;28059:19;15755:34;28099:14;;;15735:55;-1:-1;;;15810:12;;;15803:34;15856:12;;;25706:245::o;25958:390::-;;26145:2;26166:17;26159:47;26220:118;26145:2;26134:9;26130:18;26324:6;26220:118;:::i;26355:527::-;;26583:2;26604:17;26597:47;26658:118;26583:2;26572:9;26568:18;26762:6;26658:118;:::i;:::-;26650:126;;31353:1;31346:5;31343:12;31333:2;;31359:9;31333:2;30439:39;26868:2;26857:9;26853:18;14086:63;26554:328;;;;;:::o;26889:222::-;19324:37;;;27016:2;27001:18;;26987:124::o;27118:256::-;27180:2;27174:9;27206:17;;;27281:18;27266:34;;27302:22;;;27263:62;27260:2;;;27338:1;;27328:12;27260:2;27180;27347:22;27158:216;;-1:-1;27158:216::o;27381:321::-;;27524:18;27516:6;27513:30;27510:2;;;-1:-1;;27546:12;27510:2;-1:-1;31248:7;27600:17;-1:-1;;27596:33;27687:4;27677:15;;27447:255::o;30888:268::-;30953:1;30960:101;30974:6;30971:1;30968:13;30960:101;;;31041:11;;;31035:18;31022:11;;;31015:39;30996:2;30989:10;30960:101;;;31076:6;31073:1;31070:13;31067:2;;;30953:1;31132:6;31127:3;31123:16;31116:27;31067:2;;30937:219;;;:::o;31382:117::-;-1:-1;;;;;29124:54;;31441:35;;31431:2;;31490:1;;31480:12;31431:2;31425:74;:::o
Swarm Source
ipfs://0d80e72ad52fa4ee242c0dd79cce5b92b7979c9824049b91fed183c259220f93
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.