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 | 11416131 | 1373 days ago | IN | 0 ETH | 0.07990422 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
wCORE
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-12-09 */ // Sources flattened with hardhat v2.0.1 https://hardhat.org // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/math/[email protected] pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ 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; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be 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; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ 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"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ 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"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ 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); } } } } // File @openzeppelin/contracts-ethereum-package/contracts/[email protected] pragma solidity >=0.4.24 <0.7.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } // File @openzeppelin/contracts-ethereum-package/contracts/GSN/[email protected] pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract ContextUpgradeSafe is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // File @openzeppelin/contracts-ethereum-package/contracts/access/[email protected] pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract OwnableUpgradeSafe is Initializable, ContextUpgradeSafe { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } // File contracts/v612/wCORE.sol // COPYRIGHT cVault.finance TEAM // NO COPY // COPY = BAD // This code is provided with no assurances or guarantees of any kind. Use at your own responsibility. pragma experimental ABIEncoderV2; interface ICOREGlobals { function COREVaultAddress() external returns (address); function TransferHandler() external returns (address); } interface ICORETransferHandler{ function calculateAmountsAfterFee(address, address, uint256) external returns (uint256,uint256); } contract wCORE is ContextUpgradeSafe, IERC20, OwnableUpgradeSafe { // XXXXX Ownable is new using SafeMath for uint256; using SafeMath for uint8; /// XXXXX ERC95 Specific functions bool public paused; // Once only unpause address private LGEAddress; ICOREGlobals coreGlobals; function initialize(address[] memory _addresses, uint8[] memory _percent, uint8[] memory tokenDecimals, address _coreGlobals) public initializer { require(tx.origin == address(0x5A16552f59ea34E44ec81E58b3817833E9fD5436)); OwnableUpgradeSafe.__Ownable_init(); __ERC95_init("cVault.finance/wCORE", "wCORE", _addresses, _percent, tokenDecimals); coreGlobals = ICOREGlobals(_coreGlobals); paused = true; } function changeWrapTokenName(string memory name) public onlyOwner { _setName(name); } // Changing it after does nothing, all this can do is unpause once. function setLGEAddress(address _LGEAddress) public onlyOwner { LGEAddress = _LGEAddress; } // Unpauses transfers of this once // This is needed so people don't wrap before LGE isover and screw liquidity adds function unpauseTransfers() public onlyLGEContract { paused = false; } // Checks if contract is LGE address modifier onlyLGEContract { require(LGEAddress != address(0), "Address not set"); require(msg.sender == LGEAddress, "Not LGE address"); _; } // Events event Wrapped(address indexed from, address indexed to, uint256 amount); event Unwrapped(address indexed from, address indexed to, uint256 amount); uint8 public _numTokensWrapped; WrappedToken[] public _wrappedTokens; // Structs struct WrappedToken { address _address; uint256 _reserve; uint256 _amountWrapperPerUnit; } function _setName(string memory name) internal { _name = name; } function __ERC95_init(string memory name, string memory symbol, address[] memory _addresses, uint8[] memory _percent, uint8[] memory tokenDecimals) internal initializer { ContextUpgradeSafe.__Context_init_unchained(); // We check if numbers are supplied 1:1 // And get the total number of them. require(_addresses.length == _percent.length, "ERC95 : Mismatch num tokens"); uint8 decimalsMax; uint percentTotal; // To make sure they add up to 100 uint8 numTokensWrapped = 0; for (uint256 loop = 0; loop < _addresses.length; loop++) { // 0 % tokens cannnot be permitted require(_percent[loop] > 0 ,"ERC95 : All wrapped tokens have to have at least 1% of total"); // we check the decimals of current token // decimals is not part of erc20 standard, and is safer to provide in the caller // tokenDecimals[loop] = IERC20(_addresses[loop]).decimals(); decimalsMax = tokenDecimals[loop] > decimalsMax ? tokenDecimals[loop] : decimalsMax; // pick max percentTotal += _percent[loop]; // further for checking everything adds up //_numTokensWrapped++; // we might just assign this numTokensWrapped++; } require(percentTotal == 100, "ERC95 : Percent of all wrapped tokens should equal 100"); require(numTokensWrapped == _addresses.length, "ERC95 : Length mismatch sanity check fail"); // Is this sanity check needed? // No, but let's leave it anyway in case it becomes needed later _numTokensWrapped = numTokensWrapped; // Loop over all tokens against to populate the structs for (uint256 loop = 0; loop < numTokensWrapped; loop++) { // We get the difference between decimals because 6 decimal token should have 1000000000000000000 in 18 decimal token per unit uint256 decimalDifference = decimalsMax - tokenDecimals[loop]; // 10 ** 0 is 1 so good // cast to safemath uint256 pAmountWrapperPerUnit = numTokensWrapped > 1 ? (10**decimalDifference).mul(_percent[loop]) : 1; _wrappedTokens.push( WrappedToken({ _address: _addresses[loop], _reserve: 0, /* TODO: I don't know what reserve does here so just stick 0 in it */ _amountWrapperPerUnit : pAmountWrapperPerUnit // if its one token then we can have the same decimals /// 10*0 = 1 * 1 = 1 /// 10*0 = 1 * 50 = 50 this means half because +2 decimals }) ); } _name = name; _symbol = symbol; // we dont need more decimals if its 1 token wraped _decimals = numTokensWrapped > 1 ? decimalsMax + 2 : decimalsMax; // 2 more decimals to support percentage wraps we support up to 1%-100% in integers } // returns info for a token with x id in the loop function getTokenInfo(uint _id) public view returns (address, uint256, uint256) { WrappedToken memory wt = _wrappedTokens[_id]; return (wt._address, wt._reserve, wt._amountWrapperPerUnit); } // Mints the ERC20 during a wrap function _mintWrap(address to, uint256 amt) internal { _mint(to, amt); emit Wrapped(msg.sender, to, amt); } // burns the erc and sends underlying tokens function _unwrap(address from, address to, uint256 amt) internal { _burn(from, amt); sendUnderlyingTokens(to, amt); emit Unwrapped(from, to, amt); } /// public function to unwrap function unwrap(uint256 amt) public { _unwrap(msg.sender, msg.sender, amt); } function unwrapAll() public { unwrap(_balances[msg.sender]); } // TODO: Unit test with USDT // TODO: use the safetransfer shit from uinswap // TODO: Account for decimals in transfer amt (EtherDelta and IDEX would have this logic already) // TODO: Land-mine testing of USDT function sendUnderlyingTokens(address to, uint256 amt) internal { for (uint256 loop = 0; loop < _numTokensWrapped; loop++) { WrappedToken storage currentToken = _wrappedTokens[loop]; uint256 amtToSend = amt.mul(currentToken._amountWrapperPerUnit); safeTransfer(currentToken._address, to, amtToSend); currentToken._reserve = currentToken._reserve.sub(amtToSend); } } function safeTransfer(address token, address to, uint256 value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'ERC95: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint256 value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'ERC95: TRANSFER_FROM_FAILED'); } // You can unwrap if you have allowance to erc20 wrap function unwrapFor(address spender, uint256 amt) public { require(_allowances[spender][msg.sender] >= amt, "ERC95 allowance exceded"); _unwrap(spender, msg.sender, amt); _allowances[spender][msg.sender] = _allowances[spender][msg.sender].sub(amt); } // Loops over all tokens in the wrap and deposits them with allowance function _depositUnderlying(uint256 amt) internal { for (uint256 loop = 0; loop < _numTokensWrapped; loop++) { WrappedToken memory currentToken = _wrappedTokens[loop]; // req successful transfer uint256 amtToSend = amt.mul(currentToken._amountWrapperPerUnit); uint256 balanceTokenBefore = IERC20(currentToken._address).balanceOf(address(this)); safeTransferFrom(currentToken._address, msg.sender, address(this), amtToSend); uint256 balanceTokenAfter = IERC20(currentToken._address).balanceOf(address(this)); require(balanceTokenAfter.sub(balanceTokenBefore) == amtToSend, "Fee on transfer error"); // Transfer went OK this means we can add this balance we just took. _wrappedTokens[loop]._reserve = currentToken._reserve.add(amtToSend); } } // Deposits by checking against reserves function wrapAtomic(address to) noNullAddress(to) public { uint256 amt = _updateReserves(); _mintWrap(to, amt); } // public function to call the deposit with allowance and mint function wrap(address to, uint256 amt) noNullAddress(to) public { // works as wrap for _depositUnderlying(amt); _mintWrap(to, amt); // No need to check underlying? } // safety for front end bugs modifier noNullAddress(address to) { require(to != address(0), "ERC95 : null address safety check"); _; } function _updateReserves() internal returns (uint256 qtyOfNewTokens) { // Loop through all tokens wrapped, and find the maximum quantity of wrapped tokens that can be created, given the balance delta for this block for (uint256 loop = 0; loop < _numTokensWrapped; loop++) { WrappedToken memory currentToken = _wrappedTokens[loop]; uint256 currentTokenBal = IERC20(currentToken._address).balanceOf(address(this)); // TODO: update to not use percentages uint256 amtCurrent = currentTokenBal.sub(currentToken._reserve).div(currentToken._amountWrapperPerUnit); // math check pls qtyOfNewTokens = qtyOfNewTokens > amtCurrent ? amtCurrent : qtyOfNewTokens; // logic check // pick lowest amount so dust attack doesn't work // can't skim in txs or they have non-deterministic gas price if(loop == 0) { qtyOfNewTokens = amtCurrent; } } // second loop makes reserve numbers match from computed amount for (uint256 loop2 = 0; loop2 < _numTokensWrapped; loop2++) { WrappedToken memory currentToken = _wrappedTokens[loop2]; uint256 amtDelta = qtyOfNewTokens.mul(currentToken._amountWrapperPerUnit);// math check pls _wrappedTokens[loop2]._reserve = currentToken._reserve.add(amtDelta);// math check pls } } // Force to match reserves by transfering out to anyone the excess function skim(address to) public { for (uint256 loop = 0; loop < _numTokensWrapped; loop++) { WrappedToken memory currentToken = _wrappedTokens[loop]; uint256 currentTokenBal = IERC20(currentToken._address).balanceOf(address(this)); uint256 excessTokensQuantity = currentTokenBal.sub(currentToken._reserve); if(excessTokensQuantity > 0) { safeTransfer(currentToken._address , to, excessTokensQuantity); } } } /// END ERC95 SPECIFIC FUNCTIONS START ERC20 // we propably should inherit ERC20 somehow using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); require(paused == false, "Transfers paused"); _beforeTokenTransfer(sender, recipient, amount); uint256 transferToFeeDistributorAmount; if(sender != address(this) || recipient != address(this)) { // This is for burning and minting uint256 transferToAmount; (transferToAmount, transferToFeeDistributorAmount) = ICORETransferHandler(coreGlobals.TransferHandler()). calculateAmountsAfterFee(sender, recipient, amount); require(transferToAmount.add(transferToFeeDistributorAmount) == amount, "Math failure"); } if(transferToFeeDistributorAmount > 0) { address feeDistributor = coreGlobals.COREVaultAddress(); _balances[feeDistributor] = _balances[feeDistributor].add(transferToFeeDistributorAmount); emit Transfer(sender, feeDistributor, transferToFeeDistributorAmount); } // Sender is decucted amount always _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount).sub(transferToFeeDistributorAmount); emit Transfer(sender, recipient, amount.sub(transferToFeeDistributorAmount)); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unwrapped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Wrapped","type":"event"},{"inputs":[],"name":"_numTokensWrapped","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_wrappedTokens","outputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_reserve","type":"uint256"},{"internalType":"uint256","name":"_amountWrapperPerUnit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"changeWrapTokenName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getTokenInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint8[]","name":"_percent","type":"uint8[]"},{"internalType":"uint8[]","name":"tokenDecimals","type":"uint8[]"},{"internalType":"address","name":"_coreGlobals","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_LGEAddress","type":"address"}],"name":"setLGEAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"unwrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unwrapAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"unwrapFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"wrap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"wrapAtomic","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50612c34806100206000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80638936a91f116100f9578063bc25cf7711610097578063db75ec4811610071578063db75ec481461037e578063dd62ed3e14610391578063de0e9a3e146103a4578063f2fde38b146103b7576101c4565b8063bc25cf7714610345578063bf376c7a14610358578063d5d1ebd51461036b576101c4565b80638da5cb5b116100d35780638da5cb5b1461030257806395d89b4114610317578063a457c2d71461031f578063a9059cbb14610332576101c4565b80638936a91f146102d45780638c7a63ae146102dc5780638cbc3ae5146102ef576101c4565b806339509351116101665780635c975abb116101405780635c975abb1461028f57806370a0823114610297578063715018a6146102aa57806371882795146102b2576101c4565b806339509351146102615780633d669f8c146102745780634982e3b714610287576101c4565b806318160ddd116101a257806318160ddd1461021c57806323b872dd14610231578063313ce567146102445780633937f8171461024c576101c4565b806306fdde03146101c9578063095ea7b3146101e75780630aa57dfe14610207575b600080fd5b6101d16103ca565b6040516101de91906124c9565b60405180910390f35b6101fa6101f5366004612212565b610460565b6040516101de91906124be565b61020f61047e565b6040516101de9190612aaf565b61022461048e565b6040516101de9190612aa6565b6101fa61023f3660046121d2565b610494565b61020f61051b565b61025f61025a366004612354565b610524565b005b6101fa61026f366004612212565b61056e565b61025f610282366004612162565b6105bc565b61025f6105fe565b6101fa610619565b6102246102a5366004612162565b610622565b61025f61063d565b6102c56102c03660046123dd565b6106bc565b6040516101de9392919061249d565b61025f6106f6565b6102c56102ea3660046123dd565b61075e565b61025f6102fd366004612212565b6107c8565b61030a61086f565b6040516101de919061244c565b6101d161087e565b6101fa61032d366004612212565b6108df565b6101fa610340366004612212565b610947565b61025f610353366004612162565b61095b565b61025f610366366004612212565b610a77565b61025f61037936600461223d565b610ab1565b61025f61038c366004612162565b610bde565b61022461039f36600461219a565b610c3b565b61025f6103b23660046123dd565b610c66565b61025f6103c5366004612162565b610c71565b609d8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104565780601f1061042b57610100808354040283529160200191610456565b820191906000526020600020905b81548152906001019060200180831161043957829003601f168201915b5050505050905090565b600061047461046d610d28565b8484610d2c565b5060015b92915050565b609854600160a01b900460ff1681565b609c5490565b60006104a1848484610de0565b610511846104ad610d28565b61050c85604051806060016040528060288152602001612b92602891396001600160a01b038a166000908152609b60205260408120906104eb610d28565b6001600160a01b03168152602081019190915260400160002054919061116d565b610d2c565b5060019392505050565b609f5460ff1690565b61052c610d28565b6065546001600160a01b039081169116146105625760405162461bcd60e51b81526004016105599061283d565b60405180910390fd5b61056b81611199565b50565b600061047461057b610d28565b8461050c85609b600061058c610d28565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906111ac565b806001600160a01b0381166105e35760405162461bcd60e51b815260040161055990612723565b60006105ed6111d8565b90506105f983826113c9565b505050565b336000908152609a602052604090205461061790610c66565b565b60975460ff1681565b6001600160a01b03166000908152609a602052604090205490565b610645610d28565b6065546001600160a01b039081169116146106725760405162461bcd60e51b81526004016105599061283d565b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b609981815481106106c957fe5b60009182526020909120600390910201805460018201546002909201546001600160a01b03909116925083565b60975461010090046001600160a01b03166107235760405162461bcd60e51b8152600401610559906126d4565b60975461010090046001600160a01b031633146107525760405162461bcd60e51b8152600401610559906129f0565b6097805460ff19169055565b600080600061076b612025565b6099858154811061077857fe5b60009182526020918290206040805160608101825260039390930290910180546001600160a01b031680845260018201549484018590526002909101549290910182905297919650945092505050565b6001600160a01b0382166000908152609b6020908152604080832033845290915290205481111561080b5760405162461bcd60e51b81526004016105599061278e565b610816823383611422565b6001600160a01b0382166000908152609b602090815260408083203384529091529020546108449082611479565b6001600160a01b039092166000908152609b6020908152604080832033845290915290209190915550565b6065546001600160a01b031690565b609e8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104565780601f1061042b57610100808354040283529160200191610456565b60006104746108ec610d28565b8461050c85604051806060016040528060258152602001612bda60259139609b6000610916610d28565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061116d565b6000610474610954610d28565b8484610de0565b60005b609854600160a01b900460ff16811015610a735761097a612025565b6099828154811061098757fe5b6000918252602080832060408051606081018252600390940290910180546001600160a01b03168085526001820154938501939093526002015483820152516370a0823160e01b8152919350906370a08231906109e890309060040161244c565b60206040518083038186803b158015610a0057600080fd5b505afa158015610a14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3891906123f5565b90506000610a5383602001518361147990919063ffffffff16565b90508015610a68578251610a689086836114bb565b50505060010161095e565b5050565b816001600160a01b038116610a9e5760405162461bcd60e51b815260040161055990612723565b610aa7826115a2565b6105f983836113c9565b600054610100900460ff1680610aca5750610aca61179f565b80610ad8575060005460ff16155b610af45760405162461bcd60e51b815260040161055990612872565b600054610100900460ff16158015610b1f576000805460ff1961ff0019909116610100171660011790555b32735a16552f59ea34e44ec81e58b3817833e9fd543614610b3f57600080fd5b610b476117a5565b610b9d60405180604001604052806014815260200173635661756c742e66696e616e63652f77434f524560601b8152506040518060400160405280600581526020016477434f524560d81b815250878787611837565b609880546001600160a01b0319166001600160a01b0384161790556097805460ff191660011790558015610bd7576000805461ff00191690555b5050505050565b610be6610d28565b6065546001600160a01b03908116911614610c135760405162461bcd60e51b81526004016105599061283d565b609780546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b039182166000908152609b6020908152604080832093909416825291909152205490565b61056b333383611422565b610c79610d28565b6065546001600160a01b03908116911614610ca65760405162461bcd60e51b81526004016105599061283d565b6001600160a01b038116610ccc5760405162461bcd60e51b815260040161055990612615565b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b038316610d525760405162461bcd60e51b8152600401610559906129ac565b6001600160a01b038216610d785760405162461bcd60e51b81526004016105599061265b565b6001600160a01b038084166000818152609b602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610dd3908590612aa6565b60405180910390a3505050565b6001600160a01b038316610e065760405162461bcd60e51b815260040161055990612930565b6001600160a01b038216610e2c5760405162461bcd60e51b8152600401610559906124fc565b60975460ff1615610e4f5760405162461bcd60e51b815260040161055990612764565b610e5a8383836105f9565b60006001600160a01b03841630141580610e7d57506001600160a01b0383163014155b15610fae576098546040805163242c292960e01b815290516000926001600160a01b03169163242c292991600480830192602092919082900301818787803b158015610ec857600080fd5b505af1158015610edc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f00919061217e565b6001600160a01b031663301a58018686866040518463ffffffff1660e01b8152600401610f2f93929190612460565b6040805180830381600087803b158015610f4857600080fd5b505af1158015610f5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f80919061240d565b9250905082610f8f82846111ac565b14610fac5760405162461bcd60e51b8152600401610559906126fd565b505b80156110a25760985460408051637bb53c2d60e11b815290516000926001600160a01b03169163f76a785a91600480830192602092919082900301818787803b158015610ffa57600080fd5b505af115801561100e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611032919061217e565b6001600160a01b0381166000908152609a602052604090205490915061105890836111ac565b6001600160a01b038083166000818152609a60205260409081902093909355915190871690600080516020612bba83398151915290611098908690612aa6565b60405180910390a3505b6110df82604051806060016040528060268152602001612b6c602691396001600160a01b0387166000908152609a6020526040902054919061116d565b6001600160a01b038086166000908152609a6020526040808220939093559085168152205461111a90829061111490856111ac565b90611479565b6001600160a01b038085166000818152609a60205260409020929092558516600080516020612bba8339815191526111528585611479565b60405161115f9190612aa6565b60405180910390a350505050565b600081848411156111915760405162461bcd60e51b815260040161055991906124c9565b505050900390565b8051610a7390609d90602084019061204f565b6000828201838110156111d15760405162461bcd60e51b81526004016105599061269d565b9392505050565b6000805b609854600160a01b900460ff16811015611306576111f8612025565b6099828154811061120557fe5b6000918252602080832060408051606081018252600390940290910180546001600160a01b03168085526001820154938501939093526002015483820152516370a0823160e01b8152919350906370a082319061126690309060040161244c565b60206040518083038186803b15801561127e57600080fd5b505afa158015611292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b691906123f5565b905060006112df83604001516112d985602001518561147990919063ffffffff16565b90611b44565b90508085116112ee57846112f0565b805b9450836112fb578094505b5050506001016111dc565b5060005b609854600160a01b900460ff168110156113c557611326612025565b6099828154811061133357fe5b6000918252602080832060408051606081018252600390940290910180546001600160a01b03168452600181015492840192909252600290910154908201819052909250611382908590611b86565b602083015190915061139490826111ac565b609984815481106113a157fe5b9060005260206000209060030201600101819055505050808060010191505061130a565b5090565b6113d38282611bc0565b816001600160a01b0316336001600160a01b03167f29b3b451f9779df34ec8a67ec6c96fa910b17a579a66b7428d94f481be6900d9836040516114169190612aa6565b60405180910390a35050565b61142c8382611c62565b6114368282611d26565b816001600160a01b0316836001600160a01b03167f742cbb4a6bddd5e23aa0c14356065c236bdbc921cddb7f1f763161eb2030f3ef83604051610dd39190612aa6565b60006111d183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061116d565b60006060846001600160a01b031663a9059cbb85856040516024016114e1929190612484565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161151a9190612430565b6000604051808303816000865af19150503d8060008114611557576040519150601f19603f3d011682016040523d82523d6000602084013e61155c565b606091505b50915091508180156115865750805115806115865750808060200190518101906115869190612334565b610bd75760405162461bcd60e51b81526004016105599061253f565b60005b609854600160a01b900460ff16811015610a73576115c1612025565b609982815481106115ce57fe5b6000918252602080832060408051606081018252600390940290910180546001600160a01b0316845260018101549284019290925260029091015490820181905290925061161d908590611b86565b9050600082600001516001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611651919061244c565b60206040518083038186803b15801561166957600080fd5b505afa15801561167d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a191906123f5565b90506116b38360000151333085611daa565b82516040516370a0823160e01b81526000916001600160a01b0316906370a08231906116e390309060040161244c565b60206040518083038186803b1580156116fb57600080fd5b505afa15801561170f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173391906123f5565b9050826117408284611479565b1461175d5760405162461bcd60e51b8152600401610559906128c0565b602084015161176c90846111ac565b6099868154811061177957fe5b9060005260206000209060030201600101819055505050505080806001019150506115a5565b303b1590565b600054610100900460ff16806117be57506117be61179f565b806117cc575060005460ff16155b6117e85760405162461bcd60e51b815260040161055990612872565b600054610100900460ff16158015611813576000805460ff1961ff0019909116610100171660011790555b61181b611e93565b611823611f14565b801561056b576000805461ff001916905550565b600054610100900460ff1680611850575061185061179f565b8061185e575060005460ff16155b61187a5760405162461bcd60e51b815260040161055990612872565b600054610100900460ff161580156118a5576000805460ff1961ff0019909116610100171660011790555b6118ad611e93565b82518451146118ce5760405162461bcd60e51b8152600401610559906127c5565b6000806000805b875181101561197c5760008782815181106118ec57fe5b602002602001015160ff16116119145760405162461bcd60e51b8152600401610559906125b8565b8360ff1686828151811061192457fe5b602002602001015160ff161161193a578361194f565b85818151811061194657fe5b60200260200101515b935086818151811061195d57fe5b602090810291909101015160ff169290920191600191820191016118d5565b508160641461199d5760405162461bcd60e51b815260040161055990612a19565b86518160ff16146119c05760405162461bcd60e51b81526004016105599061256f565b6098805460ff60a01b1916600160a01b60ff84160217905560005b8160ff16811015611ad35760008682815181106119f457fe5b6020026020010151850360ff169050600060018460ff1611611a17576001611a43565b611a43898481518110611a2657fe5b602002602001015160ff1683600a0a611b8690919063ffffffff16565b9050609960405180606001604052808c8681518110611a5e57fe5b6020908102919091018101516001600160a01b039081168352600083830181905260409384019690965284546001808201875595875295829020845160039097020180546001600160a01b031916969091169590951785558201518484015501516002909201919091559190910190506119db565b508851611ae790609d9060208c019061204f565b508751611afb90609e9060208b019061204f565b5060018160ff1611611b0d5782611b12565b826002015b609f805460ff191660ff92909216919091179055505081159050611b3c576000805461ff00191690555b505050505050565b60006111d183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611fee565b600082611b9557506000610478565b82820282848281611ba257fe5b04146111d15760405162461bcd60e51b8152600401610559906127fc565b6001600160a01b038216611be65760405162461bcd60e51b815260040161055990612a6f565b611bf2600083836105f9565b609c54611bff90826111ac565b609c556001600160a01b0382166000908152609a6020526040902054611c2590826111ac565b6001600160a01b0383166000818152609a6020526040808220939093559151909190600080516020612bba83398151915290611416908590612aa6565b6001600160a01b038216611c885760405162461bcd60e51b8152600401610559906128ef565b611c94826000836105f9565b611cd181604051806060016040528060228152602001612b4a602291396001600160a01b0385166000908152609a6020526040902054919061116d565b6001600160a01b0383166000908152609a6020526040902055609c54611cf79082611479565b609c556040516000906001600160a01b03841690600080516020612bba83398151915290611416908590612aa6565b60005b609854600160a01b900460ff168110156105f957600060998281548110611d4c57fe5b906000526020600020906003020190506000611d75826002015485611b8690919063ffffffff16565b8254909150611d8e906001600160a01b031686836114bb565b6001820154611d9d9082611479565b6001928301555001611d29565b60006060856001600160a01b03166323b872dd868686604051602401611dd293929190612460565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051611e0b9190612430565b6000604051808303816000865af19150503d8060008114611e48576040519150601f19603f3d011682016040523d82523d6000602084013e611e4d565b606091505b5091509150818015611e77575080511580611e77575080806020019051810190611e779190612334565b611b3c5760405162461bcd60e51b815260040161055990612975565b600054610100900460ff1680611eac5750611eac61179f565b80611eba575060005460ff16155b611ed65760405162461bcd60e51b815260040161055990612872565b600054610100900460ff16158015611823576000805460ff1961ff001990911661010017166001179055801561056b576000805461ff001916905550565b600054610100900460ff1680611f2d5750611f2d61179f565b80611f3b575060005460ff16155b611f575760405162461bcd60e51b815260040161055990612872565b600054610100900460ff16158015611f82576000805460ff1961ff0019909116610100171660011790555b6000611f8c610d28565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561056b576000805461ff001916905550565b6000818361200f5760405162461bcd60e51b815260040161055991906124c9565b50600083858161201b57fe5b0495945050505050565b604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061209057805160ff19168380011785556120bd565b828001600101855582156120bd579182015b828111156120bd5782518255916020019190600101906120a2565b506113c59291505b808211156113c557600081556001016120c5565b803561047881612b34565b600082601f8301126120f4578081fd5b813561210761210282612ae4565b612abd565b81815291506020808301908481018184028601820187101561212857600080fd5b6000805b8581101561215657823560ff81168114612144578283fd5b8552938301939183019160010161212c565b50505050505092915050565b600060208284031215612173578081fd5b81356111d181612b34565b60006020828403121561218f578081fd5b81516111d181612b34565b600080604083850312156121ac578081fd5b82356121b781612b34565b915060208301356121c781612b34565b809150509250929050565b6000806000606084860312156121e6578081fd5b83356121f181612b34565b9250602084013561220181612b34565b929592945050506040919091013590565b60008060408385031215612224578182fd5b823561222f81612b34565b946020939093013593505050565b60008060008060808587031215612252578081fd5b843567ffffffffffffffff80821115612269578283fd5b818701915087601f83011261227c578283fd5b813561228a61210282612ae4565b80828252602080830192508086018c8283870289010111156122aa578788fd5b8796505b848710156122d4576122c08d826120d9565b8452600196909601959281019281016122ae565b5090985089013593505050808211156122eb578283fd5b6122f7888389016120e4565b9450604087013591508082111561230c578283fd5b50612319878288016120e4565b92505061232986606087016120d9565b905092959194509250565b600060208284031215612345578081fd5b815180151581146111d1578182fd5b60006020808385031215612366578182fd5b823567ffffffffffffffff8082111561237d578384fd5b818501915085601f830112612390578384fd5b81358181111561239e578485fd5b6123b0601f8201601f19168501612abd565b915080825286848285010111156123c5578485fd5b80848401858401378101909201929092529392505050565b6000602082840312156123ee578081fd5b5035919050565b600060208284031215612406578081fd5b5051919050565b6000806040838503121561241f578182fd5b505080516020909101519092909150565b60008251612442818460208701612b04565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b901515815260200190565b60006020825282518060208401526124e8816040850160208701612b04565b601f01601f19169190910160400192915050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b602080825260169082015275115490ce4d4e881514905394d1915497d1905253115160521b604082015260600190565b60208082526029908201527f4552433935203a204c656e677468206d69736d617463682073616e69747920636040820152681a1958dac819985a5b60ba1b606082015260800190565b6020808252603c908201527f4552433935203a20416c6c207772617070656420746f6b656e7320686176652060408201527f746f2068617665206174206c65617374203125206f6620746f74616c00000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600f908201526e1059191c995cdcc81b9bdd081cd95d608a1b604082015260600190565b6020808252600c908201526b4d617468206661696c75726560a01b604082015260600190565b60208082526021908201527f4552433935203a206e756c6c20616464726573732073616665747920636865636040820152606b60f81b606082015260800190565b60208082526010908201526f151c985b9cd9995c9cc81c185d5cd95960821b604082015260600190565b60208082526017908201527f455243393520616c6c6f77616e63652065786365646564000000000000000000604082015260600190565b6020808252601b908201527f4552433935203a204d69736d61746368206e756d20746f6b656e730000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252601590820152742332b29037b7103a3930b739b332b91032b93937b960591b604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252601b908201527f45524339353a205452414e534645525f46524f4d5f4641494c45440000000000604082015260600190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252600f908201526e4e6f74204c4745206164647265737360881b604082015260600190565b60208082526036908201527f4552433935203a2050657263656e74206f6620616c6c2077726170706564207460408201527506f6b656e732073686f756c6420657175616c203130360541b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715612adc57600080fd5b604052919050565b600067ffffffffffffffff821115612afa578081fd5b5060209081020190565b60005b83811015612b1f578181015183820152602001612b07565b83811115612b2e576000848401525b50505050565b6001600160a01b038116811461056b57600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220dd87e89fda952d497c4768b2ec6dfbd63bc3a65f7dc820715515f2162220a74364736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80638936a91f116100f9578063bc25cf7711610097578063db75ec4811610071578063db75ec481461037e578063dd62ed3e14610391578063de0e9a3e146103a4578063f2fde38b146103b7576101c4565b8063bc25cf7714610345578063bf376c7a14610358578063d5d1ebd51461036b576101c4565b80638da5cb5b116100d35780638da5cb5b1461030257806395d89b4114610317578063a457c2d71461031f578063a9059cbb14610332576101c4565b80638936a91f146102d45780638c7a63ae146102dc5780638cbc3ae5146102ef576101c4565b806339509351116101665780635c975abb116101405780635c975abb1461028f57806370a0823114610297578063715018a6146102aa57806371882795146102b2576101c4565b806339509351146102615780633d669f8c146102745780634982e3b714610287576101c4565b806318160ddd116101a257806318160ddd1461021c57806323b872dd14610231578063313ce567146102445780633937f8171461024c576101c4565b806306fdde03146101c9578063095ea7b3146101e75780630aa57dfe14610207575b600080fd5b6101d16103ca565b6040516101de91906124c9565b60405180910390f35b6101fa6101f5366004612212565b610460565b6040516101de91906124be565b61020f61047e565b6040516101de9190612aaf565b61022461048e565b6040516101de9190612aa6565b6101fa61023f3660046121d2565b610494565b61020f61051b565b61025f61025a366004612354565b610524565b005b6101fa61026f366004612212565b61056e565b61025f610282366004612162565b6105bc565b61025f6105fe565b6101fa610619565b6102246102a5366004612162565b610622565b61025f61063d565b6102c56102c03660046123dd565b6106bc565b6040516101de9392919061249d565b61025f6106f6565b6102c56102ea3660046123dd565b61075e565b61025f6102fd366004612212565b6107c8565b61030a61086f565b6040516101de919061244c565b6101d161087e565b6101fa61032d366004612212565b6108df565b6101fa610340366004612212565b610947565b61025f610353366004612162565b61095b565b61025f610366366004612212565b610a77565b61025f61037936600461223d565b610ab1565b61025f61038c366004612162565b610bde565b61022461039f36600461219a565b610c3b565b61025f6103b23660046123dd565b610c66565b61025f6103c5366004612162565b610c71565b609d8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104565780601f1061042b57610100808354040283529160200191610456565b820191906000526020600020905b81548152906001019060200180831161043957829003601f168201915b5050505050905090565b600061047461046d610d28565b8484610d2c565b5060015b92915050565b609854600160a01b900460ff1681565b609c5490565b60006104a1848484610de0565b610511846104ad610d28565b61050c85604051806060016040528060288152602001612b92602891396001600160a01b038a166000908152609b60205260408120906104eb610d28565b6001600160a01b03168152602081019190915260400160002054919061116d565b610d2c565b5060019392505050565b609f5460ff1690565b61052c610d28565b6065546001600160a01b039081169116146105625760405162461bcd60e51b81526004016105599061283d565b60405180910390fd5b61056b81611199565b50565b600061047461057b610d28565b8461050c85609b600061058c610d28565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906111ac565b806001600160a01b0381166105e35760405162461bcd60e51b815260040161055990612723565b60006105ed6111d8565b90506105f983826113c9565b505050565b336000908152609a602052604090205461061790610c66565b565b60975460ff1681565b6001600160a01b03166000908152609a602052604090205490565b610645610d28565b6065546001600160a01b039081169116146106725760405162461bcd60e51b81526004016105599061283d565b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b609981815481106106c957fe5b60009182526020909120600390910201805460018201546002909201546001600160a01b03909116925083565b60975461010090046001600160a01b03166107235760405162461bcd60e51b8152600401610559906126d4565b60975461010090046001600160a01b031633146107525760405162461bcd60e51b8152600401610559906129f0565b6097805460ff19169055565b600080600061076b612025565b6099858154811061077857fe5b60009182526020918290206040805160608101825260039390930290910180546001600160a01b031680845260018201549484018590526002909101549290910182905297919650945092505050565b6001600160a01b0382166000908152609b6020908152604080832033845290915290205481111561080b5760405162461bcd60e51b81526004016105599061278e565b610816823383611422565b6001600160a01b0382166000908152609b602090815260408083203384529091529020546108449082611479565b6001600160a01b039092166000908152609b6020908152604080832033845290915290209190915550565b6065546001600160a01b031690565b609e8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104565780601f1061042b57610100808354040283529160200191610456565b60006104746108ec610d28565b8461050c85604051806060016040528060258152602001612bda60259139609b6000610916610d28565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919061116d565b6000610474610954610d28565b8484610de0565b60005b609854600160a01b900460ff16811015610a735761097a612025565b6099828154811061098757fe5b6000918252602080832060408051606081018252600390940290910180546001600160a01b03168085526001820154938501939093526002015483820152516370a0823160e01b8152919350906370a08231906109e890309060040161244c565b60206040518083038186803b158015610a0057600080fd5b505afa158015610a14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a3891906123f5565b90506000610a5383602001518361147990919063ffffffff16565b90508015610a68578251610a689086836114bb565b50505060010161095e565b5050565b816001600160a01b038116610a9e5760405162461bcd60e51b815260040161055990612723565b610aa7826115a2565b6105f983836113c9565b600054610100900460ff1680610aca5750610aca61179f565b80610ad8575060005460ff16155b610af45760405162461bcd60e51b815260040161055990612872565b600054610100900460ff16158015610b1f576000805460ff1961ff0019909116610100171660011790555b32735a16552f59ea34e44ec81e58b3817833e9fd543614610b3f57600080fd5b610b476117a5565b610b9d60405180604001604052806014815260200173635661756c742e66696e616e63652f77434f524560601b8152506040518060400160405280600581526020016477434f524560d81b815250878787611837565b609880546001600160a01b0319166001600160a01b0384161790556097805460ff191660011790558015610bd7576000805461ff00191690555b5050505050565b610be6610d28565b6065546001600160a01b03908116911614610c135760405162461bcd60e51b81526004016105599061283d565b609780546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b039182166000908152609b6020908152604080832093909416825291909152205490565b61056b333383611422565b610c79610d28565b6065546001600160a01b03908116911614610ca65760405162461bcd60e51b81526004016105599061283d565b6001600160a01b038116610ccc5760405162461bcd60e51b815260040161055990612615565b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b038316610d525760405162461bcd60e51b8152600401610559906129ac565b6001600160a01b038216610d785760405162461bcd60e51b81526004016105599061265b565b6001600160a01b038084166000818152609b602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610dd3908590612aa6565b60405180910390a3505050565b6001600160a01b038316610e065760405162461bcd60e51b815260040161055990612930565b6001600160a01b038216610e2c5760405162461bcd60e51b8152600401610559906124fc565b60975460ff1615610e4f5760405162461bcd60e51b815260040161055990612764565b610e5a8383836105f9565b60006001600160a01b03841630141580610e7d57506001600160a01b0383163014155b15610fae576098546040805163242c292960e01b815290516000926001600160a01b03169163242c292991600480830192602092919082900301818787803b158015610ec857600080fd5b505af1158015610edc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f00919061217e565b6001600160a01b031663301a58018686866040518463ffffffff1660e01b8152600401610f2f93929190612460565b6040805180830381600087803b158015610f4857600080fd5b505af1158015610f5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f80919061240d565b9250905082610f8f82846111ac565b14610fac5760405162461bcd60e51b8152600401610559906126fd565b505b80156110a25760985460408051637bb53c2d60e11b815290516000926001600160a01b03169163f76a785a91600480830192602092919082900301818787803b158015610ffa57600080fd5b505af115801561100e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611032919061217e565b6001600160a01b0381166000908152609a602052604090205490915061105890836111ac565b6001600160a01b038083166000818152609a60205260409081902093909355915190871690600080516020612bba83398151915290611098908690612aa6565b60405180910390a3505b6110df82604051806060016040528060268152602001612b6c602691396001600160a01b0387166000908152609a6020526040902054919061116d565b6001600160a01b038086166000908152609a6020526040808220939093559085168152205461111a90829061111490856111ac565b90611479565b6001600160a01b038085166000818152609a60205260409020929092558516600080516020612bba8339815191526111528585611479565b60405161115f9190612aa6565b60405180910390a350505050565b600081848411156111915760405162461bcd60e51b815260040161055991906124c9565b505050900390565b8051610a7390609d90602084019061204f565b6000828201838110156111d15760405162461bcd60e51b81526004016105599061269d565b9392505050565b6000805b609854600160a01b900460ff16811015611306576111f8612025565b6099828154811061120557fe5b6000918252602080832060408051606081018252600390940290910180546001600160a01b03168085526001820154938501939093526002015483820152516370a0823160e01b8152919350906370a082319061126690309060040161244c565b60206040518083038186803b15801561127e57600080fd5b505afa158015611292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b691906123f5565b905060006112df83604001516112d985602001518561147990919063ffffffff16565b90611b44565b90508085116112ee57846112f0565b805b9450836112fb578094505b5050506001016111dc565b5060005b609854600160a01b900460ff168110156113c557611326612025565b6099828154811061133357fe5b6000918252602080832060408051606081018252600390940290910180546001600160a01b03168452600181015492840192909252600290910154908201819052909250611382908590611b86565b602083015190915061139490826111ac565b609984815481106113a157fe5b9060005260206000209060030201600101819055505050808060010191505061130a565b5090565b6113d38282611bc0565b816001600160a01b0316336001600160a01b03167f29b3b451f9779df34ec8a67ec6c96fa910b17a579a66b7428d94f481be6900d9836040516114169190612aa6565b60405180910390a35050565b61142c8382611c62565b6114368282611d26565b816001600160a01b0316836001600160a01b03167f742cbb4a6bddd5e23aa0c14356065c236bdbc921cddb7f1f763161eb2030f3ef83604051610dd39190612aa6565b60006111d183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061116d565b60006060846001600160a01b031663a9059cbb85856040516024016114e1929190612484565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161151a9190612430565b6000604051808303816000865af19150503d8060008114611557576040519150601f19603f3d011682016040523d82523d6000602084013e61155c565b606091505b50915091508180156115865750805115806115865750808060200190518101906115869190612334565b610bd75760405162461bcd60e51b81526004016105599061253f565b60005b609854600160a01b900460ff16811015610a73576115c1612025565b609982815481106115ce57fe5b6000918252602080832060408051606081018252600390940290910180546001600160a01b0316845260018101549284019290925260029091015490820181905290925061161d908590611b86565b9050600082600001516001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611651919061244c565b60206040518083038186803b15801561166957600080fd5b505afa15801561167d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a191906123f5565b90506116b38360000151333085611daa565b82516040516370a0823160e01b81526000916001600160a01b0316906370a08231906116e390309060040161244c565b60206040518083038186803b1580156116fb57600080fd5b505afa15801561170f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173391906123f5565b9050826117408284611479565b1461175d5760405162461bcd60e51b8152600401610559906128c0565b602084015161176c90846111ac565b6099868154811061177957fe5b9060005260206000209060030201600101819055505050505080806001019150506115a5565b303b1590565b600054610100900460ff16806117be57506117be61179f565b806117cc575060005460ff16155b6117e85760405162461bcd60e51b815260040161055990612872565b600054610100900460ff16158015611813576000805460ff1961ff0019909116610100171660011790555b61181b611e93565b611823611f14565b801561056b576000805461ff001916905550565b600054610100900460ff1680611850575061185061179f565b8061185e575060005460ff16155b61187a5760405162461bcd60e51b815260040161055990612872565b600054610100900460ff161580156118a5576000805460ff1961ff0019909116610100171660011790555b6118ad611e93565b82518451146118ce5760405162461bcd60e51b8152600401610559906127c5565b6000806000805b875181101561197c5760008782815181106118ec57fe5b602002602001015160ff16116119145760405162461bcd60e51b8152600401610559906125b8565b8360ff1686828151811061192457fe5b602002602001015160ff161161193a578361194f565b85818151811061194657fe5b60200260200101515b935086818151811061195d57fe5b602090810291909101015160ff169290920191600191820191016118d5565b508160641461199d5760405162461bcd60e51b815260040161055990612a19565b86518160ff16146119c05760405162461bcd60e51b81526004016105599061256f565b6098805460ff60a01b1916600160a01b60ff84160217905560005b8160ff16811015611ad35760008682815181106119f457fe5b6020026020010151850360ff169050600060018460ff1611611a17576001611a43565b611a43898481518110611a2657fe5b602002602001015160ff1683600a0a611b8690919063ffffffff16565b9050609960405180606001604052808c8681518110611a5e57fe5b6020908102919091018101516001600160a01b039081168352600083830181905260409384019690965284546001808201875595875295829020845160039097020180546001600160a01b031916969091169590951785558201518484015501516002909201919091559190910190506119db565b508851611ae790609d9060208c019061204f565b508751611afb90609e9060208b019061204f565b5060018160ff1611611b0d5782611b12565b826002015b609f805460ff191660ff92909216919091179055505081159050611b3c576000805461ff00191690555b505050505050565b60006111d183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611fee565b600082611b9557506000610478565b82820282848281611ba257fe5b04146111d15760405162461bcd60e51b8152600401610559906127fc565b6001600160a01b038216611be65760405162461bcd60e51b815260040161055990612a6f565b611bf2600083836105f9565b609c54611bff90826111ac565b609c556001600160a01b0382166000908152609a6020526040902054611c2590826111ac565b6001600160a01b0383166000818152609a6020526040808220939093559151909190600080516020612bba83398151915290611416908590612aa6565b6001600160a01b038216611c885760405162461bcd60e51b8152600401610559906128ef565b611c94826000836105f9565b611cd181604051806060016040528060228152602001612b4a602291396001600160a01b0385166000908152609a6020526040902054919061116d565b6001600160a01b0383166000908152609a6020526040902055609c54611cf79082611479565b609c556040516000906001600160a01b03841690600080516020612bba83398151915290611416908590612aa6565b60005b609854600160a01b900460ff168110156105f957600060998281548110611d4c57fe5b906000526020600020906003020190506000611d75826002015485611b8690919063ffffffff16565b8254909150611d8e906001600160a01b031686836114bb565b6001820154611d9d9082611479565b6001928301555001611d29565b60006060856001600160a01b03166323b872dd868686604051602401611dd293929190612460565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051611e0b9190612430565b6000604051808303816000865af19150503d8060008114611e48576040519150601f19603f3d011682016040523d82523d6000602084013e611e4d565b606091505b5091509150818015611e77575080511580611e77575080806020019051810190611e779190612334565b611b3c5760405162461bcd60e51b815260040161055990612975565b600054610100900460ff1680611eac5750611eac61179f565b80611eba575060005460ff16155b611ed65760405162461bcd60e51b815260040161055990612872565b600054610100900460ff16158015611823576000805460ff1961ff001990911661010017166001179055801561056b576000805461ff001916905550565b600054610100900460ff1680611f2d5750611f2d61179f565b80611f3b575060005460ff16155b611f575760405162461bcd60e51b815260040161055990612872565b600054610100900460ff16158015611f82576000805460ff1961ff0019909116610100171660011790555b6000611f8c610d28565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350801561056b576000805461ff001916905550565b6000818361200f5760405162461bcd60e51b815260040161055991906124c9565b50600083858161201b57fe5b0495945050505050565b604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061209057805160ff19168380011785556120bd565b828001600101855582156120bd579182015b828111156120bd5782518255916020019190600101906120a2565b506113c59291505b808211156113c557600081556001016120c5565b803561047881612b34565b600082601f8301126120f4578081fd5b813561210761210282612ae4565b612abd565b81815291506020808301908481018184028601820187101561212857600080fd5b6000805b8581101561215657823560ff81168114612144578283fd5b8552938301939183019160010161212c565b50505050505092915050565b600060208284031215612173578081fd5b81356111d181612b34565b60006020828403121561218f578081fd5b81516111d181612b34565b600080604083850312156121ac578081fd5b82356121b781612b34565b915060208301356121c781612b34565b809150509250929050565b6000806000606084860312156121e6578081fd5b83356121f181612b34565b9250602084013561220181612b34565b929592945050506040919091013590565b60008060408385031215612224578182fd5b823561222f81612b34565b946020939093013593505050565b60008060008060808587031215612252578081fd5b843567ffffffffffffffff80821115612269578283fd5b818701915087601f83011261227c578283fd5b813561228a61210282612ae4565b80828252602080830192508086018c8283870289010111156122aa578788fd5b8796505b848710156122d4576122c08d826120d9565b8452600196909601959281019281016122ae565b5090985089013593505050808211156122eb578283fd5b6122f7888389016120e4565b9450604087013591508082111561230c578283fd5b50612319878288016120e4565b92505061232986606087016120d9565b905092959194509250565b600060208284031215612345578081fd5b815180151581146111d1578182fd5b60006020808385031215612366578182fd5b823567ffffffffffffffff8082111561237d578384fd5b818501915085601f830112612390578384fd5b81358181111561239e578485fd5b6123b0601f8201601f19168501612abd565b915080825286848285010111156123c5578485fd5b80848401858401378101909201929092529392505050565b6000602082840312156123ee578081fd5b5035919050565b600060208284031215612406578081fd5b5051919050565b6000806040838503121561241f578182fd5b505080516020909101519092909150565b60008251612442818460208701612b04565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b901515815260200190565b60006020825282518060208401526124e8816040850160208701612b04565b601f01601f19169190910160400192915050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b602080825260169082015275115490ce4d4e881514905394d1915497d1905253115160521b604082015260600190565b60208082526029908201527f4552433935203a204c656e677468206d69736d617463682073616e69747920636040820152681a1958dac819985a5b60ba1b606082015260800190565b6020808252603c908201527f4552433935203a20416c6c207772617070656420746f6b656e7320686176652060408201527f746f2068617665206174206c65617374203125206f6620746f74616c00000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600f908201526e1059191c995cdcc81b9bdd081cd95d608a1b604082015260600190565b6020808252600c908201526b4d617468206661696c75726560a01b604082015260600190565b60208082526021908201527f4552433935203a206e756c6c20616464726573732073616665747920636865636040820152606b60f81b606082015260800190565b60208082526010908201526f151c985b9cd9995c9cc81c185d5cd95960821b604082015260600190565b60208082526017908201527f455243393520616c6c6f77616e63652065786365646564000000000000000000604082015260600190565b6020808252601b908201527f4552433935203a204d69736d61746368206e756d20746f6b656e730000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252601590820152742332b29037b7103a3930b739b332b91032b93937b960591b604082015260600190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252601b908201527f45524339353a205452414e534645525f46524f4d5f4641494c45440000000000604082015260600190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b6020808252600f908201526e4e6f74204c4745206164647265737360881b604082015260600190565b60208082526036908201527f4552433935203a2050657263656e74206f6620616c6c2077726170706564207460408201527506f6b656e732073686f756c6420657175616c203130360541b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715612adc57600080fd5b604052919050565b600067ffffffffffffffff821115612afa578081fd5b5060209081020190565b60005b83811015612b1f578181015183820152602001612b07565b83811115612b2e576000848401525b50505050565b6001600160a01b038116811461056b57600080fdfe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220dd87e89fda952d497c4768b2ec6dfbd63bc3a65f7dc820715515f2162220a74364736f6c634300060c0033
Deployed Bytecode Sourcemap
21033:22469:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33668:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35774:169;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22744:30::-;;;:::i;:::-;;;;;;;:::i;34743:100::-;;;:::i;:::-;;;;;;;:::i;36417:321::-;;;;;;:::i;:::-;;:::i;34595:83::-;;;:::i;21815:99::-;;;;;;:::i;:::-;;:::i;:::-;;37147:218;;;;;;:::i;:::-;;:::i;30349:148::-;;;;;;:::i;:::-;;:::i;27271:84::-;;;:::i;21243:18::-;;;:::i;34906:119::-;;;;;;:::i;:::-;;:::i;19903:148::-;;;:::i;22785:36::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;22234:84::-;;;:::i;26424:225::-;;;;;;:::i;:::-;;:::i;28971:297::-;;;;;;:::i;:::-;;:::i;19261:79::-;;;:::i;:::-;;;;;;;:::i;33870:87::-;;;:::i;37868:269::-;;;;;;:::i;:::-;;:::i;35238:175::-;;;;;;:::i;:::-;;:::i;32618:549::-;;;;;;:::i;:::-;;:::i;30581:200::-;;;;;;:::i;:::-;;:::i;21355:452::-;;;;;;:::i;:::-;;:::i;21995:104::-;;;;;;:::i;:::-;;:::i;35476:151::-;;;;;;:::i;:::-;;:::i;27160:99::-;;;;;;:::i;:::-;;:::i;20206:244::-;;;;;;:::i;:::-;;:::i;33668:83::-;33738:5;33731:12;;;;;;;;-1:-1:-1;;33731:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33705:13;;33731:12;;33738:5;;33731:12;;33738:5;33731:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33668:83;:::o;35774:169::-;35857:4;35874:39;35883:12;:10;:12::i;:::-;35897:7;35906:6;35874:8;:39::i;:::-;-1:-1:-1;35931:4:0;35774:169;;;;;:::o;22744:30::-;;;-1:-1:-1;;;22744:30:0;;;;;:::o;34743:100::-;34823:12;;34743:100;:::o;36417:321::-;36523:4;36540:36;36550:6;36558:9;36569:6;36540:9;:36::i;:::-;36587:121;36596:6;36604:12;:10;:12::i;:::-;36618:89;36656:6;36618:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36618:19:0;;;;;;:11;:19;;;;;;36638:12;:10;:12::i;:::-;-1:-1:-1;;;;;36618:33:0;;;;;;;;;;;;-1:-1:-1;36618:33:0;;;:89;:37;:89::i;:::-;36587:8;:121::i;:::-;-1:-1:-1;36726:4:0;36417:321;;;;;:::o;34595:83::-;34661:9;;;;34595:83;:::o;21815:99::-;19483:12;:10;:12::i;:::-;19473:6;;-1:-1:-1;;;;;19473:6:0;;;:22;;;19465:67;;;;-1:-1:-1;;;19465:67:0;;;;;;;:::i;:::-;;;;;;;;;21892:14:::1;21901:4;21892:8;:14::i;:::-;21815:99:::0;:::o;37147:218::-;37235:4;37252:83;37261:12;:10;:12::i;:::-;37275:7;37284:50;37323:10;37284:11;:25;37296:12;:10;:12::i;:::-;-1:-1:-1;;;;;37284:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;37284:25:0;;;:34;;;;;;;;;;;:38;:50::i;30349:148::-;30395:2;-1:-1:-1;;;;;30889:16:0;;30881:62;;;;-1:-1:-1;;;30881:62:0;;;;;;;:::i;:::-;30421:11:::1;30435:17;:15;:17::i;:::-;30421:31;;30467:18;30477:2;30481:3;30467:9;:18::i;:::-;30958:1;30349:148:::0;;:::o;27271:84::-;27331:10;27321:21;;;;:9;:21;;;;;;27314:29;;:6;:29::i;:::-;27271:84::o;21243:18::-;;;;;;:::o;34906:119::-;-1:-1:-1;;;;;34999:18:0;34972:7;34999:18;;;:9;:18;;;;;;;34906:119::o;19903:148::-;19483:12;:10;:12::i;:::-;19473:6;;-1:-1:-1;;;;;19473:6:0;;;:22;;;19465:67;;;;-1:-1:-1;;;19465:67:0;;;;;;;:::i;:::-;19994:6:::1;::::0;19973:40:::1;::::0;20010:1:::1;::::0;-1:-1:-1;;;;;19994:6:0::1;::::0;19973:40:::1;::::0;20010:1;;19973:40:::1;20024:6;:19:::0;;-1:-1:-1;;;;;;20024:19:0::1;::::0;;19903:148::o;22785:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22785:36:0;;;;-1:-1:-1;22785:36:0;:::o;22234:84::-;22412:10;;;;;-1:-1:-1;;;;;22412:10:0;22404:52;;;;-1:-1:-1;;;22404:52:0;;;;;;;:::i;:::-;22489:10;;;;;-1:-1:-1;;;;;22489:10:0;22475;:24;22467:52;;;;-1:-1:-1;;;22467:52:0;;;;;;;:::i;:::-;22296:6:::1;:14:::0;;-1:-1:-1;;22296:14:0::1;::::0;;22234:84::o;26424:225::-;26477:7;26486;26495;26519:22;;:::i;:::-;26544:14;26559:3;26544:19;;;;;;;;;;;;;;;;;26519:44;;;;;;;;26544:19;;;;;;;;26519:44;;-1:-1:-1;;;;;26519:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26519:44:0;-1:-1:-1;26424:225:0;-1:-1:-1;;;26424:225:0:o;28971:297::-;-1:-1:-1;;;;;29050:20:0;;;;;;:11;:20;;;;;;;;29071:10;29050:32;;;;;;;;:39;-1:-1:-1;29050:39:0;29042:75;;;;-1:-1:-1;;;29042:75:0;;;;;;;:::i;:::-;29132:33;29140:7;29149:10;29161:3;29132:7;:33::i;:::-;-1:-1:-1;;;;;29215:20:0;;;;;;:11;:20;;;;;;;;29236:10;29215:32;;;;;;;;:41;;29252:3;29215:36;:41::i;:::-;-1:-1:-1;;;;;29180:20:0;;;;;;;:11;:20;;;;;;;;29201:10;29180:32;;;;;;;:76;;;;-1:-1:-1;28971:297:0:o;19261:79::-;19326:6;;-1:-1:-1;;;;;19326:6:0;19261:79;:::o;33870:87::-;33942:7;33935:14;;;;;;;;-1:-1:-1;;33935:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33909:13;;33935:14;;33942:7;;33935:14;;33942:7;33935:14;;;;;;;;;;;;;;;;;;;;;;;;37868:269;37961:4;37978:129;37987:12;:10;:12::i;:::-;38001:7;38010:96;38049:15;38010:96;;;;;;;;;;;;;;;;;:11;:25;38022:12;:10;:12::i;:::-;-1:-1:-1;;;;;38010:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;38010:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;35238:175::-;35324:4;35341:42;35351:12;:10;:12::i;:::-;35365:9;35376:6;35341:9;:42::i;32618:549::-;32671:12;32666:490;32696:17;;-1:-1:-1;;;32696:17:0;;;;32689:24;;32666:490;;;32742:32;;:::i;:::-;32777:14;32792:4;32777:20;;;;;;;;;;;;;;;;32742:55;;;;;;;;32777:20;;;;;;;32742:55;;-1:-1:-1;;;;;32742:55:0;;;;;;;;;;;;;;;;;;;;;;32842:54;-1:-1:-1;;;32842:54:0;;32742:55;;-1:-1:-1;32742:55:0;32842:39;;:54;;32890:4;;32842:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32816:80;;32915:28;32946:42;32966:12;:21;;;32946:15;:19;;:42;;;;:::i;:::-;32915:73;-1:-1:-1;33010:24:0;;33007:134;;33072:21;;33059:62;;33096:2;33100:20;33059:12;:62::i;:::-;-1:-1:-1;;;32715:6:0;;32666:490;;;;32618:549;:::o;30581:200::-;30634:2;-1:-1:-1;;;;;30889:16:0;;30881:62;;;;-1:-1:-1;;;30881:62:0;;;;;;;:::i;:::-;30681:23:::1;30700:3;30681:18;:23::i;:::-;30719:18;30729:2;30733:3;30719:9;:18::i;21355:452::-:0;15492:12;;;;;;;;:31;;;15508:15;:13;:15::i;:::-;15492:47;;;-1:-1:-1;15528:11:0;;;;15527:12;15492:47;15484:106;;;;-1:-1:-1;;;15484:106:0;;;;;;;:::i;:::-;15599:19;15622:12;;;;;;15621:13;15641:83;;;;15670:12;:19;;-1:-1:-1;;;;15670:19:0;;;;;15698:18;15685:4;15698:18;;;15641:83;21520:9:::1;21541:42;21520:64;21512:73;;;::::0;::::1;;21596:35;:33;:35::i;:::-;21642:82;;;;;;;;;;;;;;-1:-1:-1::0;;;21642:82:0::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;21642:82:0::1;;::::0;21688:10:::1;21700:8;21710:13;21642:12;:82::i;:::-;21735:11;:40:::0;;-1:-1:-1;;;;;;21735:40:0::1;-1:-1:-1::0;;;;;21735:40:0;::::1;;::::0;;21786:6:::1;:13:::0;;-1:-1:-1;;21786:13:0::1;-1:-1:-1::0;21786:13:0::1;::::0;;15742:57;;;;15786:5;15771:20;;-1:-1:-1;;15771:20:0;;;15742:57;21355:452;;;;;:::o;21995:104::-;19483:12;:10;:12::i;:::-;19473:6;;-1:-1:-1;;;;;19473:6:0;;;:22;;;19465:67;;;;-1:-1:-1;;;19465:67:0;;;;;;;:::i;:::-;22067:10:::1;:24:::0;;-1:-1:-1;;;;;22067:24:0;;::::1;;;-1:-1:-1::0;;;;;;22067:24:0;;::::1;::::0;;;::::1;::::0;;21995:104::o;35476:151::-;-1:-1:-1;;;;;35592:18:0;;;35565:7;35592:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;35476:151::o;27160:99::-;27211:36;27219:10;27231;27243:3;27211:7;:36::i;20206:244::-;19483:12;:10;:12::i;:::-;19473:6;;-1:-1:-1;;;;;19473:6:0;;;:22;;;19465:67;;;;-1:-1:-1;;;19465:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20295:22:0;::::1;20287:73;;;;-1:-1:-1::0;;;20287:73:0::1;;;;;;;:::i;:::-;20397:6;::::0;20376:38:::1;::::0;-1:-1:-1;;;;;20376:38:0;;::::1;::::0;20397:6:::1;::::0;20376:38:::1;::::0;20397:6:::1;::::0;20376:38:::1;20425:6;:17:::0;;-1:-1:-1;;;;;;20425:17:0::1;-1:-1:-1::0;;;;;20425:17:0;;;::::1;::::0;;;::::1;::::0;;20206:244::o;17529:106::-;17617:10;17529:106;:::o;42028:346::-;-1:-1:-1;;;;;42130:19:0;;42122:68;;;;-1:-1:-1;;;42122:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42209:21:0;;42201:68;;;;-1:-1:-1;;;42201:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42282:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;42334:32;;;;;42312:6;;42334:32;:::i;:::-;;;;;;;;42028:346;;;:::o;38627:1554::-;-1:-1:-1;;;;;38733:20:0;;38725:70;;;;-1:-1:-1;;;38725:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38814:23:0;;38806:71;;;;-1:-1:-1;;;38806:71:0;;;;;;;:::i;:::-;38896:6;;;;:15;38888:44;;;;-1:-1:-1;;;38888:44:0;;;;;;;:::i;:::-;38945:47;38966:6;38974:9;38985:6;38945:20;:47::i;:::-;39003:38;-1:-1:-1;;;;;39057:23:0;;39075:4;39057:23;;;:53;;-1:-1:-1;;;;;;39084:26:0;;39105:4;39084:26;;39057:53;39054:459;;;39293:11;;:29;;;-1:-1:-1;;;39293:29:0;;;;39162:24;;-1:-1:-1;;;;;39293:11:0;;:27;;:29;;;;;;;;;;;;;;39162:24;39293:11;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39272:98:0;;39371:6;39379:9;39390:6;39272:125;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39201:196;-1:-1:-1;39201:196:0;-1:-1:-1;39478:6:0;39422:52;39201:196;;39422:20;:52::i;:::-;:62;39414:87;;;;-1:-1:-1;;;39414:87:0;;;;;;;:::i;:::-;39054:459;;39528:34;;39525:311;;39604:11;;:30;;;-1:-1:-1;;;39604:30:0;;;;39579:22;;-1:-1:-1;;;;;39604:11:0;;:28;;:30;;;;;;;;;;;;;;39579:22;39604:11;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39677:25:0;;;;;;:9;:25;;;;;;39579:55;;-1:-1:-1;39677:61:0;;39707:30;39677:29;:61::i;:::-;-1:-1:-1;;;;;39649:25:0;;;;;;;:9;:25;;;;;;;:89;;;;39758:64;;;;;;-1:-1:-1;;;;;;;;;;;39758:64:0;;;39791:30;;39758:64;:::i;:::-;;;;;;;;39525:311;;39913:71;39935:6;39913:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39913:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;39893:17:0;;;;;;;:9;:17;;;;;;:91;;;;40018:20;;;;;;;:68;;40055:30;;40018:32;;40043:6;40018:24;:32::i;:::-;:36;;:68::i;:::-;-1:-1:-1;;;;;39995:20:0;;;;;;;:9;:20;;;;;:91;;;;40102:71;;-1:-1:-1;;;;;;;;;;;40130:42:0;:6;40141:30;40130:10;:42::i;:::-;40102:71;;;;;;:::i;:::-;;;;;;;;38627:1554;;;;:::o;4705:192::-;4791:7;4827:12;4819:6;;;;4811:29;;;;-1:-1:-1;;;4811:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;4863:5:0;;;4705:192::o;23004:86::-;23066:12;;;;:5;;:12;;;;;:::i;3802:181::-;3860:7;3892:5;;;3916:6;;;;3908:46;;;;-1:-1:-1;;;3908:46:0;;;;;;;:::i;:::-;3974:1;3802:181;-1:-1:-1;;;3802:181:0:o;30993:1537::-;31038:22;;31234:825;31264:17;;-1:-1:-1;;;31264:17:0;;;;31257:24;;31234:825;;;31310:32;;:::i;:::-;31345:14;31360:4;31345:20;;;;;;;;;;;;;;;;31310:55;;;;;;;;31345:20;;;;;;;31310:55;;-1:-1:-1;;;;;31310:55:0;;;;;;;;;;;;;;;;;;;;;;31410:54;-1:-1:-1;;;31410:54:0;;31310:55;;-1:-1:-1;31310:55:0;31410:39;;:54;;31458:4;;31410:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31384:80;;31539:18;31560:82;31607:12;:34;;;31560:42;31580:12;:21;;;31560:15;:19;;:42;;;;:::i;:::-;:46;;:82::i;:::-;31539:103;;31713:10;31696:14;:27;:57;;31739:14;31696:57;;;31726:10;31696:57;31679:74;-1:-1:-1;31963:9:0;31960:84;;32014:10;31997:27;;31960:84;-1:-1:-1;;;31283:6:0;;31234:825;;;;32155:13;32150:366;32182:17;;-1:-1:-1;;;32182:17:0;;;;32174:25;;32150:366;;;32229:32;;:::i;:::-;32264:14;32279:5;32264:21;;;;;;;;;;;;;;;;32229:56;;;;;;;;32264:21;;;;;;;32229:56;;-1:-1:-1;;;;;32229:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32325:54:0;;:14;;:18;:54::i;:::-;32448:21;;;;32306:73;;-1:-1:-1;32448:35:0;;32306:73;32448:25;:35::i;:::-;32415:14;32430:5;32415:21;;;;;;;;;;;;;;;;;;:30;;:68;;;;32150:366;;32201:7;;;;;;;32150:366;;;;30993:1537;:::o;26703:143::-;26771:14;26777:2;26781:3;26771:5;:14::i;:::-;26826:2;-1:-1:-1;;;;;26806:28:0;26814:10;-1:-1:-1;;;;;26806:28:0;;26830:3;26806:28;;;;;;:::i;:::-;;;;;;;;26703:143;;:::o;26913:196::-;26993:16;26999:4;27005:3;26993:5;:16::i;:::-;27024:29;27045:2;27049:3;27024:20;:29::i;:::-;27089:2;-1:-1:-1;;;;;27073:24:0;27083:4;-1:-1:-1;;;;;27073:24:0;;27093:3;27073:24;;;;;;:::i;4266:136::-;4324:7;4351:43;4355:1;4358;4351:43;;;;;;;;;;;;;;;;;:3;:43::i;28093:371::-;28253:12;28267:17;28288:5;-1:-1:-1;;;;;28288:10:0;28322;28334:2;28338:5;28299:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28299:45:0;;;;;;;;;;;28288:57;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28252:93;;;;28368:7;:57;;;;-1:-1:-1;28380:11:0;;:16;;:44;;;28411:4;28400:24;;;;;;;;;;;;:::i;:::-;28360:92;;;;-1:-1:-1;;;28360:92:0;;;;;;;:::i;29359:928::-;29429:12;29424:852;29454:17;;-1:-1:-1;;;29454:17:0;;;;29447:24;;29424:852;;;29500:32;;:::i;:::-;29535:14;29550:4;29535:20;;;;;;;;;;;;;;;;29500:55;;;;;;;;29535:20;;;;;;;29500:55;;-1:-1:-1;;;;;29500:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29638:43:0;;:3;;:7;:43::i;:::-;29618:63;;29700:26;29736:12;:21;;;-1:-1:-1;;;;;29729:39:0;;29777:4;29729:54;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29700:83;;29802:77;29819:12;:21;;;29842:10;29862:4;29869:9;29802:16;:77::i;:::-;29933:21;;29926:54;;-1:-1:-1;;;29926:54:0;;29898:25;;-1:-1:-1;;;;;29926:39:0;;;;:54;;29974:4;;29926:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29898:82;-1:-1:-1;30052:9:0;30007:41;29898:82;30029:18;30007:21;:41::i;:::-;:54;29999:88;;;;-1:-1:-1;;;29999:88:0;;;;;;;:::i;:::-;30224:21;;;;:36;;30250:9;30224:25;:36::i;:::-;30192:14;30207:4;30192:20;;;;;;;;;;;;;;;;;;:29;;:68;;;;29424:852;;;;29473:6;;;;;;;29424:852;;15893:508;16310:4;16356:17;16388:7;15893:508;:::o;18839:129::-;15492:12;;;;;;;;:31;;;15508:15;:13;:15::i;:::-;15492:47;;;-1:-1:-1;15528:11:0;;;;15527:12;15492:47;15484:106;;;;-1:-1:-1;;;15484:106:0;;;;;;;:::i;:::-;15599:19;15622:12;;;;;;15621:13;15641:83;;;;15670:12;:19;;-1:-1:-1;;;;15670:19:0;;;;;15698:18;15685:4;15698:18;;;15641:83;18897:26:::1;:24;:26::i;:::-;18934;:24;:26::i;:::-;15746:14:::0;15742:57;;;15786:5;15771:20;;-1:-1:-1;;15771:20:0;;;18839:129;:::o;23102:3195::-;15492:12;;;;;;;;:31;;;15508:15;:13;:15::i;:::-;15492:47;;;-1:-1:-1;15528:11:0;;;;15527:12;15492:47;15484:106;;;;-1:-1:-1;;;15484:106:0;;;;;;;:::i;:::-;15599:19;15622:12;;;;;;15621:13;15641:83;;;;15670:12;:19;;-1:-1:-1;;;;15670:19:0;;;;;15698:18;15685:4;15698:18;;;15641:83;23286:45:::1;:43;:45::i;:::-;23480:8;:15;23459:10;:17;:36;23451:76;;;;-1:-1:-1::0;;;23451:76:0::1;;;;;;;:::i;:::-;23542:17;23574::::0;23641:22:::1;23687:12:::0;23682:803:::1;23712:10;:17;23705:4;:24;23682:803;;;23835:1;23818:8;23827:4;23818:14;;;;;;;;;;;;;;:18;;;23810:91;;;;-1:-1:-1::0;;;23810:91:0::1;;;;;;;:::i;:::-;24194:11;24172:33;;:13;24186:4;24172:19;;;;;;;;;;;;;;:33;;;:69;;24230:11;24172:69;;;24208:13;24222:4;24208:19;;;;;;;;;;;;;;24172:69;24158:83;;24306:8;24315:4;24306:14;;;;;;;;;::::0;;::::1;::::0;;;;;;24290:30:::1;;::::0;;;::::1;::::0;24451:18:::1;::::0;;::::1;::::0;23731:6:::1;23682:803;;;;24521:12;24537:3;24521:19;24513:86;;;;-1:-1:-1::0;;;24513:86:0::1;;;;;;;:::i;:::-;24642:10;:17;24622:16;:37;;;24614:91;;;;-1:-1:-1::0;;;24614:91:0::1;;;;;;;:::i;:::-;24817:17;:36:::0;;-1:-1:-1;;;;24817:36:0::1;-1:-1:-1::0;;;24817:36:0::1;::::0;::::1;;;::::0;;-1:-1:-1;24939:1020:0::1;24969:16;24962:23;;:4;:23;24939:1020;;;25160:25;25202:13;25216:4;25202:19;;;;;;;;;;;;;;25188:11;:33;25160:61;;;;25305:29;25356:1;25337:16;:20;;;:70;;25406:1;25337:70;;;25360:43;25388:8;25397:4;25388:14;;;;;;;;;;;;;;25360:43;;25365:17;25361:2;:21;25360:27;;:43;;;;:::i;:::-;25305:102;;25426:14;25468:456;;;;;;;;25518:10;25529:4;25518:16;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;25468:456:0;;::::1;::::0;;25571:1:::1;25468:456:::0;;::::1;::::0;;;;;;;;;;;25426:517;;::::1;::::0;;::::1;::::0;;;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;25426:517:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;24987:6;;;::::1;::::0;-1:-1:-1;24939:1020:0::1;;;-1:-1:-1::0;25975:12:0;;::::1;::::0;:5:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;26002:16:0;;::::1;::::0;:7:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;;26167:1;26148:16;:20;;;:52;;26189:11;26148:52;;;26171:11;26185:1;26171:15;26148:52;26136:9;:64:::0;;-1:-1:-1;;26136:64:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;15742:57:0;;;-1:-1:-1;15742:57:0;;15786:5;15771:20;;-1:-1:-1;;15771:20:0;;;15742:57;23102:3195;;;;;;:::o;6103:132::-;6161:7;6188:39;6192:1;6195;6188:39;;;;;;;;;;;;;;;;;:3;:39::i;5156:471::-;5214:7;5459:6;5455:47;;-1:-1:-1;5489:1:0;5482:8;;5455:47;5526:5;;;5530:1;5526;:5;:1;5550:5;;;;;:10;5542:56;;;;-1:-1:-1;;;5542:56:0;;;;;;;:::i;40462:378::-;-1:-1:-1;;;;;40546:21:0;;40538:65;;;;-1:-1:-1;;;40538:65:0;;;;;;;:::i;:::-;40616:49;40645:1;40649:7;40658:6;40616:20;:49::i;:::-;40693:12;;:24;;40710:6;40693:16;:24::i;:::-;40678:12;:39;-1:-1:-1;;;;;40749:18:0;;;;;;:9;:18;;;;;;:30;;40772:6;40749:22;:30::i;:::-;-1:-1:-1;;;;;40728:18:0;;;;;;:9;:18;;;;;;:51;;;;40795:37;;40728:18;;;-1:-1:-1;;;;;;;;;;;40795:37:0;;;40825:6;;40795:37;:::i;41172:418::-;-1:-1:-1;;;;;41256:21:0;;41248:67;;;;-1:-1:-1;;;41248:67:0;;;;;;;:::i;:::-;41328:49;41349:7;41366:1;41370:6;41328:20;:49::i;:::-;41411:68;41434:6;41411:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41411:18:0;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;41390:18:0;;;;;;:9;:18;;;;;:89;41505:12;;:24;;41522:6;41505:16;:24::i;:::-;41490:12;:39;41545:37;;41571:1;;-1:-1:-1;;;;;41545:37:0;;;-1:-1:-1;;;;;;;;;;;41545:37:0;;;41575:6;;41545:37;:::i;27613:468::-;27697:12;27692:378;27722:17;;-1:-1:-1;;;27722:17:0;;;;27715:24;;27692:378;;;27768:33;27804:14;27819:4;27804:20;;;;;;;;;;;;;;;;;;27768:56;;27843:17;27863:43;27871:12;:34;;;27863:3;:7;;:43;;;;:::i;:::-;27938:21;;27843:63;;-1:-1:-1;27925:50:0;;-1:-1:-1;;;;;27938:21:0;27961:2;27843:63;27925:12;:50::i;:::-;28018:21;;;;:36;;28044:9;28018:25;:36::i;:::-;27994:21;;;;:60;-1:-1:-1;27741:6:0;27692:378;;28476:412;28666:12;28680:17;28701:5;-1:-1:-1;;;;;28701:10:0;28735;28747:4;28753:2;28757:5;28712:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28712:51:0;;;;;;;;;;;28701:63;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28665:99;;;;28787:7;:57;;;;-1:-1:-1;28799:11:0;;:16;;:44;;;28830:4;28819:24;;;;;;;;;;;;:::i;:::-;28779:97;;;;-1:-1:-1;;;28779:97:0;;;;;;;:::i;17450:69::-;15492:12;;;;;;;;:31;;;15508:15;:13;:15::i;:::-;15492:47;;;-1:-1:-1;15528:11:0;;;;15527:12;15492:47;15484:106;;;;-1:-1:-1;;;15484:106:0;;;;;;;:::i;:::-;15599:19;15622:12;;;;;;15621:13;15641:83;;;;15670:12;:19;;-1:-1:-1;;;;15670:19:0;;;;;15698:18;15685:4;15698:18;;;15746:14;15742:57;;;15786:5;15771:20;;-1:-1:-1;;15771:20:0;;;17450:69;:::o;18976:202::-;15492:12;;;;;;;;:31;;;15508:15;:13;:15::i;:::-;15492:47;;;-1:-1:-1;15528:11:0;;;;15527:12;15492:47;15484:106;;;;-1:-1:-1;;;15484:106:0;;;;;;;:::i;:::-;15599:19;15622:12;;;;;;15621:13;15641:83;;;;15670:12;:19;;-1:-1:-1;;;;15670:19:0;;;;;15698:18;15685:4;15698:18;;;15641:83;19048:17:::1;19068:12;:10;:12::i;:::-;19091:6;:18:::0;;-1:-1:-1;;;;;;19091:18:0::1;-1:-1:-1::0;;;;;19091:18:0;::::1;::::0;;::::1;::::0;;;19125:43:::1;::::0;19091:18;;-1:-1:-1;19091:18:0;-1:-1:-1;;19125:43:0::1;::::0;-1:-1:-1;;19125:43:0::1;15732:1;15746:14:::0;15742:57;;;15786:5;15771:20;;-1:-1:-1;;15771:20:0;;;18976:202;:::o;6731:278::-;6817:7;6852:12;6845:5;6837:28;;;;-1:-1:-1;;;6837:28:0;;;;;;;;:::i;:::-;;6876:9;6892:1;6888;:5;;;;;;;6731:278;-1:-1:-1;;;;;6731:278:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:130;72:20;;97:33;72:20;97:33;:::i;1032:701::-;;1147:3;1140:4;1132:6;1128:17;1124:27;1114:2;;-1:-1;;1155:12;1114:2;1202:6;1189:20;1224:78;1239:62;1294:6;1239:62;:::i;:::-;1224:78;:::i;:::-;1330:21;;;1215:87;-1:-1;1374:4;1387:14;;;;1362:17;;;1476;;;1467:27;;;;1464:36;-1:-1;1461:2;;;1513:1;;1503:12;1461:2;1538:1;;1523:204;1548:6;1545:1;1542:13;1523:204;;;2683:6;2670:20;32003:4;33005:5;31992:16;32982:5;32979:33;32969:2;;1538:1;;33016:12;32969:2;1616:48;;1678:14;;;;1706;;;;1570:1;1563:9;1523:204;;;1527:14;;;;;;1107:626;;;;:::o;2738:241::-;;2842:2;2830:9;2821:7;2817:23;2813:32;2810:2;;;-1:-1;;2848:12;2810:2;85:6;72:20;97:33;124:5;97:33;:::i;2986:263::-;;3101:2;3089:9;3080:7;3076:23;3072:32;3069:2;;;-1:-1;;3107:12;3069:2;226:6;220:13;238:33;265:5;238:33;:::i;3256:366::-;;;3377:2;3365:9;3356:7;3352:23;3348:32;3345:2;;;-1:-1;;3383:12;3345:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3435:63;-1:-1;3535:2;3574:22;;72:20;97:33;72:20;97:33;:::i;:::-;3543:63;;;;3339:283;;;;;:::o;3629:491::-;;;;3767:2;3755:9;3746:7;3742:23;3738:32;3735:2;;;-1:-1;;3773:12;3735:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3825:63;-1:-1;3925:2;3964:22;;72:20;97:33;72:20;97:33;:::i;:::-;3729:391;;3933:63;;-1:-1;;;4033:2;4072:22;;;;2394:20;;3729:391::o;4127:366::-;;;4248:2;4236:9;4227:7;4223:23;4219:32;4216:2;;;-1:-1;;4254:12;4216:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4306:63;4406:2;4445:22;;;;2394:20;;-1:-1;;;4210:283::o;4500:1017::-;;;;;4726:3;4714:9;4705:7;4701:23;4697:33;4694:2;;;-1:-1;;4733:12;4694:2;4791:17;4778:31;4829:18;;4821:6;4818:30;4815:2;;;-1:-1;;4851:12;4815:2;4942:6;4931:9;4927:22;;;418:3;411:4;403:6;399:17;395:27;385:2;;-1:-1;;426:12;385:2;473:6;460:20;495:80;510:64;567:6;510:64;:::i;495:80::-;581:16;617:6;610:5;603:21;647:4;;664:3;660:14;653:21;;647:4;639:6;635:17;769:3;647:4;;753:6;749:17;639:6;740:27;;737:36;734:2;;;-1:-1;;776:12;734:2;-1:-1;802:10;;796:206;821:6;818:1;815:13;796:206;;;901:37;934:3;922:10;901:37;:::i;:::-;889:50;;843:1;836:9;;;;;953:14;;;;981;;796:206;;;-1:-1;4871:88;;-1:-1;5009:18;;4996:32;;-1:-1;;;5037:30;;;5034:2;;;-1:-1;;5070:12;5034:2;5100:76;5168:7;5159:6;5148:9;5144:22;5100:76;:::i;:::-;5090:86;;5241:2;5230:9;5226:18;5213:32;5199:46;;4829:18;5257:6;5254:30;5251:2;;;-1:-1;;5287:12;5251:2;;5317:76;5385:7;5376:6;5365:9;5361:22;5317:76;:::i;:::-;5307:86;;;5448:53;5493:7;5430:2;5473:9;5469:22;5448:53;:::i;:::-;5438:63;;4688:829;;;;;;;:::o;5524:257::-;;5636:2;5624:9;5615:7;5611:23;5607:32;5604:2;;;-1:-1;;5642:12;5604:2;1822:6;1816:13;32761:5;31699:13;31692:21;32739:5;32736:32;32726:2;;-1:-1;;32772:12;5788:347;;5902:2;;5890:9;5881:7;5877:23;5873:32;5870:2;;;-1:-1;;5908:12;5870:2;5966:17;5953:31;6004:18;;5996:6;5993:30;5990:2;;;-1:-1;;6026:12;5990:2;6102:6;6091:9;6087:22;;;1979:3;1972:4;1964:6;1960:17;1956:27;1946:2;;-1:-1;;1987:12;1946:2;2034:6;2021:20;6004:18;30760:6;30757:30;30754:2;;;-1:-1;;30790:12;30754:2;2056:65;30863:9;30844:17;;-1:-1;;30840:33;30921:15;;2056:65;:::i;:::-;2047:74;;2141:6;2134:5;2127:21;2245:3;5902:2;2236:6;2169;2227:16;;2224:25;2221:2;;;-1:-1;;2252:12;2221:2;32102:6;5902:2;2169:6;2165:17;5902:2;2203:5;2199:16;32079:30;32140:16;;;;;32133:27;;;;2203:5;5864:271;-1:-1;;;5864:271::o;6142:241::-;;6246:2;6234:9;6225:7;6221:23;6217:32;6214:2;;;-1:-1;;6252:12;6214:2;-1:-1;2394:20;;6208:175;-1:-1;6208:175::o;6390:263::-;;6505:2;6493:9;6484:7;6480:23;6476:32;6473:2;;;-1:-1;;6511:12;6473:2;-1:-1;2542:13;;6467:186;-1:-1;6467:186::o;6660:399::-;;;6792:2;6780:9;6771:7;6767:23;6763:32;6760:2;;;-1:-1;;6798:12;6760:2;-1:-1;;2542:13;;6961:2;7011:22;;;2542:13;;;;;-1:-1;6754:305::o;16856:271::-;;7457:5;31040:12;7568:52;7613:6;7608:3;7601:4;7594:5;7590:16;7568:52;:::i;:::-;7632:16;;;;;16990:137;-1:-1;;16990:137::o;17134:222::-;-1:-1;;;;;31787:54;;;;7137:37;;17261:2;17246:18;;17232:124::o;17363:444::-;-1:-1;;;;;31787:54;;;7137:37;;31787:54;;;;17710:2;17695:18;;7137:37;17793:2;17778:18;;16693:37;;;;17546:2;17531:18;;17517:290::o;17814:333::-;-1:-1;;;;;31787:54;;;;7137:37;;18133:2;18118:18;;16693:37;17969:2;17954:18;;17940:207::o;18154:444::-;-1:-1;;;;;31787:54;;;;7137:37;;18501:2;18486:18;;16693:37;;;;18584:2;18569:18;;16693:37;18337:2;18322:18;;18308:290::o;18605:210::-;31699:13;;31692:21;7251:34;;18726:2;18711:18;;18697:118::o;18822:310::-;;18969:2;18990:17;18983:47;7805:5;31040:12;31479:6;18969:2;18958:9;18954:18;31467:19;7899:52;7944:6;31507:14;18958:9;31507:14;18969:2;7925:5;7921:16;7899:52;:::i;:::-;30863:9;32519:14;-1:-1;;32515:28;7963:39;;;;31507:14;7963:39;;18940:192;-1:-1;;18940:192::o;19139:416::-;19339:2;19353:47;;;8239:2;19324:18;;;31467:19;8275:34;31507:14;;;8255:55;-1:-1;;;8330:12;;;8323:27;8369:12;;;19310:245::o;19562:416::-;19762:2;19776:47;;;8620:2;19747:18;;;31467:19;-1:-1;;;31507:14;;;8636:45;8700:12;;;19733:245::o;19985:416::-;20185:2;20199:47;;;8951:2;20170:18;;;31467:19;8987:34;31507:14;;;8967:55;-1:-1;;;9042:12;;;9035:33;9087:12;;;20156:245::o;20408:416::-;20608:2;20622:47;;;9338:2;20593:18;;;31467:19;9374:34;31507:14;;;9354:55;9443:30;9429:12;;;9422:52;9493:12;;;20579:245::o;20831:416::-;21031:2;21045:47;;;9744:2;21016:18;;;31467:19;9780:34;31507:14;;;9760:55;-1:-1;;;9835:12;;;9828:30;9877:12;;;21002:245::o;21254:416::-;21454:2;21468:47;;;10128:2;21439:18;;;31467:19;10164:34;31507:14;;;10144:55;-1:-1;;;10219:12;;;10212:26;10257:12;;;21425:245::o;21677:416::-;21877:2;21891:47;;;10508:2;21862:18;;;31467:19;10544:29;31507:14;;;10524:50;10593:12;;;21848:245::o;22100:416::-;22300:2;22314:47;;;10844:2;22285:18;;;31467:19;-1:-1;;;31507:14;;;10860:38;10917:12;;;22271:245::o;22523:416::-;22723:2;22737:47;;;11168:2;22708:18;;;31467:19;-1:-1;;;31507:14;;;11184:35;11238:12;;;22694:245::o;22946:416::-;23146:2;23160:47;;;11489:2;23131:18;;;31467:19;11525:34;31507:14;;;11505:55;-1:-1;;;11580:12;;;11573:25;11617:12;;;23117:245::o;23369:416::-;23569:2;23583:47;;;11868:2;23554:18;;;31467:19;-1:-1;;;31507:14;;;11884:39;11942:12;;;23540:245::o;23792:416::-;23992:2;24006:47;;;12193:2;23977:18;;;31467:19;12229:25;31507:14;;;12209:46;12274:12;;;23963:245::o;24215:416::-;24415:2;24429:47;;;12525:2;24400:18;;;31467:19;12561:29;31507:14;;;12541:50;12610:12;;;24386:245::o;24638:416::-;24838:2;24852:47;;;12861:2;24823:18;;;31467:19;12897:34;31507:14;;;12877:55;-1:-1;;;12952:12;;;12945:25;12989:12;;;24809:245::o;25061:416::-;25261:2;25275:47;;;25246:18;;;31467:19;13276:34;31507:14;;;13256:55;13330:12;;;25232:245::o;25484:416::-;25684:2;25698:47;;;13581:2;25669:18;;;31467:19;13617:34;31507:14;;;13597:55;-1:-1;;;13672:12;;;13665:38;13722:12;;;25655:245::o;25907:416::-;26107:2;26121:47;;;13973:2;26092:18;;;31467:19;-1:-1;;;31507:14;;;13989:44;14052:12;;;26078:245::o;26330:416::-;26530:2;26544:47;;;14303:2;26515:18;;;31467:19;14339:34;31507:14;;;14319:55;-1:-1;;;14394:12;;;14387:25;14431:12;;;26501:245::o;26753:416::-;26953:2;26967:47;;;14682:2;26938:18;;;31467:19;14718:34;31507:14;;;14698:55;-1:-1;;;14773:12;;;14766:29;14814:12;;;26924:245::o;27176:416::-;27376:2;27390:47;;;15065:2;27361:18;;;31467:19;15101:29;31507:14;;;15081:50;15150:12;;;27347:245::o;27599:416::-;27799:2;27813:47;;;15401:2;27784:18;;;31467:19;15437:34;31507:14;;;15417:55;-1:-1;;;15492:12;;;15485:28;15532:12;;;27770:245::o;28022:416::-;28222:2;28236:47;;;15783:2;28207:18;;;31467:19;-1:-1;;;31507:14;;;15799:38;15856:12;;;28193:245::o;28445:416::-;28645:2;28659:47;;;16107:2;28630:18;;;31467:19;16143:34;31507:14;;;16123:55;-1:-1;;;16198:12;;;16191:46;16256:12;;;28616:245::o;28868:416::-;29068:2;29082:47;;;16507:2;29053:18;;;31467:19;16543:33;31507:14;;;16523:54;16596:12;;;29039:245::o;29291:222::-;16693:37;;;29418:2;29403:18;;29389:124::o;29520:214::-;32003:4;31992:16;;;;16809:35;;29643:2;29628:18;;29614:120::o;29741:256::-;29803:2;29797:9;29829:17;;;29904:18;29889:34;;29925:22;;;29886:62;29883:2;;;29961:1;;29951:12;29883:2;29803;29970:22;29781:216;;-1:-1;29781:216::o;30004:304::-;;30163:18;30155:6;30152:30;30149:2;;;-1:-1;;30185:12;30149:2;-1:-1;30230:4;30218:17;;;30283:15;;30086:222::o;32175:268::-;32240:1;32247:101;32261:6;32258:1;32255:13;32247:101;;;32328:11;;;32322:18;32309:11;;;32302:39;32283:2;32276:10;32247:101;;;32363:6;32360:1;32357:13;32354:2;;;32240:1;32419:6;32414:3;32410:16;32403:27;32354:2;;32224:219;;;:::o;32556:117::-;-1:-1;;;;;31787:54;;32615:35;;32605:2;;32664:1;;32654:12
Swarm Source
ipfs://dd87e89fda952d497c4768b2ec6dfbd63bc3a65f7dc820715515f2162220a743
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.