More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,974 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw From St... | 21270845 | 16 hrs ago | IN | 0 ETH | 0.00137762 | ||||
Withdraw From St... | 21256821 | 2 days ago | IN | 0 ETH | 0.00114236 | ||||
Withdraw From St... | 21235670 | 5 days ago | IN | 0 ETH | 0.00120554 | ||||
Withdraw From St... | 21220282 | 7 days ago | IN | 0 ETH | 0.00119809 | ||||
Withdraw From St... | 21206061 | 9 days ago | IN | 0 ETH | 0.0009836 | ||||
Withdraw From St... | 21191435 | 11 days ago | IN | 0 ETH | 0.00181272 | ||||
Withdraw From St... | 21177377 | 13 days ago | IN | 0 ETH | 0.00234782 | ||||
Withdraw From St... | 21160720 | 16 days ago | IN | 0 ETH | 0.00159998 | ||||
Withdraw From St... | 21145012 | 18 days ago | IN | 0 ETH | 0.00162227 | ||||
Withdraw From St... | 21128687 | 20 days ago | IN | 0 ETH | 0.00276851 | ||||
Withdraw From St... | 21112738 | 22 days ago | IN | 0 ETH | 0.00045216 | ||||
Withdraw From St... | 21096789 | 24 days ago | IN | 0 ETH | 0.0004649 | ||||
Withdraw From St... | 21081827 | 27 days ago | IN | 0 ETH | 0.00089858 | ||||
Withdraw From St... | 21062936 | 29 days ago | IN | 0 ETH | 0.00046411 | ||||
Withdraw From St... | 21046518 | 31 days ago | IN | 0 ETH | 0.0005686 | ||||
Withdraw From St... | 21030564 | 34 days ago | IN | 0 ETH | 0.00140683 | ||||
Withdraw From St... | 21011216 | 36 days ago | IN | 0 ETH | 0.00086926 | ||||
Withdraw From St... | 20996604 | 38 days ago | IN | 0 ETH | 0.00104209 | ||||
Withdraw From St... | 20981554 | 41 days ago | IN | 0 ETH | 0.00090456 | ||||
Withdraw From St... | 20967028 | 43 days ago | IN | 0 ETH | 0.00207152 | ||||
Withdraw From St... | 20949085 | 45 days ago | IN | 0 ETH | 0.00089667 | ||||
Withdraw From St... | 20933640 | 47 days ago | IN | 0 ETH | 0.00093502 | ||||
Withdraw From St... | 20916983 | 50 days ago | IN | 0 ETH | 0.00094334 | ||||
Withdraw From St... | 20902333 | 52 days ago | IN | 0 ETH | 0.00050048 | ||||
Withdraw From St... | 20888483 | 54 days ago | IN | 0 ETH | 0.00054282 |
Loading...
Loading
Contract Name:
XHalfLife
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-20 */ // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.5.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. * * _Available since v2.4.0._ */ 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. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 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. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol pragma solidity ^0.5.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. * * _Since v2.5.0:_ this module is now much more gas efficient, given net gas * metering changes introduced in the Istanbul hardfork. */ contract ReentrancyGuard { bool private _notEntered; constructor () internal { // Storing an initial non-zero value makes deployment a bit more // expensive, but in exchange the refund on every call to nonReentrant // will be lower in amount. Since refunds are capped to a percetange of // the total transaction's gas, it is best to keep them low in cases // like this one, to increase the likelihood of the full refund coming // into effect. _notEntered = true; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_notEntered, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _notEntered = false; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _notEntered = true; } } // File: contracts/lib/AddressHelper.sol pragma solidity 0.5.17; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library AddressHelper { 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))), "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))), "TRANSFER_FROM_FAILED" ); } function safeTransferEther(address to, uint256 value) internal { (bool success, ) = to.call.value(value)(new bytes(0)); require(success, "ETH_TRANSFER_FAILED"); } function isContract(address token) internal view returns (bool) { if (token == address(0x0)) { return false; } uint256 size; assembly { size := extcodesize(token) } return size > 0; } /** * @dev returns the address used within the protocol to identify ETH * @return the address assigned to ETH */ function ethAddress() internal pure returns (address) { return 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; } } // File: contracts/lib/XNum.sol pragma solidity 0.5.17; library XNum { uint256 public constant BONE = 10**18; uint256 public constant MIN_BPOW_BASE = 1 wei; uint256 public constant MAX_BPOW_BASE = (2 * BONE) - 1 wei; uint256 public constant BPOW_PRECISION = BONE / 10**10; function btoi(uint256 a) internal pure returns (uint256) { return a / BONE; } function bfloor(uint256 a) internal pure returns (uint256) { return btoi(a) * BONE; } function badd(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "ERR_ADD_OVERFLOW"); return c; } function bsub(uint256 a, uint256 b) internal pure returns (uint256) { (uint256 c, bool flag) = bsubSign(a, b); require(!flag, "ERR_SUB_UNDERFLOW"); return c; } function bsubSign(uint256 a, uint256 b) internal pure returns (uint256, bool) { if (a >= b) { return (a - b, false); } else { return (b - a, true); } } function bmul(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c0 = a * b; require(a == 0 || c0 / a == b, "ERR_MUL_OVERFLOW"); uint256 c1 = c0 + (BONE / 2); require(c1 >= c0, "ERR_MUL_OVERFLOW"); uint256 c2 = c1 / BONE; return c2; } function bdiv(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "ERR_DIV_ZERO"); uint256 c0 = a * BONE; require(a == 0 || c0 / a == BONE, "ERR_DIV_INTERNAL"); // bmul overflow uint256 c1 = c0 + (b / 2); require(c1 >= c0, "ERR_DIV_INTERNAL"); // badd require uint256 c2 = c1 / b; return c2; } // DSMath.wpow function bpowi(uint256 a, uint256 n) internal pure returns (uint256) { uint256 z = n % 2 != 0 ? a : BONE; for (n /= 2; n != 0; n /= 2) { a = bmul(a, a); if (n % 2 != 0) { z = bmul(z, a); } } return z; } // Compute b^(e.w) by splitting it into (b^e)*(b^0.w). // Use `bpowi` for `b^e` and `bpowK` for k iterations // of approximation of b^0.w function bpow(uint256 base, uint256 exp) internal pure returns (uint256) { require(base >= MIN_BPOW_BASE, "ERR_BPOW_BASE_TOO_LOW"); require(base <= MAX_BPOW_BASE, "ERR_BPOW_BASE_TOO_HIGH"); uint256 whole = bfloor(exp); uint256 remain = bsub(exp, whole); uint256 wholePow = bpowi(base, btoi(whole)); if (remain == 0) { return wholePow; } uint256 partialResult = bpowApprox(base, remain, BPOW_PRECISION); return bmul(wholePow, partialResult); } function bpowApprox( uint256 base, uint256 exp, uint256 precision ) internal pure returns (uint256) { // term 0: uint256 a = exp; (uint256 x, bool xneg) = bsubSign(base, BONE); uint256 term = BONE; uint256 sum = term; bool negative = false; // term(k) = numer / denom // = (product(a - i + 1, i=1-->k) * x^k) / (k!) // each iteration, multiply previous term by (a-(k-1)) * x / k // continue until term is less than precision for (uint256 i = 1; term >= precision; i++) { uint256 bigK = i * BONE; (uint256 c, bool cneg) = bsubSign(a, bsub(bigK, BONE)); term = bmul(term, bmul(c, x)); term = bdiv(term, bigK); if (term == 0) break; if (xneg) negative = !negative; if (cneg) negative = !negative; if (negative) { sum = bsub(sum, term); } else { sum = badd(sum, term); } } return sum; } } // File: contracts/interfaces/IERC20.sol pragma solidity 0.5.17; interface IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address _owner) external view returns (uint256 balance); function transfer(address _to, uint256 _value) external returns (bool success); function transferFrom( address _from, address _to, uint256 _value ) external returns (bool success); function approve(address _spender, uint256 _value) external returns (bool success); function allowance(address _owner, address _spender) external view returns (uint256 remaining); } // File: contracts/XHalfLife.sol pragma solidity 0.5.17; contract XHalfLife is ReentrancyGuard { using SafeMath for uint256; using AddressHelper for address; uint256 private constant ONE = 10**18; /** * @notice Counter for new stream ids. */ uint256 public nextStreamId = 1; /** * @notice key: stream id, value: minimum effective value(0.0001 TOKEN) */ mapping(uint256 => uint256) public effectiveValues; // halflife stream struct Stream { uint256 depositAmount; // total deposited amount, must >= 0.0001 TOKEN uint256 remaining; // un-withdrawable balance uint256 withdrawable; // withdrawable balance uint256 startBlock; // when should start uint256 kBlock; // interval K blocks uint256 unlockRatio; // must be between [1-999], which means 0.1% to 99.9% uint256 denom; // one readable coin represent uint256 lastRewardBlock; // update by create(), fund() and withdraw() address token; // ERC20 token address or 0xEe for Ether address recipient; address sender; bool cancelable; // can be cancelled or not bool isEntity; } /** * @notice The stream objects identifiable by their unsigned integer ids. */ mapping(uint256 => Stream) public streams; /** * @dev Throws if the provided id does not point to a valid stream. */ modifier streamExists(uint256 streamId) { require(streams[streamId].isEntity, "stream does not exist"); _; } /** * @dev Throws if the caller is not the sender of the recipient of the stream. * Throws if the recipient is the zero address, the contract itself or the caller. * Throws if the depositAmount is 0. * Throws if the start block is before `block.number`. */ modifier createStreamPreflight( address recipient, uint256 depositAmount, uint256 startBlock, uint256 kBlock ) { require(recipient != address(0), "stream to the zero address"); require(recipient != address(this), "stream to the contract itself"); require(recipient != msg.sender, "stream to the caller"); require(depositAmount > 0, "deposit amount is zero"); require(startBlock >= block.number, "start block before block.number"); require(kBlock > 0, "k block is zero"); _; } event StreamCreated( uint256 indexed streamId, address indexed sender, address indexed recipient, address token, uint256 depositAmount, uint256 startBlock, uint256 kBlock, uint256 unlockRatio, bool cancelable ); event WithdrawFromStream( uint256 indexed streamId, address indexed recipient, uint256 amount ); event StreamCanceled( uint256 indexed streamId, address indexed sender, address indexed recipient, uint256 senderBalance, uint256 recipientBalance ); event StreamFunded(uint256 indexed streamId, uint256 amount); /** * @notice Creates a new stream funded by `msg.sender` and paid towards `recipient`. * @dev Throws if paused. * Throws if the token is not a contract address * Throws if the recipient is the zero address, the contract itself or the caller. * Throws if the depositAmount is 0. * Throws if the start block is before `block.number`. * Throws if the rate calculation has a math error. * Throws if the next stream id calculation has a math error. * Throws if the contract is not allowed to transfer enough tokens. * @param token The ERC20 token address * @param recipient The address towards which the money is streamed. * @param depositAmount The amount of money to be streamed. * @param startBlock stream start block * @param kBlock unlock every k blocks * @param unlockRatio unlock ratio from remaining balance, * value must be between [1-1000], which means 0.1% to 1% * @param cancelable can be cancelled or not * @return The uint256 id of the newly created stream. */ function createStream( address token, address recipient, uint256 depositAmount, uint256 startBlock, uint256 kBlock, uint256 unlockRatio, bool cancelable ) external createStreamPreflight(recipient, depositAmount, startBlock, kBlock) returns (uint256 streamId) { require(unlockRatio < 1000, "unlockRatio must < 1000"); require(unlockRatio > 0, "unlockRatio must > 0"); require(token.isContract(), "not contract"); token.safeTransferFrom(msg.sender, address(this), depositAmount); streamId = nextStreamId; { uint256 denom = 10**uint256(IERC20(token).decimals()); require(denom >= 10**6, "token decimal too small"); // 0.0001 TOKEN effectiveValues[streamId] = denom.div(10**4); require( depositAmount >= effectiveValues[streamId], "deposit too small" ); streams[streamId] = Stream({ token: token, remaining: depositAmount, withdrawable: 0, depositAmount: depositAmount, startBlock: startBlock, kBlock: kBlock, unlockRatio: unlockRatio, denom: denom, lastRewardBlock: startBlock, recipient: recipient, sender: msg.sender, isEntity: true, cancelable: cancelable }); } nextStreamId = nextStreamId.add(1); emit StreamCreated( streamId, msg.sender, recipient, token, depositAmount, startBlock, kBlock, unlockRatio, cancelable ); } /** * @notice Creates a new ether stream funded by `msg.sender` and paid towards `recipient`. * @dev Throws if paused. * Throws if the recipient is the zero address, the contract itself or the caller. * Throws if the depositAmount is 0. * Throws if the start block is before `block.number`. * Throws if the rate calculation has a math error. * Throws if the next stream id calculation has a math error. * Throws if the contract is not allowed to transfer enough tokens. * @param recipient The address towards which the money is streamed. * @param startBlock stream start block * @param kBlock unlock every k blocks * @param unlockRatio unlock ratio from remaining balance * @param cancelable can be cancelled or not * @return The uint256 id of the newly created stream. */ function createEtherStream( address recipient, uint256 startBlock, uint256 kBlock, uint256 unlockRatio, bool cancelable ) external payable createStreamPreflight(recipient, msg.value, startBlock, kBlock) returns (uint256 streamId) { require(unlockRatio < 1000, "unlockRatio must < 1000"); require(unlockRatio > 0, "unlockRatio must > 0"); require(msg.value >= 10**14, "deposit too small"); /* Create and store the stream object. */ streamId = nextStreamId; streams[streamId] = Stream({ token: AddressHelper.ethAddress(), remaining: msg.value, withdrawable: 0, depositAmount: msg.value, startBlock: startBlock, kBlock: kBlock, unlockRatio: unlockRatio, denom: 10**18, lastRewardBlock: startBlock, recipient: recipient, sender: msg.sender, isEntity: true, cancelable: cancelable }); nextStreamId = nextStreamId.add(1); emit StreamCreated( streamId, msg.sender, recipient, AddressHelper.ethAddress(), msg.value, startBlock, kBlock, unlockRatio, cancelable ); } /** * @notice Check if given stream exists. * @param streamId The id of the stream to query. * @return bool true=exists, otherwise false. */ function hasStream(uint256 streamId) external view returns (bool) { return streams[streamId].isEntity; } /** * @notice Returns the stream with all its properties. * @dev Throws if the id does not point to a valid stream. * @param streamId The id of the stream to query. * @return sender * @return recipient * @return token * @return depositAmount * @return startBlock * @return kBlock * @return remaining * @return withdrawable * @return unlockRatio * @return lastRewardBlock * @return cancelable */ function getStream(uint256 streamId) external view streamExists(streamId) returns ( address sender, address recipient, address token, uint256 depositAmount, uint256 startBlock, uint256 kBlock, uint256 remaining, uint256 withdrawable, uint256 unlockRatio, uint256 lastRewardBlock, bool cancelable ) { Stream memory stream = streams[streamId]; sender = stream.sender; recipient = stream.recipient; token = stream.token; depositAmount = stream.depositAmount; startBlock = stream.startBlock; kBlock = stream.kBlock; remaining = stream.remaining; withdrawable = stream.withdrawable; unlockRatio = stream.unlockRatio; lastRewardBlock = stream.lastRewardBlock; cancelable = stream.cancelable; } /** * @notice funds to an existing stream(for general purpose), the amount of fund should be simply added to un-withdrawable. * @dev Throws if the caller is not the stream.sender * @param streamId The id of the stream to query. * @param amount deposit amount by stream sender */ function singleFundStream(uint256 streamId, uint256 amount) external payable nonReentrant streamExists(streamId) returns (bool) { Stream storage stream = streams[streamId]; require( msg.sender == stream.sender, "caller must be the sender of the stream" ); require(amount > effectiveValues[streamId], "amount not effective"); if (stream.token == AddressHelper.ethAddress()) { require(amount == msg.value, "bad ether fund"); } else { stream.token.safeTransferFrom(msg.sender, address(this), amount); } (uint256 withdrawable, uint256 remaining) = balanceOf(streamId); // update remaining and withdrawable balance stream.lastRewardBlock = block.number; stream.remaining = remaining.add(amount); // = remaining + amount stream.withdrawable = withdrawable; // = withdrawable //add funds to total deposit amount stream.depositAmount = stream.depositAmount.add(amount); emit StreamFunded(streamId, amount); return true; } /** * @notice Implemented for XDEX farming and vesting, * the amount of fund should be splited to withdrawable and un-withdrawable according to lastRewardBlock. * @dev Throws if the caller is not the stream.sender * @param streamId The id of the stream to query. * @param amount deposit amount by stream sender * @param blockHeightDiff diff of block.number and farmPool's lastRewardBlock */ function lazyFundStream( uint256 streamId, uint256 amount, uint256 blockHeightDiff ) external payable nonReentrant streamExists(streamId) returns (bool) { Stream storage stream = streams[streamId]; require( msg.sender == stream.sender, "caller must be the sender of the stream" ); require(amount > effectiveValues[streamId], "amount not effective"); if (stream.token == AddressHelper.ethAddress()) { require(amount == msg.value, "bad ether fund"); } else { stream.token.safeTransferFrom(msg.sender, address(this), amount); } (uint256 withdrawable, uint256 remaining) = balanceOf(streamId); //uint256 blockHeightDiff = block.number.sub(stream.lastRewardBlock); // If underflow m might be 0, peg true kBlock to 1, if bHD 0 then error. // Minimum amount is 100 uint256 m = amount.mul(ONE).div(blockHeightDiff); // peg true kBlock to 1 so n over k always greater or equal 1 uint256 noverk = blockHeightDiff.mul(ONE); // peg true mu to mu/kBlock uint256 mu = stream.unlockRatio.mul(ONE).div(1000).div(stream.kBlock); // Enlarged due to mu divided by kBlock uint256 onesubmu = ONE.sub(mu); // uint256 s = m.mul(ONE.sub(XNum.bpow(onesubmu,noverk))).div(ONE).div(mu).mul(ONE); uint256 s = m.mul(ONE.sub(XNum.bpow(onesubmu, noverk))).div(mu).div(ONE); // update remaining and withdrawable balance stream.lastRewardBlock = block.number; stream.remaining = remaining.add(s); // = remaining + s stream.withdrawable = withdrawable.add(amount).sub(s); // = withdrawable + (amount - s) // add funds to total deposit amount stream.depositAmount = stream.depositAmount.add(amount); emit StreamFunded(streamId, amount); return true; } /** * @notice Returns the available funds for the given stream id and address. * @dev Throws if the id does not point to a valid stream. * @param streamId The id of the stream for which to query the balance. * @return withdrawable The total funds allocated to `recipient` and `sender` as uint256. * @return remaining The total funds allocated to `recipient` and `sender` as uint256. */ function balanceOf(uint256 streamId) public view streamExists(streamId) returns (uint256 withdrawable, uint256 remaining) { Stream memory stream = streams[streamId]; if (block.number < stream.startBlock) { return (0, stream.depositAmount); } uint256 lastBalance = stream.withdrawable; uint256 n = block.number.sub(stream.lastRewardBlock).mul(ONE).div( stream.kBlock ); uint256 k = stream.unlockRatio.mul(ONE).div(1000); uint256 mu = ONE.sub(k); uint256 r = stream.remaining.mul(XNum.bpow(mu, n)).div(ONE); uint256 w = stream.remaining.sub(r); // withdrawable, if n is float this process will be smooth and slightly if (lastBalance > 0) { w = w.add(lastBalance); } //If `remaining` + `withdrawable` < `depositAmount`, it means there have withdraws. require( r.add(w) <= stream.depositAmount, "balanceOf: remaining or withdrawable amount is bad" ); if (w >= effectiveValues[streamId]) { withdrawable = w; } else { withdrawable = 0; } if (r >= effectiveValues[streamId]) { remaining = r; } else { remaining = 0; } } /** * @notice Withdraws from the contract to the recipient's account. * @dev Throws if the id does not point to a valid stream. * Throws if the amount exceeds the withdrawable balance. * Throws if the amount < the effective withdraw value. * Throws if the caller is not the recipient. * @param streamId The id of the stream to withdraw tokens from. * @param amount The amount of tokens to withdraw. * @return bool true=success, otherwise false. */ function withdrawFromStream(uint256 streamId, uint256 amount) external nonReentrant streamExists(streamId) returns (bool) { Stream storage stream = streams[streamId]; require( msg.sender == stream.recipient, "caller must be the recipient of the stream" ); require( amount >= effectiveValues[streamId], "amount is zero or not effective" ); (uint256 withdrawable, uint256 remaining) = balanceOf(streamId); require( withdrawable >= amount, "withdraw amount exceeds the available balance" ); if (stream.token == AddressHelper.ethAddress()) { stream.recipient.safeTransferEther(amount); } else { stream.token.safeTransfer(stream.recipient, amount); } stream.lastRewardBlock = block.number; stream.remaining = remaining; stream.withdrawable = withdrawable.sub(amount); emit WithdrawFromStream(streamId, stream.recipient, amount); return true; } /** * @notice Cancels the stream and transfers the tokens back * @dev Throws if the id does not point to a valid stream. * Throws if the caller is not the sender or the recipient of the stream. * Throws if there is a token transfer failure. * @param streamId The id of the stream to cancel. * @return bool true=success, otherwise false. */ function cancelStream(uint256 streamId) external nonReentrant streamExists(streamId) returns (bool) { Stream memory stream = streams[streamId]; require(stream.cancelable, "non cancelable stream"); require( msg.sender == streams[streamId].sender || msg.sender == streams[streamId].recipient, "caller must be the sender or the recipient" ); (uint256 withdrawable, uint256 remaining) = balanceOf(streamId); //save gas delete streams[streamId]; delete effectiveValues[streamId]; if (withdrawable > 0) { if (stream.token == AddressHelper.ethAddress()) { stream.recipient.safeTransferEther(withdrawable); } else { stream.token.safeTransfer(stream.recipient, withdrawable); } } if (remaining > 0) { if (stream.token == AddressHelper.ethAddress()) { stream.sender.safeTransferEther(remaining); } else { stream.token.safeTransfer(stream.sender, remaining); } } emit StreamCanceled( streamId, stream.sender, stream.recipient, remaining, withdrawable ); return true; } function getVersion() external pure returns (bytes32) { return bytes32("APOLLO"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"streamId","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"senderBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"recipientBalance","type":"uint256"}],"name":"StreamCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"streamId","type":"uint256"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"kBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockRatio","type":"uint256"},{"indexed":false,"internalType":"bool","name":"cancelable","type":"bool"}],"name":"StreamCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"streamId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StreamFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"streamId","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawFromStream","type":"event"},{"constant":true,"inputs":[{"internalType":"uint256","name":"streamId","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"withdrawable","type":"uint256"},{"internalType":"uint256","name":"remaining","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"streamId","type":"uint256"}],"name":"cancelStream","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"kBlock","type":"uint256"},{"internalType":"uint256","name":"unlockRatio","type":"uint256"},{"internalType":"bool","name":"cancelable","type":"bool"}],"name":"createEtherStream","outputs":[{"internalType":"uint256","name":"streamId","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"kBlock","type":"uint256"},{"internalType":"uint256","name":"unlockRatio","type":"uint256"},{"internalType":"bool","name":"cancelable","type":"bool"}],"name":"createStream","outputs":[{"internalType":"uint256","name":"streamId","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"effectiveValues","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"streamId","type":"uint256"}],"name":"getStream","outputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"kBlock","type":"uint256"},{"internalType":"uint256","name":"remaining","type":"uint256"},{"internalType":"uint256","name":"withdrawable","type":"uint256"},{"internalType":"uint256","name":"unlockRatio","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"bool","name":"cancelable","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getVersion","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"streamId","type":"uint256"}],"name":"hasStream","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"streamId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"blockHeightDiff","type":"uint256"}],"name":"lazyFundStream","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"nextStreamId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"streamId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"singleFundStream","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"streams","outputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"remaining","type":"uint256"},{"internalType":"uint256","name":"withdrawable","type":"uint256"},{"internalType":"uint256","name":"startBlock","type":"uint256"},{"internalType":"uint256","name":"kBlock","type":"uint256"},{"internalType":"uint256","name":"unlockRatio","type":"uint256"},{"internalType":"uint256","name":"denom","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bool","name":"cancelable","type":"bool"},{"internalType":"bool","name":"isEntity","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"streamId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawFromStream","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260018080556000805460ff19169091179055612f56806100256000396000f3fe6080604052600436106100c25760003560e01c80636ce92e211161007f578063894e9a0d11610059578063894e9a0d146102ed5780639cc7f7081461037c578063b5a3629d146103bf578063c791713a146103e2576100c2565b80636ce92e211461026a5780636db9241b146102935780637a9b2c6c146102bd576100c2565b80630d8e6e2c146100c75780631290fab4146100ee5780631e99d5691461014b5780633b749f6b1461016057806352fa95ec1461019e57806364d60d91146101c8575b600080fd5b3480156100d357600080fd5b506100dc610422565b60408051918252519081900360200190f35b3480156100fa57600080fd5b506100dc600480360360e081101561011157600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c00135151561042f565b34801561015757600080fd5b506100dc610aa8565b34801561016c57600080fd5b5061018a6004803603602081101561018357600080fd5b5035610aae565b604080519115158252519081900360200190f35b3480156101aa57600080fd5b506100dc600480360360208110156101c157600080fd5b5035610ad0565b3480156101d457600080fd5b506101f2600480360360208110156101eb57600080fd5b5035610ae2565b604080519d8e5260208e019c909c528c8c019a909a5260608c019890985260808b019690965260a08a019490945260c089019290925260e08801526001600160a01b03908116610100880152908116610120870152166101408501521515610160840152151561018083015251908190036101a00190f35b61018a6004803603606081101561028057600080fd5b5080359060208101359060400135610b61565b34801561029f57600080fd5b5061018a600480360360208110156102b657600080fd5b5035610ee9565b3480156102c957600080fd5b5061018a600480360360408110156102e057600080fd5b5080359060200135611322565b3480156102f957600080fd5b506103176004803603602081101561031057600080fd5b50356115d0565b604080516001600160a01b039c8d1681529a8c1660208c015298909a16898901526060890196909652608088019490945260a087019290925260c086015260e08501526101008401526101208301529115156101408201529051908190036101600190f35b34801561038857600080fd5b506103a66004803603602081101561039f57600080fd5b50356117ed565b6040805192835260208301919091528051918290030190f35b61018a600480360360408110156103d557600080fd5b5080359060200135611ac1565b6100dc600480360360a08110156103f857600080fd5b506001600160a01b0381351690602081013590604081013590606081013590608001351515611d4a565b6541504f4c4c4f60d01b90565b6000868686866001600160a01b038416610490576040805162461bcd60e51b815260206004820152601a60248201527f73747265616d20746f20746865207a65726f2061646472657373000000000000604482015290519081900360640190fd5b6001600160a01b0384163014156104ee576040805162461bcd60e51b815260206004820152601d60248201527f73747265616d20746f2074686520636f6e747261637420697473656c66000000604482015290519081900360640190fd5b6001600160a01b038416331415610543576040805162461bcd60e51b815260206004820152601460248201527339ba3932b0b6903a37903a34329031b0b63632b960611b604482015290519081900360640190fd5b60008311610591576040805162461bcd60e51b81526020600482015260166024820152756465706f73697420616d6f756e74206973207a65726f60501b604482015290519081900360640190fd5b438210156105e6576040805162461bcd60e51b815260206004820152601f60248201527f737461727420626c6f636b206265666f726520626c6f636b2e6e756d62657200604482015290519081900360640190fd5b6000811161062d576040805162461bcd60e51b815260206004820152600f60248201526e6b20626c6f636b206973207a65726f60881b604482015290519081900360640190fd5b6103e8871061067d576040805162461bcd60e51b81526020600482015260176024820152760756e6c6f636b526174696f206d757374203c203130303604c1b604482015290519081900360640190fd5b600087116106c9576040805162461bcd60e51b81526020600482015260146024820152730756e6c6f636b526174696f206d757374203e20360641b604482015290519081900360640190fd5b6106db8c6001600160a01b031661222c565b61071b576040805162461bcd60e51b815260206004820152600c60248201526b1b9bdd0818dbdb9d1c9858dd60a21b604482015290519081900360640190fd5b6107366001600160a01b038d1633308d63ffffffff61224b16565b600154945060008c6001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561077657600080fd5b505afa15801561078a573d6000803e3d6000fd5b505050506040513d60208110156107a057600080fd5b505160ff16600a0a9050620f4240811015610802576040805162461bcd60e51b815260206004820152601760248201527f746f6b656e20646563696d616c20746f6f20736d616c6c000000000000000000604482015290519081900360640190fd5b6108148161271063ffffffff6123b516565b60008781526002602052604090208190558b101561086d576040805162461bcd60e51b815260206004820152601160248201527019195c1bdcda5d081d1bdbc81cdb585b1b607a1b604482015290519081900360640190fd5b604051806101a001604052808c81526020018c8152602001600081526020018b81526020018a81526020018981526020018281526020018b81526020018e6001600160a01b031681526020018d6001600160a01b03168152602001336001600160a01b0316815260200188151581526020016001151581525060036000888152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101208201518160090160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061014082015181600a0160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061016082015181600a0160146101000a81548160ff02191690831515021790555061018082015181600a0160156101000a81548160ff02191690831515021790555090505050610a2e6001805461240090919063ffffffff16565b600155604080516001600160a01b038e81168252602082018d90528183018c9052606082018b9052608082018a905288151560a08301529151918d1691339188917f296dd961afc929c5e58943ef2ed406ae3188daf473f26b44f2ee263d7e0ee4e09181900360c00190a450505050979650505050505050565b60015481565b6000818152600360205260409020600a0154600160a81b900460ff165b919050565b60026020526000908152604090205481565b600360208190526000918252604090912080546001820154600283015493830154600484015460058501546006860154600787015460088801546009890154600a90990154979996989697959694959394929391926001600160a01b03918216929082169181169060ff600160a01b8204811691600160a81b9004168d565b6000805460ff16610ba7576040805162461bcd60e51b815260206004820152601f6024820152600080516020612e07833981519152604482015290519081900360640190fd5b6000805460ff19168155848152600360205260409020600a01548490600160a81b900460ff16610c16576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b6000858152600360205260409020600a8101546001600160a01b03163314610c6f5760405162461bcd60e51b8152600401808060200182810382526027815260200180612efb6027913960400191505060405180910390fd5b6000868152600260205260409020548511610cc8576040805162461bcd60e51b8152602060048201526014602482015273616d6f756e74206e6f742065666665637469766560601b604482015290519081900360640190fd5b610cd061245a565b60088201546001600160a01b0390811691161415610d3257348514610d2d576040805162461bcd60e51b815260206004820152600e60248201526d18985908195d1a195c88199d5b9960921b604482015290519081900360640190fd5b610d52565b6008810154610d52906001600160a01b031633308863ffffffff61224b16565b600080610d5e886117ed565b90925090506000610d8d87610d818a670de0b6b3a764000063ffffffff61247216565b9063ffffffff6123b516565b90506000610da988670de0b6b3a764000063ffffffff61247216565b90506000610dda8660040154610d816103e8610d81670de0b6b3a76400008b6005015461247290919063ffffffff16565b90506000610df6670de0b6b3a76400008363ffffffff6124cb16565b90506000610e3c670de0b6b3a7640000610d8185610d81610e2f610e1a888b61250d565b670de0b6b3a76400009063ffffffff6124cb16565b8a9063ffffffff61247216565b4360078a01559050610e54868263ffffffff61240016565b6001890155610e7981610e6d898f63ffffffff61240016565b9063ffffffff6124cb16565b60028901558754610e90908d63ffffffff61240016565b8855604080518d815290518e917f700a4c5207a5280e621eed38effdd99714a7631fd21eea8da0c30b0f0f76fb05919081900360200190a2600199505050505050505050506000805460ff191660011790559392505050565b6000805460ff16610f2f576040805162461bcd60e51b815260206004820152601f6024820152600080516020612e07833981519152604482015290519081900360640190fd5b6000805460ff19168155828152600360205260409020600a01548290600160a81b900460ff16610f9e576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b610fa6612d7f565b5060008381526003602081815260409283902083516101a0810185528154815260018201549281019290925260028101549382019390935290820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546001600160a01b0390811661010083015260098301548116610120830152600a9092015491821661014082015260ff600160a01b8304811615156101608301819052600160a81b909304161515610180820152906110b1576040805162461bcd60e51b81526020600482015260156024820152746e6f6e2063616e63656c61626c652073747265616d60581b604482015290519081900360640190fd5b6000848152600360205260409020600a01546001600160a01b03163314806110f257506000848152600360205260409020600901546001600160a01b031633145b61112d5760405162461bcd60e51b815260040180806020018281038252602a815260200180612e86602a913960400191505060405180910390fd5b600080611139866117ed565b6000888152600360208181526040808420848155600181018590556002808201869055938101859055600481018590556005810185905560068101859055600781018590556008810180546001600160a01b03199081169091556009820180549091169055600a0180546001600160b01b031916905591905281205590925090508115611232576111c861245a565b6001600160a01b03168361010001516001600160a01b0316141561120a57610120830151611205906001600160a01b03168363ffffffff61261b16565b611232565b611232836101200151838561010001516001600160a01b031661271f9092919063ffffffff16565b80156112aa5761124061245a565b6001600160a01b03168361010001516001600160a01b031614156112825761014083015161127d906001600160a01b03168263ffffffff61261b16565b6112aa565b6112aa836101400151828561010001516001600160a01b031661271f9092919063ffffffff16565b8261012001516001600160a01b03168361014001516001600160a01b0316877f15b38b64ef7ba7c991c4ed5d695a684c71bbfefe84978c647f3ba3e7c77f89188486604051808381526020018281526020019250505060405180910390a460019450505050506000805460ff19166001179055919050565b6000805460ff16611368576040805162461bcd60e51b815260206004820152601f6024820152600080516020612e07833981519152604482015290519081900360640190fd5b6000805460ff19168155838152600360205260409020600a01548390600160a81b900460ff166113d7576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b600084815260036020526040902060098101546001600160a01b031633146114305760405162461bcd60e51b815260040180806020018281038252602a815260200180612eb0602a913960400191505060405180910390fd5b600085815260026020526040902054841015611493576040805162461bcd60e51b815260206004820152601f60248201527f616d6f756e74206973207a65726f206f72206e6f742065666665637469766500604482015290519081900360640190fd5b60008061149f876117ed565b91509150858210156114e25760405162461bcd60e51b815260040180806020018281038252602d815260200180612e59602d913960400191505060405180910390fd5b6114ea61245a565b60088401546001600160a01b0390811691161415611525576009830154611520906001600160a01b03168763ffffffff61261b16565b61154c565b6009830154600884015461154c916001600160a01b0391821691168863ffffffff61271f16565b43600784015560018301819055611569828763ffffffff6124cb16565b600284015560098301546040805188815290516001600160a01b039092169189917f36c3ab437e6a424ed25dc4bfdeb62706aa06558660fab2dab229d2555adaf89c919081900360200190a360019450505050506000805460ff1916600117905592915050565b60008060008060008060008060008060008b60036000828152602001908152602001600020600a0160159054906101000a900460ff1661164f576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b611657612d7f565b600360008f8152602001908152602001600020604051806101a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016009820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600a820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600a820160149054906101000a900460ff16151515158152602001600a820160159054906101000a900460ff16151515158152505090508061014001519c508061012001519b508061010001519a5080600001519950806060015198508060800151975080602001519650806040015195508060a0015194508060e0015193508061016001519250505091939597999b90929496989a50565b6000818152600360205260408120600a015481908390600160a81b900460ff16611856576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b61185e612d7f565b5060008481526003602081815260409283902083516101a08101855281548152600182015492810192909252600281015493820193909352908201546060820181905260048301546080830152600583015460a0830152600683015460c0830152600783015460e083015260088301546001600160a01b0390811661010084015260098401548116610120840152600a9093015492831661014083015260ff600160a01b840481161515610160840152600160a81b9093049092161515610180820152904310156119355751600093509150611abb565b60008160400151905060006119778360800151610d81670de0b6b3a764000061196b8760e00151436124cb90919063ffffffff16565b9063ffffffff61247216565b905060006119a06103e8610d81670de0b6b3a76400008760a0015161247290919063ffffffff16565b905060006119bc670de0b6b3a76400008363ffffffff6124cb16565b905060006119ea670de0b6b3a7640000610d816119d9858861250d565b60208a01519063ffffffff61247216565b90506000611a058288602001516124cb90919063ffffffff16565b90508515611a2057611a1d818763ffffffff61240016565b90505b8651611a32838363ffffffff61240016565b1115611a6f5760405162461bcd60e51b8152600401808060200182810382526032815260200180612e276032913960400191505060405180910390fd5b60008b8152600260205260409020548110611a8c57809950611a91565b600099505b60008b8152600260205260409020548210611aae57819850611ab3565b600098505b505050505050505b50915091565b6000805460ff16611b07576040805162461bcd60e51b815260206004820152601f6024820152600080516020612e07833981519152604482015290519081900360640190fd5b6000805460ff19168155838152600360205260409020600a01548390600160a81b900460ff16611b76576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b6000848152600360205260409020600a8101546001600160a01b03163314611bcf5760405162461bcd60e51b8152600401808060200182810382526027815260200180612efb6027913960400191505060405180910390fd5b6000858152600260205260409020548411611c28576040805162461bcd60e51b8152602060048201526014602482015273616d6f756e74206e6f742065666665637469766560601b604482015290519081900360640190fd5b611c3061245a565b60088201546001600160a01b0390811691161415611c9257348414611c8d576040805162461bcd60e51b815260206004820152600e60248201526d18985908195d1a195c88199d5b9960921b604482015290519081900360640190fd5b611cb2565b6008810154611cb2906001600160a01b031633308763ffffffff61224b16565b600080611cbe876117ed565b4360078601559092509050611cd9818763ffffffff61240016565b6001840155600283018290558254611cf7908763ffffffff61240016565b835560408051878152905188917f700a4c5207a5280e621eed38effdd99714a7631fd21eea8da0c30b0f0f76fb05919081900360200190a260019450505050506000805460ff1916600117905592915050565b6000853486866001600160a01b038416611dab576040805162461bcd60e51b815260206004820152601a60248201527f73747265616d20746f20746865207a65726f2061646472657373000000000000604482015290519081900360640190fd5b6001600160a01b038416301415611e09576040805162461bcd60e51b815260206004820152601d60248201527f73747265616d20746f2074686520636f6e747261637420697473656c66000000604482015290519081900360640190fd5b6001600160a01b038416331415611e5e576040805162461bcd60e51b815260206004820152601460248201527339ba3932b0b6903a37903a34329031b0b63632b960611b604482015290519081900360640190fd5b60008311611eac576040805162461bcd60e51b81526020600482015260166024820152756465706f73697420616d6f756e74206973207a65726f60501b604482015290519081900360640190fd5b43821015611f01576040805162461bcd60e51b815260206004820152601f60248201527f737461727420626c6f636b206265666f726520626c6f636b2e6e756d62657200604482015290519081900360640190fd5b60008111611f48576040805162461bcd60e51b815260206004820152600f60248201526e6b20626c6f636b206973207a65726f60881b604482015290519081900360640190fd5b6103e88710611f98576040805162461bcd60e51b81526020600482015260176024820152760756e6c6f636b526174696f206d757374203c203130303604c1b604482015290519081900360640190fd5b60008711611fe4576040805162461bcd60e51b81526020600482015260146024820152730756e6c6f636b526174696f206d757374203e20360641b604482015290519081900360640190fd5b655af3107a4000341015612033576040805162461bcd60e51b815260206004820152601160248201527019195c1bdcda5d081d1bdbc81cdb585b1b607a1b604482015290519081900360640190fd5b6001549450604051806101a00160405280348152602001348152602001600081526020018a8152602001898152602001888152602001670de0b6b3a764000081526020018a815260200161208561245a565b6001600160a01b0390811682528c8116602080840191909152336040808501919091528a15156060808601919091526001608095860181905260008c8152600380865290849020885181559488015185830155928701516002850155908601519183019190915592840151600482015560a0840151600582015560c0840151600682015560e084015160078201556101008401516008820180549184166001600160a01b0319928316179055610120850151600983018054918516918316919091179055610140850151600a9092018054610160870151610180909701511515600160a81b0260ff60a81b19971515600160a01b0260ff60a01b199590961691909316179290921692909217939093161790915580546121aa9163ffffffff61240016565b6001556001600160a01b038a1633867f296dd961afc929c5e58943ef2ed406ae3188daf473f26b44f2ee263d7e0ee4e06121e261245a565b604080516001600160a01b0390921682523460208301528181018f9052606082018e9052608082018d90528b151560a0830152519081900360c00190a45050505095945050505050565b60006001600160a01b03821661224457506000610acb565b503b151590565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106122d05780518252601f1990920191602091820191016122b1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612332576040519150601f19603f3d011682016040523d82523d6000602084013e612337565b606091505b5091509150818015612365575080511580612365575080806020019051602081101561236257600080fd5b50515b6123ad576040805162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b604482015290519081900360640190fd5b505050505050565b60006123f783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061287b565b90505b92915050565b6000828201838110156123f7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b600082612481575060006123fa565b8282028284828161248e57fe5b04146123f75760405162461bcd60e51b8152600401808060200182810382526021815260200180612eda6021913960400191505060405180910390fd5b60006123f783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061291d565b6000600183101561255d576040805162461bcd60e51b81526020600482015260156024820152744552525f42504f575f424153455f544f4f5f4c4f5760581b604482015290519081900360640190fd5b671bc16d674ec7ffff8311156125b3576040805162461bcd60e51b815260206004820152601660248201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b604482015290519081900360640190fd5b60006125be83612977565b905060006125cc8483612992565b905060006125e2866125dd856129f4565b612a02565b9050816125f35792506123fa915050565b600061260487846305f5e100612a59565b90506126108282612b3c565b979650505050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106126675780518252601f199092019160209182019101612648565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146126c9576040519150601f19603f3d011682016040523d82523d6000602084013e6126ce565b606091505b505090508061271a576040805162461bcd60e51b815260206004820152601360248201527211551217d514905394d1915497d19052531151606a1b604482015290519081900360640190fd5b505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061279c5780518252601f19909201916020918201910161277d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146127fe576040519150601f19603f3d011682016040523d82523d6000602084013e612803565b606091505b5091509150818015612831575080511580612831575080806020019051602081101561282e57600080fd5b50515b612874576040805162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b604482015290519081900360640190fd5b5050505050565b600081836129075760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156128cc5781810151838201526020016128b4565b50505050905090810190601f1680156128f95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161291357fe5b0495945050505050565b6000818484111561296f5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156128cc5781810151838201526020016128b4565b505050900390565b6000670de0b6b3a764000061298b836129f4565b0292915050565b60008060006129a18585612c05565b9150915080156129ec576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b670de0b6b3a7640000900490565b60008060028306612a1b57670de0b6b3a7640000612a1d565b835b90506002830492505b82156123f757612a368485612b3c565b93506002830615612a4e57612a4b8185612b3c565b90505b600283049250612a26565b6000828180612a7087670de0b6b3a7640000612c05565b9092509050670de0b6b3a764000080600060015b888410612b2d576000670de0b6b3a764000082029050600080612ab88a612ab385670de0b6b3a7640000612992565b612c05565b91509150612acf87612aca848c612b3c565b612b3c565b9650612adb8784612c2a565b965086612aea57505050612b2d565b8715612af4579315935b8015612afe579315935b8415612b1557612b0e8688612992565b9550612b22565b612b1f8688612d32565b95505b505050600101612a84565b50909998505050505050505050565b6000828202831580612b56575082848281612b5357fe5b04145b612b9a576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015612bed576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b600080828410612c1b5750508082036000612c23565b505081810360015b9250929050565b600081612c6d576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a76400008302831580612c955750670de0b6b3a7640000848281612c9257fe5b04145b612cd9576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b60028304810181811015612d27576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6000848281612bfa57fe5b6000828201838110156123f7576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b604051806101a00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600015158152602001600015158152509056fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c0062616c616e63654f663a2072656d61696e696e67206f7220776974686472617761626c6520616d6f756e7420697320626164776974686472617720616d6f756e7420657863656564732074686520617661696c61626c652062616c616e636563616c6c6572206d757374206265207468652073656e646572206f722074686520726563697069656e7463616c6c6572206d7573742062652074686520726563697069656e74206f66207468652073747265616d536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7763616c6c6572206d757374206265207468652073656e646572206f66207468652073747265616da265627a7a723158205e87d3ee6db25103178fda07cfdb9332ee39f260f532b3b317b3622d96ff510064736f6c63430005110032
Deployed Bytecode
0x6080604052600436106100c25760003560e01c80636ce92e211161007f578063894e9a0d11610059578063894e9a0d146102ed5780639cc7f7081461037c578063b5a3629d146103bf578063c791713a146103e2576100c2565b80636ce92e211461026a5780636db9241b146102935780637a9b2c6c146102bd576100c2565b80630d8e6e2c146100c75780631290fab4146100ee5780631e99d5691461014b5780633b749f6b1461016057806352fa95ec1461019e57806364d60d91146101c8575b600080fd5b3480156100d357600080fd5b506100dc610422565b60408051918252519081900360200190f35b3480156100fa57600080fd5b506100dc600480360360e081101561011157600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c00135151561042f565b34801561015757600080fd5b506100dc610aa8565b34801561016c57600080fd5b5061018a6004803603602081101561018357600080fd5b5035610aae565b604080519115158252519081900360200190f35b3480156101aa57600080fd5b506100dc600480360360208110156101c157600080fd5b5035610ad0565b3480156101d457600080fd5b506101f2600480360360208110156101eb57600080fd5b5035610ae2565b604080519d8e5260208e019c909c528c8c019a909a5260608c019890985260808b019690965260a08a019490945260c089019290925260e08801526001600160a01b03908116610100880152908116610120870152166101408501521515610160840152151561018083015251908190036101a00190f35b61018a6004803603606081101561028057600080fd5b5080359060208101359060400135610b61565b34801561029f57600080fd5b5061018a600480360360208110156102b657600080fd5b5035610ee9565b3480156102c957600080fd5b5061018a600480360360408110156102e057600080fd5b5080359060200135611322565b3480156102f957600080fd5b506103176004803603602081101561031057600080fd5b50356115d0565b604080516001600160a01b039c8d1681529a8c1660208c015298909a16898901526060890196909652608088019490945260a087019290925260c086015260e08501526101008401526101208301529115156101408201529051908190036101600190f35b34801561038857600080fd5b506103a66004803603602081101561039f57600080fd5b50356117ed565b6040805192835260208301919091528051918290030190f35b61018a600480360360408110156103d557600080fd5b5080359060200135611ac1565b6100dc600480360360a08110156103f857600080fd5b506001600160a01b0381351690602081013590604081013590606081013590608001351515611d4a565b6541504f4c4c4f60d01b90565b6000868686866001600160a01b038416610490576040805162461bcd60e51b815260206004820152601a60248201527f73747265616d20746f20746865207a65726f2061646472657373000000000000604482015290519081900360640190fd5b6001600160a01b0384163014156104ee576040805162461bcd60e51b815260206004820152601d60248201527f73747265616d20746f2074686520636f6e747261637420697473656c66000000604482015290519081900360640190fd5b6001600160a01b038416331415610543576040805162461bcd60e51b815260206004820152601460248201527339ba3932b0b6903a37903a34329031b0b63632b960611b604482015290519081900360640190fd5b60008311610591576040805162461bcd60e51b81526020600482015260166024820152756465706f73697420616d6f756e74206973207a65726f60501b604482015290519081900360640190fd5b438210156105e6576040805162461bcd60e51b815260206004820152601f60248201527f737461727420626c6f636b206265666f726520626c6f636b2e6e756d62657200604482015290519081900360640190fd5b6000811161062d576040805162461bcd60e51b815260206004820152600f60248201526e6b20626c6f636b206973207a65726f60881b604482015290519081900360640190fd5b6103e8871061067d576040805162461bcd60e51b81526020600482015260176024820152760756e6c6f636b526174696f206d757374203c203130303604c1b604482015290519081900360640190fd5b600087116106c9576040805162461bcd60e51b81526020600482015260146024820152730756e6c6f636b526174696f206d757374203e20360641b604482015290519081900360640190fd5b6106db8c6001600160a01b031661222c565b61071b576040805162461bcd60e51b815260206004820152600c60248201526b1b9bdd0818dbdb9d1c9858dd60a21b604482015290519081900360640190fd5b6107366001600160a01b038d1633308d63ffffffff61224b16565b600154945060008c6001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561077657600080fd5b505afa15801561078a573d6000803e3d6000fd5b505050506040513d60208110156107a057600080fd5b505160ff16600a0a9050620f4240811015610802576040805162461bcd60e51b815260206004820152601760248201527f746f6b656e20646563696d616c20746f6f20736d616c6c000000000000000000604482015290519081900360640190fd5b6108148161271063ffffffff6123b516565b60008781526002602052604090208190558b101561086d576040805162461bcd60e51b815260206004820152601160248201527019195c1bdcda5d081d1bdbc81cdb585b1b607a1b604482015290519081900360640190fd5b604051806101a001604052808c81526020018c8152602001600081526020018b81526020018a81526020018981526020018281526020018b81526020018e6001600160a01b031681526020018d6001600160a01b03168152602001336001600160a01b0316815260200188151581526020016001151581525060036000888152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506101208201518160090160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061014082015181600a0160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555061016082015181600a0160146101000a81548160ff02191690831515021790555061018082015181600a0160156101000a81548160ff02191690831515021790555090505050610a2e6001805461240090919063ffffffff16565b600155604080516001600160a01b038e81168252602082018d90528183018c9052606082018b9052608082018a905288151560a08301529151918d1691339188917f296dd961afc929c5e58943ef2ed406ae3188daf473f26b44f2ee263d7e0ee4e09181900360c00190a450505050979650505050505050565b60015481565b6000818152600360205260409020600a0154600160a81b900460ff165b919050565b60026020526000908152604090205481565b600360208190526000918252604090912080546001820154600283015493830154600484015460058501546006860154600787015460088801546009890154600a90990154979996989697959694959394929391926001600160a01b03918216929082169181169060ff600160a01b8204811691600160a81b9004168d565b6000805460ff16610ba7576040805162461bcd60e51b815260206004820152601f6024820152600080516020612e07833981519152604482015290519081900360640190fd5b6000805460ff19168155848152600360205260409020600a01548490600160a81b900460ff16610c16576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b6000858152600360205260409020600a8101546001600160a01b03163314610c6f5760405162461bcd60e51b8152600401808060200182810382526027815260200180612efb6027913960400191505060405180910390fd5b6000868152600260205260409020548511610cc8576040805162461bcd60e51b8152602060048201526014602482015273616d6f756e74206e6f742065666665637469766560601b604482015290519081900360640190fd5b610cd061245a565b60088201546001600160a01b0390811691161415610d3257348514610d2d576040805162461bcd60e51b815260206004820152600e60248201526d18985908195d1a195c88199d5b9960921b604482015290519081900360640190fd5b610d52565b6008810154610d52906001600160a01b031633308863ffffffff61224b16565b600080610d5e886117ed565b90925090506000610d8d87610d818a670de0b6b3a764000063ffffffff61247216565b9063ffffffff6123b516565b90506000610da988670de0b6b3a764000063ffffffff61247216565b90506000610dda8660040154610d816103e8610d81670de0b6b3a76400008b6005015461247290919063ffffffff16565b90506000610df6670de0b6b3a76400008363ffffffff6124cb16565b90506000610e3c670de0b6b3a7640000610d8185610d81610e2f610e1a888b61250d565b670de0b6b3a76400009063ffffffff6124cb16565b8a9063ffffffff61247216565b4360078a01559050610e54868263ffffffff61240016565b6001890155610e7981610e6d898f63ffffffff61240016565b9063ffffffff6124cb16565b60028901558754610e90908d63ffffffff61240016565b8855604080518d815290518e917f700a4c5207a5280e621eed38effdd99714a7631fd21eea8da0c30b0f0f76fb05919081900360200190a2600199505050505050505050506000805460ff191660011790559392505050565b6000805460ff16610f2f576040805162461bcd60e51b815260206004820152601f6024820152600080516020612e07833981519152604482015290519081900360640190fd5b6000805460ff19168155828152600360205260409020600a01548290600160a81b900460ff16610f9e576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b610fa6612d7f565b5060008381526003602081815260409283902083516101a0810185528154815260018201549281019290925260028101549382019390935290820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260088201546001600160a01b0390811661010083015260098301548116610120830152600a9092015491821661014082015260ff600160a01b8304811615156101608301819052600160a81b909304161515610180820152906110b1576040805162461bcd60e51b81526020600482015260156024820152746e6f6e2063616e63656c61626c652073747265616d60581b604482015290519081900360640190fd5b6000848152600360205260409020600a01546001600160a01b03163314806110f257506000848152600360205260409020600901546001600160a01b031633145b61112d5760405162461bcd60e51b815260040180806020018281038252602a815260200180612e86602a913960400191505060405180910390fd5b600080611139866117ed565b6000888152600360208181526040808420848155600181018590556002808201869055938101859055600481018590556005810185905560068101859055600781018590556008810180546001600160a01b03199081169091556009820180549091169055600a0180546001600160b01b031916905591905281205590925090508115611232576111c861245a565b6001600160a01b03168361010001516001600160a01b0316141561120a57610120830151611205906001600160a01b03168363ffffffff61261b16565b611232565b611232836101200151838561010001516001600160a01b031661271f9092919063ffffffff16565b80156112aa5761124061245a565b6001600160a01b03168361010001516001600160a01b031614156112825761014083015161127d906001600160a01b03168263ffffffff61261b16565b6112aa565b6112aa836101400151828561010001516001600160a01b031661271f9092919063ffffffff16565b8261012001516001600160a01b03168361014001516001600160a01b0316877f15b38b64ef7ba7c991c4ed5d695a684c71bbfefe84978c647f3ba3e7c77f89188486604051808381526020018281526020019250505060405180910390a460019450505050506000805460ff19166001179055919050565b6000805460ff16611368576040805162461bcd60e51b815260206004820152601f6024820152600080516020612e07833981519152604482015290519081900360640190fd5b6000805460ff19168155838152600360205260409020600a01548390600160a81b900460ff166113d7576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b600084815260036020526040902060098101546001600160a01b031633146114305760405162461bcd60e51b815260040180806020018281038252602a815260200180612eb0602a913960400191505060405180910390fd5b600085815260026020526040902054841015611493576040805162461bcd60e51b815260206004820152601f60248201527f616d6f756e74206973207a65726f206f72206e6f742065666665637469766500604482015290519081900360640190fd5b60008061149f876117ed565b91509150858210156114e25760405162461bcd60e51b815260040180806020018281038252602d815260200180612e59602d913960400191505060405180910390fd5b6114ea61245a565b60088401546001600160a01b0390811691161415611525576009830154611520906001600160a01b03168763ffffffff61261b16565b61154c565b6009830154600884015461154c916001600160a01b0391821691168863ffffffff61271f16565b43600784015560018301819055611569828763ffffffff6124cb16565b600284015560098301546040805188815290516001600160a01b039092169189917f36c3ab437e6a424ed25dc4bfdeb62706aa06558660fab2dab229d2555adaf89c919081900360200190a360019450505050506000805460ff1916600117905592915050565b60008060008060008060008060008060008b60036000828152602001908152602001600020600a0160159054906101000a900460ff1661164f576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b611657612d7f565b600360008f8152602001908152602001600020604051806101a001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016009820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600a820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600a820160149054906101000a900460ff16151515158152602001600a820160159054906101000a900460ff16151515158152505090508061014001519c508061012001519b508061010001519a5080600001519950806060015198508060800151975080602001519650806040015195508060a0015194508060e0015193508061016001519250505091939597999b90929496989a50565b6000818152600360205260408120600a015481908390600160a81b900460ff16611856576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b61185e612d7f565b5060008481526003602081815260409283902083516101a08101855281548152600182015492810192909252600281015493820193909352908201546060820181905260048301546080830152600583015460a0830152600683015460c0830152600783015460e083015260088301546001600160a01b0390811661010084015260098401548116610120840152600a9093015492831661014083015260ff600160a01b840481161515610160840152600160a81b9093049092161515610180820152904310156119355751600093509150611abb565b60008160400151905060006119778360800151610d81670de0b6b3a764000061196b8760e00151436124cb90919063ffffffff16565b9063ffffffff61247216565b905060006119a06103e8610d81670de0b6b3a76400008760a0015161247290919063ffffffff16565b905060006119bc670de0b6b3a76400008363ffffffff6124cb16565b905060006119ea670de0b6b3a7640000610d816119d9858861250d565b60208a01519063ffffffff61247216565b90506000611a058288602001516124cb90919063ffffffff16565b90508515611a2057611a1d818763ffffffff61240016565b90505b8651611a32838363ffffffff61240016565b1115611a6f5760405162461bcd60e51b8152600401808060200182810382526032815260200180612e276032913960400191505060405180910390fd5b60008b8152600260205260409020548110611a8c57809950611a91565b600099505b60008b8152600260205260409020548210611aae57819850611ab3565b600098505b505050505050505b50915091565b6000805460ff16611b07576040805162461bcd60e51b815260206004820152601f6024820152600080516020612e07833981519152604482015290519081900360640190fd5b6000805460ff19168155838152600360205260409020600a01548390600160a81b900460ff16611b76576040805162461bcd60e51b81526020600482015260156024820152741cdd1c99585b48191bd95cc81b9bdd08195e1a5cdd605a1b604482015290519081900360640190fd5b6000848152600360205260409020600a8101546001600160a01b03163314611bcf5760405162461bcd60e51b8152600401808060200182810382526027815260200180612efb6027913960400191505060405180910390fd5b6000858152600260205260409020548411611c28576040805162461bcd60e51b8152602060048201526014602482015273616d6f756e74206e6f742065666665637469766560601b604482015290519081900360640190fd5b611c3061245a565b60088201546001600160a01b0390811691161415611c9257348414611c8d576040805162461bcd60e51b815260206004820152600e60248201526d18985908195d1a195c88199d5b9960921b604482015290519081900360640190fd5b611cb2565b6008810154611cb2906001600160a01b031633308763ffffffff61224b16565b600080611cbe876117ed565b4360078601559092509050611cd9818763ffffffff61240016565b6001840155600283018290558254611cf7908763ffffffff61240016565b835560408051878152905188917f700a4c5207a5280e621eed38effdd99714a7631fd21eea8da0c30b0f0f76fb05919081900360200190a260019450505050506000805460ff1916600117905592915050565b6000853486866001600160a01b038416611dab576040805162461bcd60e51b815260206004820152601a60248201527f73747265616d20746f20746865207a65726f2061646472657373000000000000604482015290519081900360640190fd5b6001600160a01b038416301415611e09576040805162461bcd60e51b815260206004820152601d60248201527f73747265616d20746f2074686520636f6e747261637420697473656c66000000604482015290519081900360640190fd5b6001600160a01b038416331415611e5e576040805162461bcd60e51b815260206004820152601460248201527339ba3932b0b6903a37903a34329031b0b63632b960611b604482015290519081900360640190fd5b60008311611eac576040805162461bcd60e51b81526020600482015260166024820152756465706f73697420616d6f756e74206973207a65726f60501b604482015290519081900360640190fd5b43821015611f01576040805162461bcd60e51b815260206004820152601f60248201527f737461727420626c6f636b206265666f726520626c6f636b2e6e756d62657200604482015290519081900360640190fd5b60008111611f48576040805162461bcd60e51b815260206004820152600f60248201526e6b20626c6f636b206973207a65726f60881b604482015290519081900360640190fd5b6103e88710611f98576040805162461bcd60e51b81526020600482015260176024820152760756e6c6f636b526174696f206d757374203c203130303604c1b604482015290519081900360640190fd5b60008711611fe4576040805162461bcd60e51b81526020600482015260146024820152730756e6c6f636b526174696f206d757374203e20360641b604482015290519081900360640190fd5b655af3107a4000341015612033576040805162461bcd60e51b815260206004820152601160248201527019195c1bdcda5d081d1bdbc81cdb585b1b607a1b604482015290519081900360640190fd5b6001549450604051806101a00160405280348152602001348152602001600081526020018a8152602001898152602001888152602001670de0b6b3a764000081526020018a815260200161208561245a565b6001600160a01b0390811682528c8116602080840191909152336040808501919091528a15156060808601919091526001608095860181905260008c8152600380865290849020885181559488015185830155928701516002850155908601519183019190915592840151600482015560a0840151600582015560c0840151600682015560e084015160078201556101008401516008820180549184166001600160a01b0319928316179055610120850151600983018054918516918316919091179055610140850151600a9092018054610160870151610180909701511515600160a81b0260ff60a81b19971515600160a01b0260ff60a01b199590961691909316179290921692909217939093161790915580546121aa9163ffffffff61240016565b6001556001600160a01b038a1633867f296dd961afc929c5e58943ef2ed406ae3188daf473f26b44f2ee263d7e0ee4e06121e261245a565b604080516001600160a01b0390921682523460208301528181018f9052606082018e9052608082018d90528b151560a0830152519081900360c00190a45050505095945050505050565b60006001600160a01b03821661224457506000610acb565b503b151590565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106122d05780518252601f1990920191602091820191016122b1565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612332576040519150601f19603f3d011682016040523d82523d6000602084013e612337565b606091505b5091509150818015612365575080511580612365575080806020019051602081101561236257600080fd5b50515b6123ad576040805162461bcd60e51b81526020600482015260146024820152731514905394d1915497d19493d357d1905253115160621b604482015290519081900360640190fd5b505050505050565b60006123f783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061287b565b90505b92915050565b6000828201838110156123f7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b600082612481575060006123fa565b8282028284828161248e57fe5b04146123f75760405162461bcd60e51b8152600401808060200182810382526021815260200180612eda6021913960400191505060405180910390fd5b60006123f783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061291d565b6000600183101561255d576040805162461bcd60e51b81526020600482015260156024820152744552525f42504f575f424153455f544f4f5f4c4f5760581b604482015290519081900360640190fd5b671bc16d674ec7ffff8311156125b3576040805162461bcd60e51b815260206004820152601660248201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b604482015290519081900360640190fd5b60006125be83612977565b905060006125cc8483612992565b905060006125e2866125dd856129f4565b612a02565b9050816125f35792506123fa915050565b600061260487846305f5e100612a59565b90506126108282612b3c565b979650505050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106126675780518252601f199092019160209182019101612648565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146126c9576040519150601f19603f3d011682016040523d82523d6000602084013e6126ce565b606091505b505090508061271a576040805162461bcd60e51b815260206004820152601360248201527211551217d514905394d1915497d19052531151606a1b604482015290519081900360640190fd5b505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061279c5780518252601f19909201916020918201910161277d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146127fe576040519150601f19603f3d011682016040523d82523d6000602084013e612803565b606091505b5091509150818015612831575080511580612831575080806020019051602081101561282e57600080fd5b50515b612874576040805162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b604482015290519081900360640190fd5b5050505050565b600081836129075760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156128cc5781810151838201526020016128b4565b50505050905090810190601f1680156128f95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161291357fe5b0495945050505050565b6000818484111561296f5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156128cc5781810151838201526020016128b4565b505050900390565b6000670de0b6b3a764000061298b836129f4565b0292915050565b60008060006129a18585612c05565b9150915080156129ec576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b670de0b6b3a7640000900490565b60008060028306612a1b57670de0b6b3a7640000612a1d565b835b90506002830492505b82156123f757612a368485612b3c565b93506002830615612a4e57612a4b8185612b3c565b90505b600283049250612a26565b6000828180612a7087670de0b6b3a7640000612c05565b9092509050670de0b6b3a764000080600060015b888410612b2d576000670de0b6b3a764000082029050600080612ab88a612ab385670de0b6b3a7640000612992565b612c05565b91509150612acf87612aca848c612b3c565b612b3c565b9650612adb8784612c2a565b965086612aea57505050612b2d565b8715612af4579315935b8015612afe579315935b8415612b1557612b0e8688612992565b9550612b22565b612b1f8688612d32565b95505b505050600101612a84565b50909998505050505050505050565b6000828202831580612b56575082848281612b5357fe5b04145b612b9a576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015612bed576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a7640000825b049695505050505050565b600080828410612c1b5750508082036000612c23565b505081810360015b9250929050565b600081612c6d576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a76400008302831580612c955750670de0b6b3a7640000848281612c9257fe5b04145b612cd9576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b60028304810181811015612d27576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b6000848281612bfa57fe5b6000828201838110156123f7576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b604051806101a00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600015158152602001600015158152509056fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c0062616c616e63654f663a2072656d61696e696e67206f7220776974686472617761626c6520616d6f756e7420697320626164776974686472617720616d6f756e7420657863656564732074686520617661696c61626c652062616c616e636563616c6c6572206d757374206265207468652073656e646572206f722074686520726563697069656e7463616c6c6572206d7573742062652074686520726563697069656e74206f66207468652073747265616d536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7763616c6c6572206d757374206265207468652073656e646572206f66207468652073747265616da265627a7a723158205e87d3ee6db25103178fda07cfdb9332ee39f260f532b3b317b3622d96ff510064736f6c63430005110032
Deployed Bytecode Sourcemap
14769:19603:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34272:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34272:97:0;;;:::i;:::-;;;;;;;;;;;;;;;;19039:1902;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19039:1902:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;19039:1902:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14995:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14995:31:0;;;:::i;23433:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23433:118:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23433:118:0;;:::i;:::-;;;;;;;;;;;;;;;;;;15130:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15130:50:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15130:50:0;;:::i;16039:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16039:41:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16039:41:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16039:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26987:1978;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26987:1978:0;;;;;;;;;;;;:::i;32860:1404::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32860:1404:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32860:1404:0;;:::i;31317:1146::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31317:1146:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31317:1146:0;;;;;;;:::i;24049:993::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24049:993:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24049:993:0;;:::i;:::-;;;;-1:-1:-1;;;;;24049:993:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29400:1399;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29400:1399:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29400:1399:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25371:1170;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25371:1170:0;;;;;;;:::i;21823:1432::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;21823:1432:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34272:97::-;-1:-1:-1;;;34272:97:0;:::o;19039:1902::-;19375:16;19311:9;19322:13;19337:10;19349:6;-1:-1:-1;;;;;16785:23:0;;16777:62;;;;;-1:-1:-1;;;16777:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16858:26:0;;16879:4;16858:26;;16850:68;;;;;-1:-1:-1;;;16850:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16937:23:0;;16950:10;16937:23;;16929:56;;;;;-1:-1:-1;;;16929:56:0;;;;;;;;;;;;-1:-1:-1;;;16929:56:0;;;;;;;;;;;;;;;17020:1;17004:13;:17;16996:52;;;;;-1:-1:-1;;;16996:52:0;;;;;;;;;;;;-1:-1:-1;;;16996:52:0;;;;;;;;;;;;;;;17081:12;17067:10;:26;;17059:70;;;;;-1:-1:-1;;;17059:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17157:1;17148:6;:10;17140:38;;;;;-1:-1:-1;;;17140:38:0;;;;;;;;;;;;-1:-1:-1;;;17140:38:0;;;;;;;;;;;;;;;19431:4;19417:11;:18;19409:54;;;;;-1:-1:-1;;;19409:54:0;;;;;;;;;;;;-1:-1:-1;;;19409:54:0;;;;;;;;;;;;;;;19496:1;19482:11;:15;19474:48;;;;;-1:-1:-1;;;19474:48:0;;;;;;;;;;;;-1:-1:-1;;;19474:48:0;;;;;;;;;;;;;;;19543:18;:5;-1:-1:-1;;;;;19543:16:0;;:18::i;:::-;19535:43;;;;;-1:-1:-1;;;19535:43:0;;;;;;;;;;;;-1:-1:-1;;;19535:43:0;;;;;;;;;;;;;;;19589:64;-1:-1:-1;;;;;19589:22:0;;19612:10;19632:4;19639:13;19589:64;:22;:64;:::i;:::-;19677:12;;19666:23;;19715:13;19750:5;-1:-1:-1;;;;;19743:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19743:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19743:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19743:24:0;19735:33;;19731:2;:37;;-1:-1:-1;19800:5:0;19791:14;;;19783:50;;;;;-1:-1:-1;;;19783:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19907:16;:5;19917;19907:16;:9;:16;:::i;:::-;19879:25;;;;:15;:25;;;;;:44;;;19964:42;;;19938:121;;;;;-1:-1:-1;;;19938:121:0;;;;;;;;;;;;-1:-1:-1;;;19938:121:0;;;;;;;;;;;;;;;20096:522;;;;;;;;20245:13;20096:522;;;;20164:13;20096:522;;;;20210:1;20096:522;;;;20289:10;20096:522;;;;20326:6;20096:522;;;;20364:11;20096:522;;;;20401:5;20096:522;;;;20442:10;20096:522;;;;20129:5;-1:-1:-1;;;;;20096:522:0;;;;;20482:9;-1:-1:-1;;;;;20096:522:0;;;;;20518:10;-1:-1:-1;;;;;20096:522:0;;;;;20592:10;20096:522;;;;;;20557:4;20096:522;;;;;20076:7;:17;20084:8;20076:17;;;;;;;;;;;:542;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20076:542:0;;;;;-1:-1:-1;;;;;20076:542:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20076:542:0;;;;;-1:-1:-1;;;;;20076:542:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20076:542:0;;;;;-1:-1:-1;;;;;20076:542:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17189:1;20657:19;20674:1;20657:12;;:16;;:19;;;;:::i;:::-;20642:12;:34;20692:241;;;-1:-1:-1;;;;;20692:241:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20743:10;;20720:8;;20692:241;;;;;;;;;19039:1902;;;;;;;;;;;;;:::o;14995:31::-;;;;:::o;23433:118::-;23493:4;23517:17;;;:7;:17;;;;;:26;;;-1:-1:-1;;;23517:26:0;;;;23433:118;;;;:::o;15130:50::-;;;;;;;;;;;;;:::o;16039:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16039:41:0;;;;;;;;;;;;-1:-1:-1;;;16039:41:0;;;;;-1:-1:-1;;;16039:41:0;;;;:::o;26987:1978::-;27166:4;7549:11;;;;7541:55;;;;;-1:-1:-1;;;7541:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7541:55:0;;;;;;;;;;;;;;;7688:5;7674:19;;-1:-1:-1;;7674:19:0;;;16239:17;;;:7;:17;;;;;:26;;;27147:8;;-1:-1:-1;;;16239:26:0;;7674:19;16239:26;16231:60;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;;;;27183:21;27207:17;;;:7;:17;;;;;27271:13;;;;-1:-1:-1;;;;;27271:13:0;27257:10;:27;27235:116;;;;-1:-1:-1;;;27235:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27379:25;;;;:15;:25;;;;;;27370:34;;27362:67;;;;;-1:-1:-1;;;27362:67:0;;;;;;;;;;;;-1:-1:-1;;;27362:67:0;;;;;;;;;;;;;;;27460:26;:24;:26::i;:::-;27444:12;;;;-1:-1:-1;;;;;27444:12:0;;;:42;;;27440:218;;;27521:9;27511:6;:19;27503:46;;;;;-1:-1:-1;;;27503:46:0;;;;;;;;;;;;-1:-1:-1;;;27503:46:0;;;;;;;;;;;;;;;27440:218;;;27582:12;;;;:64;;-1:-1:-1;;;;;27582:12:0;27612:10;27632:4;27639:6;27582:64;:29;:64;:::i;:::-;27671:20;27693:17;27714:19;27724:8;27714:9;:19::i;:::-;27670:63;;-1:-1:-1;27670:63:0;-1:-1:-1;27941:9:0;27953:36;27973:15;27953;:6;14918;27953:15;:10;:15;:::i;:::-;:19;:36;:19;:36;:::i;:::-;27941:48;-1:-1:-1;28071:14:0;28088:24;:15;14918:6;28088:24;:19;:24;:::i;:::-;28071:41;;28160:10;28173:56;28215:6;:13;;;28173:37;28205:4;28173:27;14918:6;28173;:18;;;:22;;:27;;;;:::i;:56::-;28160:69;-1:-1:-1;28289:16:0;28308:11;14918:6;28160:69;28308:11;:7;:11;:::i;:::-;28289:30;;28424:9;28449:60;14918:6;28449:51;28497:2;28449:43;28455:36;28463:27;28473:8;28483:6;28463:9;:27::i;:::-;14918:6;;28455:36;:7;:36;:::i;:::-;28449:1;;:43;:5;:43;:::i;:60::-;28601:12;28576:22;;;:37;28424:85;-1:-1:-1;28643:16:0;:9;28424:85;28643:16;:13;:16;:::i;:::-;28624;;;:35;28711:31;28740:1;28711:24;:12;28728:6;28711:24;:16;:24;:::i;:::-;:28;:31;:28;:31;:::i;:::-;28689:19;;;:53;28857:20;;:32;;28882:6;28857:32;:24;:32;:::i;:::-;28834:55;;28905:30;;;;;;;;28918:8;;28905:30;;;;;;;;;;28953:4;28946:11;;;;;;;;;;-1:-1:-1;7854:11:0;:18;;-1:-1:-1;;7854:18:0;7868:4;7854:18;;;26987:1978;;-1:-1:-1;;;26987:1978:0:o;32860:1404::-;32990:4;7549:11;;;;7541:55;;;;;-1:-1:-1;;;7541:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7541:55:0;;;;;;;;;;;;;;;7688:5;7674:19;;-1:-1:-1;;7674:19:0;;;16239:17;;;:7;:17;;;;;:26;;;32962:8;;-1:-1:-1;;;16239:26:0;;7674:19;16239:26;16231:60;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;;;;33012:20;;:::i;:::-;-1:-1:-1;33035:17:0;;;;:7;:17;;;;;;;;;33012:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33012:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33012:40:0;;;;;;;;;;;;-1:-1:-1;;;33012:40:0;;;;;;;;;;;33065:51;;;;;-1:-1:-1;;;33065:51:0;;;;;;;;;;;;-1:-1:-1;;;33065:51:0;;;;;;;;;;;;;;;33163:17;;;;:7;:17;;;;;:24;;;-1:-1:-1;;;;;33163:24:0;33149:10;:38;;:100;;-1:-1:-1;33222:17:0;;;;:7;:17;;;;;:27;;;-1:-1:-1;;;;;33222:27:0;33208:10;:41;33149:100;33127:192;;;;-1:-1:-1;;;33127:192:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33333:20;33355:17;33376:19;33386:8;33376:9;:19::i;:::-;33435:17;;;;:7;:17;;;;;;;;33428:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33428:24:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33428:24:0;;;33470:25;;;;;33463:32;33332:63;;-1:-1:-1;33332:63:0;-1:-1:-1;33512:16:0;;33508:277;;33565:26;:24;:26::i;:::-;-1:-1:-1;;;;;33549:42:0;:6;:12;;;-1:-1:-1;;;;;33549:42:0;;33545:229;;;33612:16;;;;:48;;-1:-1:-1;;;;;33612:34:0;33647:12;33612:48;:34;:48;:::i;:::-;33545:229;;;33701:57;33727:6;:16;;;33745:12;33701:6;:12;;;-1:-1:-1;;;;;33701:25:0;;;:57;;;;;:::i;:::-;33801:13;;33797:262;;33851:26;:24;:26::i;:::-;-1:-1:-1;;;;;33835:42:0;:6;:12;;;-1:-1:-1;;;;;33835:42:0;;33831:217;;;33898:13;;;;:42;;-1:-1:-1;;;;;33898:31:0;33930:9;33898:42;:31;:42;:::i;:::-;33831:217;;;33981:51;34007:6;:13;;;34022:9;33981:6;:12;;;-1:-1:-1;;;;;33981:25:0;;;:51;;;;;:::i;:::-;34156:6;:16;;;-1:-1:-1;;;;;34076:158:0;34128:6;:13;;;-1:-1:-1;;;;;34076:158:0;34105:8;34076:158;34187:9;34211:12;34076:158;;;;;;;;;;;;;;;;;;;;;;;;34252:4;34245:11;;;;;-1:-1:-1;7854:11:0;:18;;-1:-1:-1;;7854:18:0;7868:4;7854:18;;;32860:1404;;-1:-1:-1;32860:1404:0:o;31317:1146::-;31469:4;7549:11;;;;7541:55;;;;;-1:-1:-1;;;7541:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7541:55:0;;;;;;;;;;;;;;;7688:5;7674:19;;-1:-1:-1;;7674:19:0;;;16239:17;;;:7;:17;;;;;:26;;;31441:8;;-1:-1:-1;;;16239:26:0;;7674:19;16239:26;16231:60;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;;;;31491:21;31515:17;;;:7;:17;;;;;31581:16;;;;-1:-1:-1;;;;;31581:16:0;31567:10;:30;31545:122;;;;-1:-1:-1;;;31545:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31712:25;;;;:15;:25;;;;;;31702:35;;;31680:116;;;;;-1:-1:-1;;;31680:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31810:20;31832:17;31853:19;31863:8;31853:9;:19::i;:::-;31809:63;;;;31923:6;31907:12;:22;;31885:117;;;;-1:-1:-1;;;31885:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32035:26;:24;:26::i;:::-;32019:12;;;;-1:-1:-1;;;;;32019:12:0;;;:42;;;32015:201;;;32078:16;;;;:42;;-1:-1:-1;;;;;32078:16:0;32113:6;32078:42;:34;:42;:::i;:::-;32015:201;;;32179:16;;;;32153:12;;;;:51;;-1:-1:-1;;;;;32153:12:0;;;;32179:16;32197:6;32153:51;:25;:51;:::i;:::-;32253:12;32228:22;;;:37;32276:16;;;:28;;;32337:24;:12;32354:6;32337:24;:16;:24;:::i;:::-;32315:19;;;:46;32408:16;;;;32379:54;;;;;;;;-1:-1:-1;;;;;32408:16:0;;;;32398:8;;32379:54;;;;;;;;;;32451:4;32444:11;;;;;-1:-1:-1;7854:11:0;:18;;-1:-1:-1;;7854:18:0;7868:4;7854:18;;;31317:1146;;-1:-1:-1;;31317:1146:0:o;24049:993::-;24182:14;24211:17;24243:13;24271:21;24307:18;24340:14;24369:17;24401:20;24436:19;24470:23;24508:15;24140:8;16239:7;:17;16247:8;16239:17;;;;;;;;;;;:26;;;;;;;;;;;;16231:60;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;;;;24551:20;;:::i;:::-;24574:7;:17;24582:8;24574:17;;;;;;;;;;;24551:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24551:40:0;-1:-1:-1;;;;;24551:40:0;-1:-1:-1;;;;;24551:40:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24551:40:0;-1:-1:-1;;;;;24551:40:0;-1:-1:-1;;;;;24551:40:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24551:40:0;-1:-1:-1;;;;;24551:40:0;-1:-1:-1;;;;;24551:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24611:6;:13;;;24602:22;;24647:6;:16;;;24635:28;;24682:6;:12;;;24674:20;;24721:6;:20;;;24705:36;;24765:6;:17;;;24752:30;;24802:6;:13;;;24793:22;;24838:6;:16;;;24826:28;;24880:6;:19;;;24865:34;;24924:6;:18;;;24910:32;;24971:6;:22;;;24953:40;;25017:6;:17;;;25004:30;;16302:1;24049:993;;;;;;;;;;;;;;:::o;29400:1399::-;29517:20;16239:17;;;:7;:17;;;;;:26;;;29517:20;;16239:17;;-1:-1:-1;;;16239:26:0;;;;16231:60;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;;;;29574:20;;:::i;:::-;-1:-1:-1;29597:17:0;;;;:7;:17;;;;;;;;;29574:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29574:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29574:40:0;;;;;;;;;;-1:-1:-1;;;29574:40:0;;;;;;;;;;;;;29631:12;:32;29627:97;;;29691:20;29688:1;;-1:-1:-1;29691:20:0;-1:-1:-1;29680:32:0;;29627:97;29736:19;29758:6;:19;;;29736:41;;29790:9;29815:100;29887:6;:13;;;29815:49;14918:6;29815:40;29832:6;:22;;;29815:12;:16;;:40;;;;:::i;:::-;:44;:49;:44;:49;:::i;:100::-;29790:125;;29926:9;29938:37;29970:4;29938:27;14918:6;29938;:18;;;:22;;:27;;;;:::i;:37::-;29926:49;-1:-1:-1;29986:10:0;29999;14918:6;29926:49;29999:10;:7;:10;:::i;:::-;29986:23;;30020:9;30032:47;14918:6;30032:38;30053:16;30063:2;30067:1;30053:9;:16::i;:::-;30032;;;;;:38;:20;:38;:::i;:47::-;30020:59;;30090:9;30102:23;30123:1;30102:6;:16;;;:20;;:23;;;;:::i;:::-;30090:35;-1:-1:-1;30214:15:0;;30210:70;;30250:18;:1;30256:11;30250:18;:5;:18;:::i;:::-;30246:22;;30210:70;30419:20;;30407:8;:1;30413;30407:8;:5;:8;:::i;:::-;:32;;30385:132;;;;-1:-1:-1;;;30385:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30539:25;;;;:15;:25;;;;;;30534:30;;30530:128;;30596:1;30581:16;;30530:128;;;30645:1;30630:16;;30530:128;30679:25;;;;:15;:25;;;;;;30674:30;;30670:122;;30733:1;30721:13;;30670:122;;;30779:1;30767:13;;30670:122;16302:1;;;;;;;;29400:1399;;;;:::o;25371:1170::-;25538:4;7549:11;;;;7541:55;;;;;-1:-1:-1;;;7541:55:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7541:55:0;;;;;;;;;;;;;;;7688:5;7674:19;;-1:-1:-1;;7674:19:0;;;16239:17;;;:7;:17;;;;;:26;;;25510:8;;-1:-1:-1;;;16239:26:0;;7674:19;16239:26;16231:60;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;-1:-1:-1;;;16231:60:0;;;;;;;;;;;;;;;25560:21;25584:17;;;:7;:17;;;;;25648:13;;;;-1:-1:-1;;;;;25648:13:0;25634:10;:27;25612:116;;;;-1:-1:-1;;;25612:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25756:25;;;;:15;:25;;;;;;25747:34;;25739:67;;;;;-1:-1:-1;;;25739:67:0;;;;;;;;;;;;-1:-1:-1;;;25739:67:0;;;;;;;;;;;;;;;25837:26;:24;:26::i;:::-;25821:12;;;;-1:-1:-1;;;;;25821:12:0;;;:42;;;25817:218;;;25898:9;25888:6;:19;25880:46;;;;;-1:-1:-1;;;25880:46:0;;;;;;;;;;;;-1:-1:-1;;;25880:46:0;;;;;;;;;;;;;;;25817:218;;;25959:12;;;;:64;;-1:-1:-1;;;;;25959:12:0;25989:10;26009:4;26016:6;25959:64;:29;:64;:::i;:::-;26048:20;26070:17;26091:19;26101:8;26091:9;:19::i;:::-;26202:12;26177:22;;;:37;26047:63;;-1:-1:-1;26047:63:0;-1:-1:-1;26244:21:0;26047:63;26258:6;26244:21;:13;:21;:::i;:::-;26225:16;;;:40;26300:19;;;:34;;;26433:20;;:32;;26458:6;26433:32;:24;:32;:::i;:::-;26410:55;;26481:30;;;;;;;;26494:8;;26481:30;;;;;;;;;;26529:4;26522:11;;;;;-1:-1:-1;7854:11:0;:18;;-1:-1:-1;;7854:18:0;7868:4;7854:18;;;25371:1170;;-1:-1:-1;;25371:1170:0:o;21823:1432::-;22121:16;22061:9;22072;22083:10;22095:6;-1:-1:-1;;;;;16785:23:0;;16777:62;;;;;-1:-1:-1;;;16777:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16858:26:0;;16879:4;16858:26;;16850:68;;;;;-1:-1:-1;;;16850:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16937:23:0;;16950:10;16937:23;;16929:56;;;;;-1:-1:-1;;;16929:56:0;;;;;;;;;;;;-1:-1:-1;;;16929:56:0;;;;;;;;;;;;;;;17020:1;17004:13;:17;16996:52;;;;;-1:-1:-1;;;16996:52:0;;;;;;;;;;;;-1:-1:-1;;;16996:52:0;;;;;;;;;;;;;;;17081:12;17067:10;:26;;17059:70;;;;;-1:-1:-1;;;17059:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17157:1;17148:6;:10;17140:38;;;;;-1:-1:-1;;;17140:38:0;;;;;;;;;;;;-1:-1:-1;;;17140:38:0;;;;;;;;;;;;;;;22177:4;22163:11;:18;22155:54;;;;;-1:-1:-1;;;22155:54:0;;;;;;;;;;;;-1:-1:-1;;;22155:54:0;;;;;;;;;;;;;;;22242:1;22228:11;:15;22220:48;;;;;-1:-1:-1;;;22220:48:0;;;;;;;;;;;;-1:-1:-1;;;22220:48:0;;;;;;;;;;;;;;;22300:6;22287:9;:19;;22279:49;;;;;-1:-1:-1;;;22279:49:0;;;;;;;;;;;;-1:-1:-1;;;22279:49:0;;;;;;;;;;;;;;;22403:12;;22392:23;;22446:480;;;;;;;;22596:9;22446:480;;;;22527:9;22446:480;;;;22565:1;22446:480;;;;22632:10;22446:480;;;;22665:6;22446:480;;;;22699:11;22446:480;;;;22732:6;22446:480;;;;22770:10;22446:480;;;;22475:26;:24;:26::i;:::-;-1:-1:-1;;;;;22446:480:0;;;;;;;;;;;;;;;;22838:10;22446:480;;;;;;;;;;;;;;;;;;;22873:4;22446:480;;;;;;;-1:-1:-1;22426:17:0;;;:7;:17;;;;;;;:500;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22426:500:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;22426:500:0;-1:-1:-1;;;;22426:500:0;;;-1:-1:-1;;;22426:500:0;-1:-1:-1;;;;22426:500:0;;;;;;;;;;;;;;;;;;;;;;;;;22954:12;;:19;;;:16;:19;:::i;:::-;22939:12;:34;-1:-1:-1;;;;;22989:258:0;;23040:10;23017:8;22989:258;23089:26;:24;:26::i;:::-;22989:258;;;-1:-1:-1;;;;;22989:258:0;;;;;23130:9;22989:258;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21823:1432;;;;;;;;;;;:::o;9244:268::-;9302:4;-1:-1:-1;;;;;9323:21:0;;9319:66;;-1:-1:-1;9368:5:0;9361:12;;9319:66;-1:-1:-1;9450:18:0;9496:8;;;9244:268::o;8550:493::-;8835:51;;;-1:-1:-1;;;;;8835:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;8835:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;8810:87:0;;;;8775:12;;8789:17;;8810:10;;;;8835:51;8810:87;;;25:18:-1;8810:87:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;8810:87:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;8774:123:0;;;;8930:7;:57;;;;-1:-1:-1;8942:11:0;;:16;;:44;;;8973:4;8962:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8962:24:0;8942:44;8908:127;;;;;-1:-1:-1;;;8908:127:0;;;;;;;;;;;;-1:-1:-1;;;8908:127:0;;;;;;;;;;;;;;;8550:493;;;;;;:::o;3224:132::-;3282:7;3309:39;3313:1;3316;3309:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3302:46;;3224:132;;;;;:::o;913:181::-;971:7;1003:5;;;1027:6;;;;1019:46;;;;;-1:-1:-1;;;1019:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;9656:122;9728:42;9656:122;:::o;2285:471::-;2343:7;2588:6;2584:47;;-1:-1:-1;2618:1:0;2611:8;;2584:47;2655:5;;;2659:1;2655;:5;:1;2679:5;;;;;:10;2671:56;;;;-1:-1:-1;;;2671:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1369:136;1427:7;1454:43;1458:1;1461;1454:43;;;;;;;;;;;;;;;;;:3;:43::i;12110:549::-;12174:7;9951:5;12202:4;:21;;12194:55;;;;;-1:-1:-1;;;12194:55:0;;;;;;;;;;;;-1:-1:-1;;;12194:55:0;;;;;;;;;;;;;;;10003:18;12268:21;;;12260:56;;;;;-1:-1:-1;;;12260:56:0;;;;;;;;;;;;-1:-1:-1;;;12260:56:0;;;;;;;;;;;;;;;12329:13;12345:11;12352:3;12345:6;:11::i;:::-;12329:27;;12367:14;12384:16;12389:3;12394:5;12384:4;:16::i;:::-;12367:33;;12413:16;12432:24;12438:4;12444:11;12449:5;12444:4;:11::i;:::-;12432:5;:24::i;:::-;12413:43;-1:-1:-1;12473:11:0;12469:59;;12508:8;-1:-1:-1;12501:15:0;;-1:-1:-1;;12501:15:0;12469:59;12540:21;12564:40;12575:4;12581:6;10069:13;12564:10;:40::i;:::-;12540:64;;12622:29;12627:8;12637:13;12622:4;:29::i;:::-;12615:36;12110:549;-1:-1:-1;;;;;;;12110:549:0:o;9051:185::-;9165:12;;;9126;9165;;;;;;;;;-1:-1:-1;;;;;9144:7:0;;;9158:5;;9144:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;9144:34:0;;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;9125:53:0;;;9197:7;9189:39;;;;;-1:-1:-1;;;9189:39:0;;;;;;;;;;;;-1:-1:-1;;;9189:39:0;;;;;;;;;;;;;;;9051:185;;;:::o;8099:443::-;8345:45;;;-1:-1:-1;;;;;8345:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;8345:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;8320:81:0;;;;8285:12;;8299:17;;8320:10;;;;8345:45;8320:81;;;25:18:-1;8320:81:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;8320:81:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;8284:117:0;;;;8434:7;:57;;;;-1:-1:-1;8446:11:0;;:16;;:44;;;8477:4;8466:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8466:24:0;8446:44;8412:122;;;;;-1:-1:-1;;;8412:122:0;;;;;;;;;;;;-1:-1:-1;;;8412:122:0;;;;;;;;;;;;;;;8099:443;;;;;:::o;3886:345::-;3972:7;4074:12;4067:5;4059:28;;;;-1:-1:-1;;;4059:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4059:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4098:9;4114:1;4110;:5;;;;;;;3886:345;-1:-1:-1;;;;;3886:345:0:o;1842:192::-;1928:7;1964:12;1956:6;;;;1948:29;;;;-1:-1:-1;;;1948:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1948:29:0;-1:-1:-1;;;2000:5:0;;;1842:192::o;10190:99::-;10240:7;9898:6;10267:7;10272:1;10267:4;:7::i;:::-;:14;;10190:99;-1:-1:-1;;10190:99:0:o;10474:191::-;10533:7;10554:9;10565;10578:14;10587:1;10590;10578:8;:14::i;:::-;10553:39;;;;10612:4;10611:5;10603:35;;;;;-1:-1:-1;;;10603:35:0;;;;;;;;;;;;-1:-1:-1;;;10603:35:0;;;;;;;;;;;;;;;-1:-1:-1;10656:1:0;10474:191;-1:-1:-1;;;10474:191:0:o;10091:91::-;9898:6;10166:8;;;10091:91::o;11646:303::-;11706:7;;11742:1;11738;:5;:21;;9898:6;11738:21;;;11751:1;11738:21;11726:33;-1:-1:-1;11782:1:0;11777:6;;;;11772:151;11785:6;;11772:151;;11820:10;11825:1;11828;11820:4;:10::i;:::-;11816:14;-1:-1:-1;11855:1:0;11851;:5;:10;11847:65;;11886:10;11891:1;11894;11886:4;:10::i;:::-;11882:14;;11847:65;11798:1;11793:6;;;;11772:151;;12667:1114;12790:7;12842:3;12790:7;;12881:20;12890:4;9898:6;12881:8;:20::i;:::-;12856:45;;-1:-1:-1;12856:45:0;-1:-1:-1;9898:6:0;;12912:12;13250:1;13233:518;13261:9;13253:4;:17;13233:518;;13292:12;9898:6;13307:1;:8;13292:23;;13331:9;13342;13355:29;13364:1;13367:16;13372:4;9898:6;13367:4;:16::i;:::-;13355:8;:29::i;:::-;13330:54;;;;13406:22;13411:4;13417:10;13422:1;13425;13417:4;:10::i;:::-;13406:4;:22::i;:::-;13399:29;;13450:16;13455:4;13461;13450;:16::i;:::-;13443:23;-1:-1:-1;13485:9:0;13481:20;;13496:5;;;;;13481:20;13522:4;13518:30;;;13539:9;;;13518:30;13567:4;13563:30;;;13584:9;;;13563:30;13612:8;13608:132;;;13647:15;13652:3;13657:4;13647;:15::i;:::-;13641:21;;13608:132;;;13709:15;13714:3;13719:4;13709;:15::i;:::-;13703:21;;13608:132;-1:-1:-1;;;13272:3:0;;13233:518;;;-1:-1:-1;13770:3:0;;12667:1114;-1:-1:-1;;;;;;;;;12667:1114:0:o;10922:306::-;10981:7;11014:5;;;11038:6;;;:21;;;11058:1;11053;11048:2;:6;;;;;;:11;11038:21;11030:50;;;;;-1:-1:-1;;;11030:50:0;;;;;;;;;;;;-1:-1:-1;;;11030:50:0;;;;;;;;;;;;;;;11110:8;11104:15;;11138:8;;;;11130:37;;;;;-1:-1:-1;;;11130:37:0;;;;;;;;;;;;-1:-1:-1;;;11130:37:0;;;;;;;;;;;;;;;11178:10;9898:6;11191:2;:9;;;10922:306;-1:-1:-1;;;;;;10922:306:0:o;10673:241::-;10763:7;10772:4;10803:1;10798;:6;10794:113;;-1:-1:-1;;10829:5:0;;;10836;10821:21;;10794:113;-1:-1:-1;;10883:5:0;;;10890:4;10794:113;10673:241;;;;;:::o;11236:382::-;11295:7;11323:6;11315:31;;;;;-1:-1:-1;;;11315:31:0;;;;;;;;;;;;-1:-1:-1;;;11315:31:0;;;;;;;;;;;;;;;9898:6;11370:8;;11397:6;;;:24;;;9898:6;11412:1;11407:2;:6;;;;;;:14;11397:24;11389:53;;;;;-1:-1:-1;;;11389:53:0;;;;;;;;;;;;-1:-1:-1;;;11389:53:0;;;;;;;;;;;;;;;11493:1;11489:5;;11483:12;;11514:8;;;;11506:37;;;;;-1:-1:-1;;;11506:37:0;;;;;;;;;;;;-1:-1:-1;;;11506:37:0;;;;;;;;;;;;;;;11571:10;11589:1;11584:2;:6;;;;10297:169;10356:7;10388:5;;;10412:6;;;;10404:35;;;;;-1:-1:-1;;;10404:35:0;;;;;;;;;;;;-1:-1:-1;;;10404:35:0;;;;;;;;;;;;;;14769:19603;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14769:19603:0;;;;;;-1:-1:-1;;;;;14769:19603:0;;;;;;-1:-1:-1;;;;;14769:19603:0;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://5e87d3ee6db25103178fda07cfdb9332ee39f260f532b3b317b3622d96ff5100
Loading...
Loading
Loading...
Loading
OVERVIEW
Exponentially decaying money stream protocol.Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.