More Info
Private Name Tags
Latest 25 from a total of 151 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Redeem | 15841890 | 652 days ago | IN | 0 ETH | 0.00114035 | ||||
Deposit | 15728080 | 668 days ago | IN | 0 ETH | 0.00587379 | ||||
Deposit | 15728067 | 668 days ago | IN | 0 ETH | 0.00746825 | ||||
Deposit | 15707382 | 671 days ago | IN | 0 ETH | 0.01091587 | ||||
Redeem | 15698063 | 672 days ago | IN | 0 ETH | 0.00054192 | ||||
Deposit | 15660880 | 677 days ago | IN | 0 ETH | 0.00327983 | ||||
Redeem | 15657230 | 678 days ago | IN | 0 ETH | 0.00029454 | ||||
Deposit | 15628981 | 682 days ago | IN | 0 ETH | 0.00439441 | ||||
Deposit | 15585988 | 688 days ago | IN | 0 ETH | 0.00218984 | ||||
Deposit | 15542575 | 694 days ago | IN | 0 ETH | 0.00298435 | ||||
Deposit | 15523227 | 697 days ago | IN | 0 ETH | 0.00744353 | ||||
Deposit | 15523216 | 697 days ago | IN | 0 ETH | 0.00338469 | ||||
Redeem | 15502598 | 700 days ago | IN | 0 ETH | 0.00090289 | ||||
Deposit | 15470336 | 705 days ago | IN | 0 ETH | 0.00172333 | ||||
Deposit | 15464738 | 706 days ago | IN | 0 ETH | 0.00199635 | ||||
Deposit | 15425944 | 712 days ago | IN | 0 ETH | 0.0022859 | ||||
Deposit | 15405809 | 716 days ago | IN | 0 ETH | 0.00386013 | ||||
Deposit | 15385716 | 719 days ago | IN | 0 ETH | 0.00535929 | ||||
Deposit | 15343125 | 726 days ago | IN | 0 ETH | 0.0067026 | ||||
Deposit | 15323798 | 729 days ago | IN | 0 ETH | 0.00110135 | ||||
Deposit | 15323798 | 729 days ago | IN | 0 ETH | 0.00348335 | ||||
Deposit | 15286615 | 735 days ago | IN | 0 ETH | 0.00214065 | ||||
Deposit | 15254237 | 740 days ago | IN | 0 ETH | 0.00283543 | ||||
Deposit | 15214254 | 746 days ago | IN | 0 ETH | 0.00368322 | ||||
Deposit | 15214237 | 746 days ago | IN | 0 ETH | 0.00409315 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
UniversalBarterDepository
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-01 */ // SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity 0.7.5; interface IOwnable { function policy() external view returns (address); function renounceManagement() external; function pushManagement( address newOwner_ ) external; function pullManagement() external; } contract Ownable is IOwnable { address internal _owner; address internal _newOwner; event OwnershipPushed(address indexed previousOwner, address indexed newOwner); event OwnershipPulled(address indexed previousOwner, address indexed newOwner); constructor () { _owner = msg.sender; emit OwnershipPushed( address(0), _owner ); } function policy() public view override returns (address) { return _owner; } modifier onlyPolicy() { require( _owner == msg.sender, "Ownable: caller is not the owner" ); _; } function renounceManagement() public virtual override onlyPolicy() { emit OwnershipPushed( _owner, address(0) ); _owner = address(0); } function pushManagement( address newOwner_ ) public virtual override onlyPolicy() { require( newOwner_ != address(0), "Ownable: new owner is the zero address"); emit OwnershipPushed( _owner, newOwner_ ); _newOwner = newOwner_; } function pullManagement() public virtual override { require( msg.sender == _newOwner, "Ownable: must be new owner to pull"); emit OwnershipPulled( _owner, _newOwner ); _owner = _newOwner; } } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } function sqrrt(uint256 a) internal pure returns (uint c) { if (a > 3) { c = a; uint b = add( div( a, 2), 1 ); while (b < c) { c = b; b = div( add( div( a, b ), b), 2 ); } } else if (a != 0) { c = 1; } } } library Address { function isContract(address account) internal view returns (bool) { uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } function addressToString(address _address) internal pure returns(string memory) { bytes32 _bytes = bytes32(uint256(_address)); bytes memory HEX = "0123456789abcdef"; bytes memory _addr = new bytes(42); _addr[0] = '0'; _addr[1] = 'x'; for(uint256 i = 0; i < 20; i++) { _addr[2+i*2] = HEX[uint8(_bytes[i + 12] >> 4)]; _addr[3+i*2] = HEX[uint8(_bytes[i + 12] & 0x0f)]; } return string(_addr); } } interface IERC20 { function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } abstract contract ERC20 is IERC20 { using SafeMath for uint256; // TODO comment actual hash value. bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256( "ERC20Token" ); mapping (address => uint256) internal _balances; mapping (address => mapping (address => uint256)) internal _allowances; uint256 internal _totalSupply; string internal _name; string internal _symbol; uint8 internal _decimals; constructor (string memory name_, string memory symbol_, uint8 decimals_) { _name = name_; _symbol = symbol_; _decimals = decimals_; } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view override returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(msg.sender, recipient, amount); return true; } function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(msg.sender, spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } function _mint(address account_, uint256 ammount_) internal virtual { require(account_ != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address( this ), account_, ammount_); _totalSupply = _totalSupply.add(ammount_); _balances[account_] = _balances[account_].add(ammount_); emit Transfer(address( this ), account_, ammount_); } function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _beforeTokenTransfer( address from_, address to_, uint256 amount_ ) internal virtual { } } interface IERC2612Permit { function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function nonces(address owner) external view returns (uint256); } library Counters { using SafeMath for uint256; struct Counter { uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } abstract contract ERC20Permit is ERC20, IERC2612Permit { using Counters for Counters.Counter; mapping(address => Counters.Counter) private _nonces; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; bytes32 public DOMAIN_SEPARATOR; constructor() { uint256 chainID; assembly { chainID := chainid() } DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name())), keccak256(bytes("1")), // Version chainID, address(this) ) ); } function permit( address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "Permit: expired deadline"); bytes32 hashStruct = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner].current(), deadline)); bytes32 _hash = keccak256(abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, hashStruct)); address signer = ecrecover(_hash, v, r, s); require(signer != address(0) && signer == owner, "ZeroSwapPermit: Invalid signature"); _nonces[owner].increment(); _approve(owner, spender, amount); } function nonces(address owner) public view override returns (uint256) { return _nonces[owner].current(); } } library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function _callOptionalReturn(IERC20 token, bytes memory data) private { bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } library FullMath { function fullMul(uint256 x, uint256 y) private pure returns (uint256 l, uint256 h) { uint256 mm = mulmod(x, y, uint256(-1)); l = x * y; h = mm - l; if (mm < l) h -= 1; } function fullDiv( uint256 l, uint256 h, uint256 d ) private pure returns (uint256) { uint256 pow2 = d & -d; d /= pow2; l /= pow2; l += h * ((-pow2) / pow2 + 1); uint256 r = 1; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; r *= 2 - d * r; return l * r; } function mulDiv( uint256 x, uint256 y, uint256 d ) internal pure returns (uint256) { (uint256 l, uint256 h) = fullMul(x, y); uint256 mm = mulmod(x, y, d); if (mm > l) h -= 1; l -= mm; require(h < d, 'FullMath::mulDiv: overflow'); return fullDiv(l, h, d); } } library FixedPoint { struct uq112x112 { uint224 _x; } struct uq144x112 { uint256 _x; } uint8 private constant RESOLUTION = 112; uint256 private constant Q112 = 0x10000000000000000000000000000; uint256 private constant Q224 = 0x100000000000000000000000000000000000000000000000000000000; uint256 private constant LOWER_MASK = 0xffffffffffffffffffffffffffff; // decimal of UQ*x112 (lower 112 bits) function decode(uq112x112 memory self) internal pure returns (uint112) { return uint112(self._x >> RESOLUTION); } function decode112with18(uq112x112 memory self) internal pure returns (uint) { return uint(self._x) / 5192296858534827; } function fraction(uint256 numerator, uint256 denominator) internal pure returns (uq112x112 memory) { require(denominator > 0, 'FixedPoint::fraction: division by zero'); if (numerator == 0) return FixedPoint.uq112x112(0); if (numerator <= uint144(-1)) { uint256 result = (numerator << RESOLUTION) / denominator; require(result <= uint224(-1), 'FixedPoint::fraction: overflow'); return uq112x112(uint224(result)); } else { uint256 result = FullMath.mulDiv(numerator, Q112, denominator); require(result <= uint224(-1), 'FixedPoint::fraction: overflow'); return uq112x112(uint224(result)); } } } interface ITreasury { function deposit( uint _amount, address _token, uint _profit ) external returns ( bool ); function valueOf( address _token, uint _amount ) external view returns ( uint value_ ); } interface IBarterCalculator { function valuation( address _LP, uint _amount ) external view returns ( uint ); function markdown( address _LP ) external view returns ( uint ); } interface IStaking { function stake( uint _amount, address _recipient ) external returns ( bool ); } interface IStakingHelper { function stake( uint _amount, address _recipient ) external; } contract UniversalBarterDepository is Ownable { using FixedPoint for *; using SafeERC20 for IERC20; using SafeMath for uint; /* ======== EVENTS ======== */ event BarterCreated( uint deposit, uint indexed payout, uint indexed expires, uint indexed priceInUSD ); event BarterRedeemed( address indexed recipient, uint payout, uint remaining ); event BarterPriceChanged( uint indexed priceInUSD, uint indexed internalPrice, uint indexed debtRatio ); event ControlVariableAdjustment( uint initialBCV, uint newBCV, uint adjustment, bool addition ); /* ======== STATE VARIABLES ======== */ address public immutable USV; // token given as payment for barter address public immutable principle; // token used to create barter address public immutable treasury; // mints USV when receives principle address public immutable AtlasTeam; // receives profit share from barter bool public immutable isLiquidityBarter; // LP and Reserve barters are treated slightly different address public immutable barterCalculator; // calculates value of LP tokens address public staking; // to auto-stake payout address public stakingHelper; // to stake and claim if no staking warmup bool public useHelper; Terms public terms; // stores terms for new barters Adjust public adjustment; // stores adjustment to BCV data mapping( address => Barter ) public barterInfo; // stores barter information for depositors uint public totalDebt; // total value of outstanding barters; used for pricing uint public lastDecay; // reference block for debt decay /* ======== STRUCTS ======== */ // Info for creating new barters struct Terms { uint controlVariable; // scaling variable for price uint vestingTerm; // in blocks uint minimumPrice; // vs principle value uint maxPayout; // in thousandths of a %. i.e. 500 = 0.5% uint fee; // as % of barter payout, in hundreths. ( 500 = 5% = 0.05 for every 1 paid) uint maxDebt; // 9 decimal debt ratio, max % total supply created as debt } // Info for barterer struct Barter { uint payout; // USV remaining to be paid uint vesting; // Blocks left to vest uint lastBlock; // Last interaction uint pricePaid; // In DAI, for front end viewing } // Info for incremental adjustments to control variable struct Adjust { bool add; // addition or subtraction uint rate; // increment uint target; // BCV when adjustment finished uint buffer; // minimum length (in blocks) between adjustments uint lastBlock; // block when last adjustment made } /* ======== INITIALIZATION ======== */ constructor ( address _USV, address _principle, address _treasury, address _AtlasTeam, address _barterCalculator ) { require( _USV != address(0) ); USV = _USV; require( _principle != address(0) ); principle = _principle; require( _treasury != address(0) ); treasury = _treasury; require( _AtlasTeam != address(0) ); AtlasTeam = _AtlasTeam; // barterCalculator should be address(0) if not LP barter barterCalculator = _barterCalculator; isLiquidityBarter = ( _barterCalculator != address(0) ); } /** * @notice initializes barter parameters * @param _controlVariable uint * @param _vestingTerm uint * @param _minimumPrice uint * @param _maxPayout uint * @param _fee uint * @param _maxDebt uint * @param _initialDebt uint */ function initializeBarterTerms( uint _controlVariable, uint _vestingTerm, uint _minimumPrice, uint _maxPayout, uint _fee, uint _maxDebt, uint _initialDebt ) external onlyPolicy() { require( terms.controlVariable == 0, "Barters must be initialized from 0" ); terms = Terms ({ controlVariable: _controlVariable, vestingTerm: _vestingTerm, minimumPrice: _minimumPrice, maxPayout: _maxPayout, fee: _fee, maxDebt: _maxDebt }); totalDebt = _initialDebt; lastDecay = block.number; } /* ======== POLICY FUNCTIONS ======== */ enum PARAMETER { VESTING, PAYOUT, FEE, DEBT } /** * @notice set parameters for new barters * @param _parameter PARAMETER * @param _input uint */ function setBarterTerms ( PARAMETER _parameter, uint _input ) external onlyPolicy() { if ( _parameter == PARAMETER.VESTING ) { // 0 require( _input >= 58378, "Vesting must be longer than 36 hours" ); terms.vestingTerm = _input; } else if ( _parameter == PARAMETER.PAYOUT ) { // 1 require( _input <= 1000, "Payout cannot be above 1 percent" ); terms.maxPayout = _input; } else if ( _parameter == PARAMETER.FEE ) { // 2 require( _input <= 10000, "AtlasTeam fee cannot exceed payout" ); terms.fee = _input; } else if ( _parameter == PARAMETER.DEBT ) { // 3 terms.maxDebt = _input; } } /** * @notice set control variable adjustment * @param _addition bool * @param _increment uint * @param _target uint * @param _buffer uint */ function setAdjustment ( bool _addition, uint _increment, uint _target, uint _buffer ) external onlyPolicy() { require( _increment <= terms.controlVariable.mul( 500 ).div( 1000 ), "Increment too large" ); adjustment = Adjust({ add: _addition, rate: _increment, target: _target, buffer: _buffer, lastBlock: block.number }); } /** * @notice set contract for auto stake * @param _staking address * @param _helper bool */ function setStaking( address _staking, bool _helper ) external onlyPolicy() { require( _staking != address(0) ); if ( _helper ) { useHelper = true; stakingHelper = _staking; } else { useHelper = false; staking = _staking; } } /* ======== USER FUNCTIONS ======== */ /** * @notice deposit barter * @param _amount uint * @param _maxPrice uint * @param _depositor address * @return uint */ function deposit( uint _amount, uint _maxPrice, address _depositor ) external returns ( uint ) { require( _depositor != address(0), "Invalid address" ); decayDebt(); require( totalDebt <= terms.maxDebt, "Max capacity reached" ); uint priceInUSD = barterPriceInUSD(); // Stored in barter info uint nativePrice = _barterPrice(); require( _maxPrice >= nativePrice, "Slippage limit: more than max price" ); // slippage protection uint value = ITreasury( treasury ).valueOf( principle, _amount ); uint payout = payoutFor( value ); // payout to barterer is computed require( payout >= 10000000, "Barter too small" ); // must be > 0.01 USV (10e7) ( underflow protection ) require( payout <= maxPayout(), "Barter too large"); // size protection because there is no slippage // profits are calculated uint fee = payout.mul( terms.fee ).div( 10000 ); uint profit = value.sub( payout ).sub( fee ); /** principle is transferred in approved and deposited into the treasury, returning (_amount - profit) USV */ IERC20( principle ).safeTransferFrom( msg.sender, address(this), _amount ); IERC20( principle ).approve( address( treasury ), _amount ); ITreasury( treasury ).deposit( _amount, principle, profit ); if ( fee != 0 ) { // fee is transferred to AtlasTeam IERC20( USV ).safeTransfer( AtlasTeam, fee ); } // total debt is increased totalDebt = totalDebt.add( value ); // depositor info is stored barterInfo[ _depositor ] = Barter({ payout: barterInfo[ _depositor ].payout.add( payout ), vesting: terms.vestingTerm, lastBlock: block.number, pricePaid: priceInUSD }); // indexed events are emitted emit BarterCreated( _amount, payout, block.number.add( terms.vestingTerm ), priceInUSD ); emit BarterPriceChanged( barterPriceInUSD(), _barterPrice(), debtRatio() ); adjust(); // control variable is adjusted return payout; } /** * @notice redeem barter for user * @param _recipient address * @param _stake bool * @return uint */ function redeem( address _recipient, bool _stake ) external returns ( uint ) { Barter memory info = barterInfo[ _recipient ]; uint percentVested = percentVestedFor( _recipient ); // (blocks since last interaction / vesting term remaining) if ( percentVested >= 10000 ) { // if fully vested delete barterInfo[ _recipient ]; // delete user info emit BarterRedeemed( _recipient, info.payout, 0 ); // emit barter data return stakeOrSend( _recipient, _stake, info.payout ); // pay user everything due } else { // if unfinished // calculate payout vested uint payout = info.payout.mul( percentVested ).div( 10000 ); // store updated deposit info barterInfo[ _recipient ] = Barter({ payout: info.payout.sub( payout ), vesting: info.vesting.sub( block.number.sub( info.lastBlock ) ), lastBlock: block.number, pricePaid: info.pricePaid }); emit BarterRedeemed( _recipient, payout, barterInfo[ _recipient ].payout ); return stakeOrSend( _recipient, _stake, payout ); } } /* ======== INTERNAL HELPER FUNCTIONS ======== */ /** * @notice allow user to stake payout automatically * @param _stake bool * @param _amount uint * @return uint */ function stakeOrSend( address _recipient, bool _stake, uint _amount ) internal returns ( uint ) { if ( !_stake ) { // if user does not want to stake IERC20( USV ).transfer( _recipient, _amount ); // send payout } else { // if user wants to stake if ( useHelper ) { // use if staking warmup is 0 IERC20( USV ).approve( stakingHelper, _amount ); IStakingHelper( stakingHelper ).stake( _amount, _recipient ); } else { IERC20( USV ).approve( staking, _amount ); IStaking( staking ).stake( _amount, _recipient ); } } return _amount; } /** * @notice makes incremental adjustment to control variable */ function adjust() internal { uint blockCanAdjust = adjustment.lastBlock.add( adjustment.buffer ); if( adjustment.rate != 0 && block.number >= blockCanAdjust ) { uint initial = terms.controlVariable; if ( adjustment.add ) { terms.controlVariable = terms.controlVariable.add( adjustment.rate ); if ( terms.controlVariable >= adjustment.target ) { adjustment.rate = 0; } } else { terms.controlVariable = terms.controlVariable.sub( adjustment.rate ); if ( terms.controlVariable <= adjustment.target ) { adjustment.rate = 0; } } adjustment.lastBlock = block.number; emit ControlVariableAdjustment( initial, terms.controlVariable, adjustment.rate, adjustment.add ); } } /** * @notice reduce total debt */ function decayDebt() internal { totalDebt = totalDebt.sub( debtDecay() ); lastDecay = block.number; } /* ======== VIEW FUNCTIONS ======== */ /** * @notice determine maximum barter size * @return uint */ function maxPayout() public view returns ( uint ) { return IERC20( USV ).totalSupply().mul( terms.maxPayout ).div( 100000 ); } /** * @notice calculate interest due for new barter * @param _value uint * @return uint */ function payoutFor( uint _value ) public view returns ( uint ) { return FixedPoint.fraction( _value, barterPrice() ).decode112with18().div( 1e16 ); } /** * @notice calculate current barter premium * @return price_ uint */ function barterPrice() public view returns ( uint price_ ) { price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 ); if ( price_ < terms.minimumPrice ) { price_ = terms.minimumPrice; } } /** * @notice calculate current barter price and remove floor if above * @return price_ uint */ function _barterPrice() internal returns ( uint price_ ) { price_ = terms.controlVariable.mul( debtRatio() ).add( 1000000000 ).div( 1e7 ); if ( price_ < terms.minimumPrice ) { price_ = terms.minimumPrice; } else if ( terms.minimumPrice != 0 ) { terms.minimumPrice = 0; } } /** * @notice converts barter price to DAI value * @return price_ uint */ function barterPriceInUSD() public view returns ( uint price_ ) { if( isLiquidityBarter ) { price_ = barterPrice().mul( IBarterCalculator( barterCalculator ).markdown( principle ) ).div( 100 ); } else { price_ = barterPrice().mul( 10 ** IERC20( principle ).decimals() ).div( 100 ); } } /** * @notice calculate current ratio of debt to USV supply * @return debtRatio_ uint */ function debtRatio() public view returns ( uint debtRatio_ ) { uint supply = IERC20( USV ).totalSupply(); debtRatio_ = FixedPoint.fraction( currentDebt().mul( 1e9 ), supply ).decode112with18().div( 1e18 ); } /** * @notice debt ratio in same terms for reserve or liquidity barters * @return uint */ function standardizedDebtRatio() external view returns ( uint ) { if ( isLiquidityBarter ) { return debtRatio().mul( IBarterCalculator( barterCalculator ).markdown( principle ) ).div( 1e9 ); } else { return debtRatio(); } } /** * @notice calculate debt factoring in decay * @return uint */ function currentDebt() public view returns ( uint ) { return totalDebt.sub( debtDecay() ); } /** * @notice amount to decay total debt by * @return decay_ uint */ function debtDecay() public view returns ( uint decay_ ) { uint blocksSinceLast = block.number.sub( lastDecay ); decay_ = totalDebt.mul( blocksSinceLast ).div( terms.vestingTerm ); if ( decay_ > totalDebt ) { decay_ = totalDebt; } } /** * @notice calculate how far into vesting a depositor is * @param _depositor address * @return percentVested_ uint */ function percentVestedFor( address _depositor ) public view returns ( uint percentVested_ ) { Barter memory barter = barterInfo[ _depositor ]; uint blocksSinceLast = block.number.sub( barter.lastBlock ); uint vesting = barter.vesting; if ( vesting > 0 ) { percentVested_ = blocksSinceLast.mul( 10000 ).div( vesting ); } else { percentVested_ = 0; } } /** * @notice calculate amount of USV available for claim by depositor * @param _depositor address * @return pendingPayout_ uint */ function pendingPayoutFor( address _depositor ) external view returns ( uint pendingPayout_ ) { uint percentVested = percentVestedFor( _depositor ); uint payout = barterInfo[ _depositor ].payout; if ( percentVested >= 10000 ) { pendingPayout_ = payout; } else { pendingPayout_ = payout.mul( percentVested ).div( 10000 ); } } /* ======= AUXILLIARY ======= */ /** * @notice allow anyone to send lost tokens (excluding principle or USV) to the AtlasTeam * @return bool */ function recoverLostToken( address _token ) external returns ( bool ) { require( _token != USV ); require( _token != principle ); IERC20( _token ).safeTransfer( AtlasTeam, IERC20( _token ).balanceOf( address(this) ) ); return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_USV","type":"address"},{"internalType":"address","name":"_principle","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_AtlasTeam","type":"address"},{"internalType":"address","name":"_barterCalculator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"deposit","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"expires","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"}],"name":"BarterCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"priceInUSD","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"internalPrice","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"debtRatio","type":"uint256"}],"name":"BarterPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remaining","type":"uint256"}],"name":"BarterRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"initialBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBCV","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"adjustment","type":"uint256"},{"indexed":false,"internalType":"bool","name":"addition","type":"bool"}],"name":"ControlVariableAdjustment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPushed","type":"event"},{"inputs":[],"name":"AtlasTeam","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USV","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustment","outputs":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"buffer","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"barterCalculator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"barterInfo","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint256","name":"vesting","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"},{"internalType":"uint256","name":"pricePaid","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"barterPrice","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"barterPriceInUSD","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtDecay","outputs":[{"internalType":"uint256","name":"decay_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtRatio","outputs":[{"internalType":"uint256","name":"debtRatio_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_maxPrice","type":"uint256"},{"internalType":"address","name":"_depositor","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_controlVariable","type":"uint256"},{"internalType":"uint256","name":"_vestingTerm","type":"uint256"},{"internalType":"uint256","name":"_minimumPrice","type":"uint256"},{"internalType":"uint256","name":"_maxPayout","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_maxDebt","type":"uint256"},{"internalType":"uint256","name":"_initialDebt","type":"uint256"}],"name":"initializeBarterTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isLiquidityBarter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastDecay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"pendingPayoutFor","outputs":[{"internalType":"uint256","name":"pendingPayout_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"percentVestedFor","outputs":[{"internalType":"uint256","name":"percentVested_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"policy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"principle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pullManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"pushManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverLostToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"bool","name":"_stake","type":"bool"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_addition","type":"bool"},{"internalType":"uint256","name":"_increment","type":"uint256"},{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint256","name":"_buffer","type":"uint256"}],"name":"setAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum UniversalBarterDepository.PARAMETER","name":"_parameter","type":"uint8"},{"internalType":"uint256","name":"_input","type":"uint256"}],"name":"setBarterTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staking","type":"address"},{"internalType":"bool","name":"_helper","type":"bool"}],"name":"setStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingHelper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"standardizedDebtRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"terms","outputs":[{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"maxDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useHelper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101406040523480156200001257600080fd5b506040516200467238038062004672833981810160405260a08110156200003857600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156200016757600080fd5b8473ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415620001d957600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200024b57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620002bd57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff166101208173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561010081151560f81b81525050505050505060805160601c60a05160601c60c05160601c60e05160601c6101005160f81c6101205160601c61422d620004456000398061190452806123735280612736525080610dea52806118d65280612342525080611aea528061212b528061281152508061182c5280611caa5280611f7a528061202b5250806109a752806119405280611a195280611ce65280611ef75280611f3e528061206852806123af52806127b552508061214d528061275c52806129365280612c275280612ce95280612e4c5280612f3352806130d2525061422d6000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806377b8189511610125578063c3f2c484116100ad578063e0176de81161007c578063e0176de8146108f9578063e222ad7814610917578063e392a2621461094b578063f5c2ab5b14610969578063fc7b9c181461098757610211565b8063c3f2c484146107dd578063cea55f571461084a578063d4d863ce14610868578063d5025625146108b857610211565b80638dbdbe6d116100f45780638dbdbe6d1461068a578063904b3ece146106f65780639560930414610714578063a4f3bcdf1461074f578063b4abccba1461078357610211565b806377b81895146105c25780637927ebf8146105f65780637e8e4f96146106385780637ed6943d1461065657610211565b80632985a1ae116101a85780634cf088d9116101775780634cf088d9146104da578063507930ec1461050e5780635a96ac0a1461056657806361d027b314610570578063759076e5146105a457610211565b80632985a1ae146103d05780632f3f470a1461043a578063451ee4a11461045a57806346f68ee91461049657610211565b80631a3d0068116101e45780631a3d0068146102e05780631b3da90a1461032e5780631feed31f1461034e57806321584044146103b257610211565b8063016a42841461021657806301b88ee81461024a5780630505c8c9146102a2578063089208d8146102d6575b600080fd5b61021e6109a5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61028c6004803603602081101561026057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109c9565b6040518082815260200191505060405180910390f35b6102aa610a60565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102de610a89565b005b61032c600480360360808110156102f657600080fd5b81019080803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610c08565b005b610336610de8565b60405180821515815260200191505060405180910390f35b61039c6004803603604081101561036457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050610e0c565b6040518082815260200191505060405180910390f35b6103ba611124565b6040518082815260200191505060405180910390f35b610438600480360360e08110156103e657600080fd5b810190808035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919050505061118b565b005b61044261132f565b60405180821515815260200191505060405180910390f35b610462611342565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6104d8600480360360208110156104ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611373565b005b6104e2611578565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105506004803603602081101561052457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061159e565b6040518082815260200191505060405180910390f35b61056e611684565b005b61057861182a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105ac61184e565b6040518082815260200191505060405180910390f35b6105ca611871565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106226004803603602081101561060c57600080fd5b8101908080359060200190929190505050611897565b6040518082815260200191505060405180910390f35b6106406118d2565b6040518082815260200191505060405180910390f35b61065e611ae8565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106e0600480360360608110156106a057600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b0c565b6040518082815260200191505060405180910390f35b6106fe61233e565b6040518082815260200191505060405180910390f35b61074d6004803603604081101561072a57600080fd5b81019080803560ff1690602001909291908035906020019092919050505061248c565b005b610757612734565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107c56004803603602081101561079957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612758565b60405180821515815260200191505060405180910390f35b61081f600480360360208110156107f357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612901565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b610852612931565b6040518082815260200191505060405180910390f35b6108b66004803603604081101561087e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612a26565b005b6108c0612be9565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b610901612c13565b6040518082815260200191505060405180910390f35b61091f612ce7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610953612d0b565b6040518082815260200191505060405180910390f35b610971612d67565b6040518082815260200191505060405180910390f35b61098f612d6d565b6040518082815260200191505060405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806109d58361159e565b90506000600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506127108210610a2f57809250610a59565b610a56612710610a488484612d7390919063ffffffff16565b612df990919063ffffffff16565b92505b5050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b610cf76103e8610ce96101f4600460000154612d7390919063ffffffff16565b612df990919063ffffffff16565b831115610d6c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e6372656d656e7420746f6f206c617267650000000000000000000000000081525060200191505060405180910390fd5b6040518060a00160405280851515815260200184815260200183815260200182815260200143815250600a60008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610e1661405a565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000610e958561159e565b90506127108110610f7557600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550508473ffffffffffffffffffffffffffffffffffffffff167f573cc809c1418bedd0228784600428eeaeeb5293feb9f3e227b008fb626e669d83600001516000604051808381526020018281526020019250505060405180910390a2610f6c85858460000151612e43565b9250505061111e565b6000610fa2612710610f94848660000151612d7390919063ffffffff16565b612df990919063ffffffff16565b90506040518060800160405280610fc683866000015161329a90919063ffffffff16565b8152602001610ff8610fe586604001514361329a90919063ffffffff16565b866020015161329a90919063ffffffff16565b81526020014381526020018460600151815250600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050508573ffffffffffffffffffffffffffffffffffffffff167f573cc809c1418bedd0228784600428eeaeeb5293feb9f3e227b008fb626e669d82600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808381526020018281526020019250505060405180910390a2611118868683612e43565b93505050505b92915050565b600061117062989680611162633b9aca00611154611140612931565b600460000154612d7390919063ffffffff16565b6132e490919063ffffffff16565b612df990919063ffffffff16565b90506004600201548110156111885760046002015490505b90565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461124c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600460000154146112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140da6022913960400191505060405180910390fd5b6040518060c00160405280888152602001878152602001868152602001858152602001848152602001838152506004600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050806010819055504360118190555050505050505050565b600360149054906101000a900460ff1681565b600a8060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611434576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806140b46026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006115a861405a565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050600061163582604001514361329a90919063ffffffff16565b90506000826020015190506000811115611677576116708161166261271085612d7390919063ffffffff16565b612df990919063ffffffff16565b935061167c565b600093505b505050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461172a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140fc6022913960400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d60405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061186c61185b612d0b565b60105461329a90919063ffffffff16565b905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006118cb662386f26fc100006118bd6118b8856118b3611124565b61336c565b61364d565b612df990919063ffffffff16565b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000015611a0f57611a0860646119fa7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119a957600080fd5b505afa1580156119bd573d6000803e3d6000fd5b505050506040513d60208110156119d357600080fd5b81019080805190602001909291905050506119ec611124565b612d7390919063ffffffff16565b612df990919063ffffffff16565b9050611ae5565b611ae26064611ad47f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611a7d57600080fd5b505afa158015611a91573d6000803e3d6000fd5b505050506040513d6020811015611aa757600080fd5b810190808051906020019092919050505060ff16600a0a611ac6611124565b612d7390919063ffffffff16565b612df990919063ffffffff16565b90505b90565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611bb8613689565b6004600501546010541115611c35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b6000611c3f6118d2565b90506000611c4b6136b4565b905080851015611ca6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806141876023913960400191505060405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631eec5a9a7f0000000000000000000000000000000000000000000000000000000000000000896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b158015611d5757600080fd5b505afa158015611d6b573d6000803e3d6000fd5b505050506040513d6020811015611d8157600080fd5b810190808051906020019092919050505090506000611d9f82611897565b905062989680811015611e1a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f42617274657220746f6f20736d616c6c0000000000000000000000000000000081525060200191505060405180910390fd5b611e22612c13565b811115611e97576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f42617274657220746f6f206c617267650000000000000000000000000000000081525060200191505060405180910390fd5b6000611ec4612710611eb6600480015485612d7390919063ffffffff16565b612df990919063ffffffff16565b90506000611eed82611edf858761329a90919063ffffffff16565b61329a90919063ffffffff16565b9050611f3c33308c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16613739909392919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008c6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611fed57600080fd5b505af1158015612001573d6000803e3d6000fd5b505050506040513d602081101561201757600080fd5b8101908080519060200190929190505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bc157ac18b7f0000000000000000000000000000000000000000000000000000000000000000846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156120e257600080fd5b505af11580156120f6573d6000803e3d6000fd5b505050506040513d602081101561210c57600080fd5b81019080805190602001909291905050505060008214612192576121917f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166137fa9092919063ffffffff16565b5b6121a7846010546132e490919063ffffffff16565b601081905550604051806080016040528061220d85600f60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546132e490919063ffffffff16565b8152602001600460010154815260200143815260200187815250600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050856122aa600460010154436132e490919063ffffffff16565b847fe1c6db3a3f1e8ca4048b70664ff374b93f37c0e11775191533fcd907ca4d27228d6040518082815260200191505060405180910390a46122ea612931565b6122f26136b4565b6122fa6118d2565b7f0f9b7b5fb654f612d5147069dfd0ced17bbd5971aa6856cf21135b8384aac8eb60405160405180910390a461232e61389c565b8296505050505050509392505050565b60007f00000000000000000000000000000000000000000000000000000000000000001561247e57612477633b9aca006124697f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561241857600080fd5b505afa15801561242c573d6000803e3d6000fd5b505050506040513d602081101561244257600080fd5b810190808051906020019092919050505061245b612931565b612d7390919063ffffffff16565b612df990919063ffffffff16565b9050612489565b612486612931565b90505b90565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461254d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600381111561255a57fe5b82600381111561256657fe5b14156125d65761e40a8110156125c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806141aa6024913960400191505060405180910390fd5b80600460010181905550612730565b600160038111156125e357fe5b8260038111156125ef57fe5b141561267c576103e881111561266d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5061796f75742063616e6e6f742062652061626f766520312070657263656e7481525060200191505060405180910390fd5b8060046003018190555061272f565b6002600381111561268957fe5b82600381111561269557fe5b1415612704576127108111156126f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806141446022913960400191505060405180910390fd5b80600480018190555061272e565b60038081111561271057fe5b82600381111561271c57fe5b141561272d57806004600501819055505b5b5b5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127b357600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561280c57600080fd5b6128f87f00000000000000000000000000000000000000000000000000000000000000008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561289757600080fd5b505afa1580156128ab573d6000803e3d6000fd5b505050506040513d60208110156128c157600080fd5b81019080805190602001909291905050508473ffffffffffffffffffffffffffffffffffffffff166137fa9092919063ffffffff16565b60019050919050565b600f6020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561299a57600080fd5b505afa1580156129ae573d6000803e3d6000fd5b505050506040513d60208110156129c457600080fd5b81019080805190602001909291905050509050612a20670de0b6b3a7640000612a12612a0d612a07633b9aca006129f961184e565b612d7390919063ffffffff16565b8561336c565b61364d565b612df990919063ffffffff16565b91505090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ae7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b2157600080fd5b8015612b88576001600360146101000a81548160ff02191690831515021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612be5565b6000600360146101000a81548160ff02191690831515021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b60048060000154908060010154908060020154908060030154908060040154908060050154905086565b6000612ce2620186a0612cd46004600301547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c8b57600080fd5b505afa158015612c9f573d6000803e3d6000fd5b505050506040513d6020811015612cb557600080fd5b8101908080519060200190929190505050612d7390919063ffffffff16565b612df990919063ffffffff16565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080612d236011544361329a90919063ffffffff16565b9050612d51600460010154612d4383601054612d7390919063ffffffff16565b612df990919063ffffffff16565b9150601054821115612d635760105491505b5090565b60115481565b60105481565b600080831415612d865760009050612df3565b6000828402905082848281612d9757fe5b0414612dee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806141666021913960400191505060405180910390fd5b809150505b92915050565b6000612e3b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a02565b905092915050565b600082612f1c577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612edb57600080fd5b505af1158015612eef573d6000803e3d6000fd5b505050506040513d6020811015612f0557600080fd5b810190808051906020019092919050505050613290565b600360149054906101000a900460ff16156130d0577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612fe457600080fd5b505af1158015612ff8573d6000803e3d6000fd5b505050506040513d602081101561300e57600080fd5b810190808051906020019092919050505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b1580156130b357600080fd5b505af11580156130c7573d6000803e3d6000fd5b5050505061328f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561318357600080fd5b505af1158015613197573d6000803e3d6000fd5b505050506040513d60208110156131ad57600080fd5b810190808051906020019092919050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15801561325257600080fd5b505af1158015613266573d6000803e3d6000fd5b505050506040513d602081101561327c57600080fd5b8101908080519060200190929190505050505b5b8190509392505050565b60006132dc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613ac8565b905092915050565b600080828401905083811015613362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b613374614082565b600082116133cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061411e6026913960400191505060405180910390fd5b600083141561340b57604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509050613647565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff16831161354457600082607060ff1685901b8161345857fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681111561350f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250915050613647565b6000613560846e01000000000000000000000000000085613b88565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115613616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168161368157fe5b049050919050565b6136a5613694612d0b565b60105461329a90919063ffffffff16565b60108190555043601181905550565b6000613700629896806136f2633b9aca006136e46136d0612931565b600460000154612d7390919063ffffffff16565b6132e490919063ffffffff16565b612df990919063ffffffff16565b905060046002015481101561371c576004600201549050613736565b6000600460020154146137355760006004600201819055505b5b90565b6137f4846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c4a565b50505050565b6138978363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c4a565b505050565b60006138bb600a60030154600a600401546132e490919063ffffffff16565b90506000600a60010154141580156138d35750804310155b156139ff5760006004600001549050600a60000160009054906101000a900460ff161561394257613917600a600101546004600001546132e490919063ffffffff16565b600460000181905550600a600201546004600001541061393d576000600a600101819055505b613986565b61395f600a6001015460046000015461329a90919063ffffffff16565b600460000181905550600a6002015460046000015411613985576000600a600101819055505b5b43600a600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600460000154600a60010154600a60000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b60008083118290613aae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613a73578082015181840152602081019050613a58565b50505050905090810190601f168015613aa05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613aba57fe5b049050809150509392505050565b6000838311158290613b75576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b3a578082015181840152602081019050613b1f565b50505050905090810190601f168015613b675780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000806000613b978686613d39565b9150915060008480613ba557fe5b868809905082811115613bb9576001820391505b8083039250848210613c33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b613c3e838387613d8c565b93505050509392505050565b6060613cac826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613e299092919063ffffffff16565b9050600081511115613d3457808060200190516020811015613ccd57600080fd5b8101908080519060200190929190505050613d33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806141ce602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80613d6657fe5b84860990508385029250828103915082811015613d84576001820391505b509250929050565b6000808260000383169050808381613da057fe5b049250808581613dac57fe5b0494506001818260000381613dbd57fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b6060613e388484600085613e41565b90509392505050565b6060613e4c85614047565b613ebe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613f0e5780518252602082019150602081019050602083039250613eeb565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613f70576040519150601f19603f3d011682016040523d82523d6000602084013e613f75565b606091505b50915091508115613f8a57809250505061403f565b600081511115613f9d5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614004578082015181840152602081019050613fe9565b50505050905090810190601f1680156140315780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737342617274657273206d75737420626520696e697469616c697a65642066726f6d20304f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f41746c61735465616d206665652063616e6e6f7420657863656564207061796f7574536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212208233b5426e82528dcda7a188a6917db4f7624a429e19ecac551aad354d1cc09064736f6c6343000705003300000000000000000000000088536c9b2c4701b8db824e6a16829d5b5eb84440000000000000000000000000cb8e690062050617c5921a0da7df30a1a72d76fe0000000000000000000000008739f0eef3163c3db7b994d0e301bc375d757af6000000000000000000000000cc3241d9f9a534b715cc65d7dc80a235a39b5394000000000000000000000000e23912e7982584a6b1e8212530d32c05678b1eac
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102115760003560e01c806377b8189511610125578063c3f2c484116100ad578063e0176de81161007c578063e0176de8146108f9578063e222ad7814610917578063e392a2621461094b578063f5c2ab5b14610969578063fc7b9c181461098757610211565b8063c3f2c484146107dd578063cea55f571461084a578063d4d863ce14610868578063d5025625146108b857610211565b80638dbdbe6d116100f45780638dbdbe6d1461068a578063904b3ece146106f65780639560930414610714578063a4f3bcdf1461074f578063b4abccba1461078357610211565b806377b81895146105c25780637927ebf8146105f65780637e8e4f96146106385780637ed6943d1461065657610211565b80632985a1ae116101a85780634cf088d9116101775780634cf088d9146104da578063507930ec1461050e5780635a96ac0a1461056657806361d027b314610570578063759076e5146105a457610211565b80632985a1ae146103d05780632f3f470a1461043a578063451ee4a11461045a57806346f68ee91461049657610211565b80631a3d0068116101e45780631a3d0068146102e05780631b3da90a1461032e5780631feed31f1461034e57806321584044146103b257610211565b8063016a42841461021657806301b88ee81461024a5780630505c8c9146102a2578063089208d8146102d6575b600080fd5b61021e6109a5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61028c6004803603602081101561026057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109c9565b6040518082815260200191505060405180910390f35b6102aa610a60565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102de610a89565b005b61032c600480360360808110156102f657600080fd5b81019080803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610c08565b005b610336610de8565b60405180821515815260200191505060405180910390f35b61039c6004803603604081101561036457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050610e0c565b6040518082815260200191505060405180910390f35b6103ba611124565b6040518082815260200191505060405180910390f35b610438600480360360e08110156103e657600080fd5b810190808035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919050505061118b565b005b61044261132f565b60405180821515815260200191505060405180910390f35b610462611342565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b6104d8600480360360208110156104ac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611373565b005b6104e2611578565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105506004803603602081101561052457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061159e565b6040518082815260200191505060405180910390f35b61056e611684565b005b61057861182a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6105ac61184e565b6040518082815260200191505060405180910390f35b6105ca611871565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106226004803603602081101561060c57600080fd5b8101908080359060200190929190505050611897565b6040518082815260200191505060405180910390f35b6106406118d2565b6040518082815260200191505060405180910390f35b61065e611ae8565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6106e0600480360360608110156106a057600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b0c565b6040518082815260200191505060405180910390f35b6106fe61233e565b6040518082815260200191505060405180910390f35b61074d6004803603604081101561072a57600080fd5b81019080803560ff1690602001909291908035906020019092919050505061248c565b005b610757612734565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107c56004803603602081101561079957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612758565b60405180821515815260200191505060405180910390f35b61081f600480360360208110156107f357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612901565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b610852612931565b6040518082815260200191505060405180910390f35b6108b66004803603604081101561087e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612a26565b005b6108c0612be9565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b610901612c13565b6040518082815260200191505060405180910390f35b61091f612ce7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610953612d0b565b6040518082815260200191505060405180910390f35b610971612d67565b6040518082815260200191505060405180910390f35b61098f612d6d565b6040518082815260200191505060405180910390f35b7f000000000000000000000000cb8e690062050617c5921a0da7df30a1a72d76fe81565b6000806109d58361159e565b90506000600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506127108210610a2f57809250610a59565b610a56612710610a488484612d7390919063ffffffff16565b612df990919063ffffffff16565b92505b5050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b610cf76103e8610ce96101f4600460000154612d7390919063ffffffff16565b612df990919063ffffffff16565b831115610d6c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e6372656d656e7420746f6f206c617267650000000000000000000000000081525060200191505060405180910390fd5b6040518060a00160405280851515815260200184815260200183815260200182815260200143815250600a60008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505050505050565b7f000000000000000000000000000000000000000000000000000000000000000181565b6000610e1661405a565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090506000610e958561159e565b90506127108110610f7557600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550508473ffffffffffffffffffffffffffffffffffffffff167f573cc809c1418bedd0228784600428eeaeeb5293feb9f3e227b008fb626e669d83600001516000604051808381526020018281526020019250505060405180910390a2610f6c85858460000151612e43565b9250505061111e565b6000610fa2612710610f94848660000151612d7390919063ffffffff16565b612df990919063ffffffff16565b90506040518060800160405280610fc683866000015161329a90919063ffffffff16565b8152602001610ff8610fe586604001514361329a90919063ffffffff16565b866020015161329a90919063ffffffff16565b81526020014381526020018460600151815250600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050508573ffffffffffffffffffffffffffffffffffffffff167f573cc809c1418bedd0228784600428eeaeeb5293feb9f3e227b008fb626e669d82600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808381526020018281526020019250505060405180910390a2611118868683612e43565b93505050505b92915050565b600061117062989680611162633b9aca00611154611140612931565b600460000154612d7390919063ffffffff16565b6132e490919063ffffffff16565b612df990919063ffffffff16565b90506004600201548110156111885760046002015490505b90565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461124c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600460000154146112aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140da6022913960400191505060405180910390fd5b6040518060c00160405280888152602001878152602001868152602001858152602001848152602001838152506004600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050806010819055504360118190555050505050505050565b600360149054906101000a900460ff1681565b600a8060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611434576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806140b46026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006115a861405a565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050600061163582604001514361329a90919063ffffffff16565b90506000826020015190506000811115611677576116708161166261271085612d7390919063ffffffff16565b612df990919063ffffffff16565b935061167c565b600093505b505050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461172a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806140fc6022913960400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d60405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f0000000000000000000000008739f0eef3163c3db7b994d0e301bc375d757af681565b600061186c61185b612d0b565b60105461329a90919063ffffffff16565b905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006118cb662386f26fc100006118bd6118b8856118b3611124565b61336c565b61364d565b612df990919063ffffffff16565b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000115611a0f57611a0860646119fa7f000000000000000000000000e23912e7982584a6b1e8212530d32c05678b1eac73ffffffffffffffffffffffffffffffffffffffff166332da80a37f000000000000000000000000cb8e690062050617c5921a0da7df30a1a72d76fe6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119a957600080fd5b505afa1580156119bd573d6000803e3d6000fd5b505050506040513d60208110156119d357600080fd5b81019080805190602001909291905050506119ec611124565b612d7390919063ffffffff16565b612df990919063ffffffff16565b9050611ae5565b611ae26064611ad47f000000000000000000000000cb8e690062050617c5921a0da7df30a1a72d76fe73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611a7d57600080fd5b505afa158015611a91573d6000803e3d6000fd5b505050506040513d6020811015611aa757600080fd5b810190808051906020019092919050505060ff16600a0a611ac6611124565b612d7390919063ffffffff16565b612df990919063ffffffff16565b90505b90565b7f000000000000000000000000cc3241d9f9a534b715cc65d7dc80a235a39b539481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611bb8613689565b6004600501546010541115611c35576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b6000611c3f6118d2565b90506000611c4b6136b4565b905080851015611ca6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806141876023913960400191505060405180910390fd5b60007f0000000000000000000000008739f0eef3163c3db7b994d0e301bc375d757af673ffffffffffffffffffffffffffffffffffffffff16631eec5a9a7f000000000000000000000000cb8e690062050617c5921a0da7df30a1a72d76fe896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b158015611d5757600080fd5b505afa158015611d6b573d6000803e3d6000fd5b505050506040513d6020811015611d8157600080fd5b810190808051906020019092919050505090506000611d9f82611897565b905062989680811015611e1a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f42617274657220746f6f20736d616c6c0000000000000000000000000000000081525060200191505060405180910390fd5b611e22612c13565b811115611e97576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f42617274657220746f6f206c617267650000000000000000000000000000000081525060200191505060405180910390fd5b6000611ec4612710611eb6600480015485612d7390919063ffffffff16565b612df990919063ffffffff16565b90506000611eed82611edf858761329a90919063ffffffff16565b61329a90919063ffffffff16565b9050611f3c33308c7f000000000000000000000000cb8e690062050617c5921a0da7df30a1a72d76fe73ffffffffffffffffffffffffffffffffffffffff16613739909392919063ffffffff16565b7f000000000000000000000000cb8e690062050617c5921a0da7df30a1a72d76fe73ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000008739f0eef3163c3db7b994d0e301bc375d757af68c6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611fed57600080fd5b505af1158015612001573d6000803e3d6000fd5b505050506040513d602081101561201757600080fd5b8101908080519060200190929190505050507f0000000000000000000000008739f0eef3163c3db7b994d0e301bc375d757af673ffffffffffffffffffffffffffffffffffffffff1663bc157ac18b7f000000000000000000000000cb8e690062050617c5921a0da7df30a1a72d76fe846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156120e257600080fd5b505af11580156120f6573d6000803e3d6000fd5b505050506040513d602081101561210c57600080fd5b81019080805190602001909291905050505060008214612192576121917f000000000000000000000000cc3241d9f9a534b715cc65d7dc80a235a39b5394837f00000000000000000000000088536c9b2c4701b8db824e6a16829d5b5eb8444073ffffffffffffffffffffffffffffffffffffffff166137fa9092919063ffffffff16565b5b6121a7846010546132e490919063ffffffff16565b601081905550604051806080016040528061220d85600f60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546132e490919063ffffffff16565b8152602001600460010154815260200143815260200187815250600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050856122aa600460010154436132e490919063ffffffff16565b847fe1c6db3a3f1e8ca4048b70664ff374b93f37c0e11775191533fcd907ca4d27228d6040518082815260200191505060405180910390a46122ea612931565b6122f26136b4565b6122fa6118d2565b7f0f9b7b5fb654f612d5147069dfd0ced17bbd5971aa6856cf21135b8384aac8eb60405160405180910390a461232e61389c565b8296505050505050509392505050565b60007f00000000000000000000000000000000000000000000000000000000000000011561247e57612477633b9aca006124697f000000000000000000000000e23912e7982584a6b1e8212530d32c05678b1eac73ffffffffffffffffffffffffffffffffffffffff166332da80a37f000000000000000000000000cb8e690062050617c5921a0da7df30a1a72d76fe6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561241857600080fd5b505afa15801561242c573d6000803e3d6000fd5b505050506040513d602081101561244257600080fd5b810190808051906020019092919050505061245b612931565b612d7390919063ffffffff16565b612df990919063ffffffff16565b9050612489565b612486612931565b90505b90565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461254d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600381111561255a57fe5b82600381111561256657fe5b14156125d65761e40a8110156125c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806141aa6024913960400191505060405180910390fd5b80600460010181905550612730565b600160038111156125e357fe5b8260038111156125ef57fe5b141561267c576103e881111561266d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5061796f75742063616e6e6f742062652061626f766520312070657263656e7481525060200191505060405180910390fd5b8060046003018190555061272f565b6002600381111561268957fe5b82600381111561269557fe5b1415612704576127108111156126f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806141446022913960400191505060405180910390fd5b80600480018190555061272e565b60038081111561271057fe5b82600381111561271c57fe5b141561272d57806004600501819055505b5b5b5b5050565b7f000000000000000000000000e23912e7982584a6b1e8212530d32c05678b1eac81565b60007f00000000000000000000000088536c9b2c4701b8db824e6a16829d5b5eb8444073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127b357600080fd5b7f000000000000000000000000cb8e690062050617c5921a0da7df30a1a72d76fe73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561280c57600080fd5b6128f87f000000000000000000000000cc3241d9f9a534b715cc65d7dc80a235a39b53948373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561289757600080fd5b505afa1580156128ab573d6000803e3d6000fd5b505050506040513d60208110156128c157600080fd5b81019080805190602001909291905050508473ffffffffffffffffffffffffffffffffffffffff166137fa9092919063ffffffff16565b60019050919050565b600f6020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6000807f00000000000000000000000088536c9b2c4701b8db824e6a16829d5b5eb8444073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561299a57600080fd5b505afa1580156129ae573d6000803e3d6000fd5b505050506040513d60208110156129c457600080fd5b81019080805190602001909291905050509050612a20670de0b6b3a7640000612a12612a0d612a07633b9aca006129f961184e565b612d7390919063ffffffff16565b8561336c565b61364d565b612df990919063ffffffff16565b91505090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ae7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b2157600080fd5b8015612b88576001600360146101000a81548160ff02191690831515021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612be5565b6000600360146101000a81548160ff02191690831515021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b60048060000154908060010154908060020154908060030154908060040154908060050154905086565b6000612ce2620186a0612cd46004600301547f00000000000000000000000088536c9b2c4701b8db824e6a16829d5b5eb8444073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c8b57600080fd5b505afa158015612c9f573d6000803e3d6000fd5b505050506040513d6020811015612cb557600080fd5b8101908080519060200190929190505050612d7390919063ffffffff16565b612df990919063ffffffff16565b905090565b7f00000000000000000000000088536c9b2c4701b8db824e6a16829d5b5eb8444081565b600080612d236011544361329a90919063ffffffff16565b9050612d51600460010154612d4383601054612d7390919063ffffffff16565b612df990919063ffffffff16565b9150601054821115612d635760105491505b5090565b60115481565b60105481565b600080831415612d865760009050612df3565b6000828402905082848281612d9757fe5b0414612dee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806141666021913960400191505060405180910390fd5b809150505b92915050565b6000612e3b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a02565b905092915050565b600082612f1c577f00000000000000000000000088536c9b2c4701b8db824e6a16829d5b5eb8444073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612edb57600080fd5b505af1158015612eef573d6000803e3d6000fd5b505050506040513d6020811015612f0557600080fd5b810190808051906020019092919050505050613290565b600360149054906101000a900460ff16156130d0577f00000000000000000000000088536c9b2c4701b8db824e6a16829d5b5eb8444073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612fe457600080fd5b505af1158015612ff8573d6000803e3d6000fd5b505050506040513d602081101561300e57600080fd5b810190808051906020019092919050505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b1580156130b357600080fd5b505af11580156130c7573d6000803e3d6000fd5b5050505061328f565b7f00000000000000000000000088536c9b2c4701b8db824e6a16829d5b5eb8444073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561318357600080fd5b505af1158015613197573d6000803e3d6000fd5b505050506040513d60208110156131ad57600080fd5b810190808051906020019092919050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15801561325257600080fd5b505af1158015613266573d6000803e3d6000fd5b505050506040513d602081101561327c57600080fd5b8101908080519060200190929190505050505b5b8190509392505050565b60006132dc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613ac8565b905092915050565b600080828401905083811015613362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b613374614082565b600082116133cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061411e6026913960400191505060405180910390fd5b600083141561340b57604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509050613647565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff16831161354457600082607060ff1685901b8161345857fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681111561350f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815250915050613647565b6000613560846e01000000000000000000000000000085613b88565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16811115613616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168161368157fe5b049050919050565b6136a5613694612d0b565b60105461329a90919063ffffffff16565b60108190555043601181905550565b6000613700629896806136f2633b9aca006136e46136d0612931565b600460000154612d7390919063ffffffff16565b6132e490919063ffffffff16565b612df990919063ffffffff16565b905060046002015481101561371c576004600201549050613736565b6000600460020154146137355760006004600201819055505b5b90565b6137f4846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c4a565b50505050565b6138978363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c4a565b505050565b60006138bb600a60030154600a600401546132e490919063ffffffff16565b90506000600a60010154141580156138d35750804310155b156139ff5760006004600001549050600a60000160009054906101000a900460ff161561394257613917600a600101546004600001546132e490919063ffffffff16565b600460000181905550600a600201546004600001541061393d576000600a600101819055505b613986565b61395f600a6001015460046000015461329a90919063ffffffff16565b600460000181905550600a6002015460046000015411613985576000600a600101819055505b5b43600a600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600460000154600a60010154600a60000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b60008083118290613aae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613a73578082015181840152602081019050613a58565b50505050905090810190601f168015613aa05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613aba57fe5b049050809150509392505050565b6000838311158290613b75576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b3a578082015181840152602081019050613b1f565b50505050905090810190601f168015613b675780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000806000613b978686613d39565b9150915060008480613ba557fe5b868809905082811115613bb9576001820391505b8083039250848210613c33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b613c3e838387613d8c565b93505050509392505050565b6060613cac826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613e299092919063ffffffff16565b9050600081511115613d3457808060200190516020811015613ccd57600080fd5b8101908080519060200190929190505050613d33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806141ce602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80613d6657fe5b84860990508385029250828103915082811015613d84576001820391505b509250929050565b6000808260000383169050808381613da057fe5b049250808581613dac57fe5b0494506001818260000381613dbd57fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b6060613e388484600085613e41565b90509392505050565b6060613e4c85614047565b613ebe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613f0e5780518252602082019150602081019050602083039250613eeb565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613f70576040519150601f19603f3d011682016040523d82523d6000602084013e613f75565b606091505b50915091508115613f8a57809250505061403f565b600081511115613f9d5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614004578082015181840152602081019050613fe9565b50505050905090810190601f1680156140315780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737342617274657273206d75737420626520696e697469616c697a65642066726f6d20304f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f41746c61735465616d206665652063616e6e6f7420657863656564207061796f7574536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212208233b5426e82528dcda7a188a6917db4f7624a429e19ecac551aad354d1cc09064736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000088536c9b2c4701b8db824e6a16829d5b5eb84440000000000000000000000000cb8e690062050617c5921a0da7df30a1a72d76fe0000000000000000000000008739f0eef3163c3db7b994d0e301bc375d757af6000000000000000000000000cc3241d9f9a534b715cc65d7dc80a235a39b5394000000000000000000000000e23912e7982584a6b1e8212530d32c05678b1eac
-----Decoded View---------------
Arg [0] : _USV (address): 0x88536C9B2C4701b8dB824e6A16829D5B5Eb84440
Arg [1] : _principle (address): 0xcb8E690062050617c5921a0Da7dF30A1a72D76Fe
Arg [2] : _treasury (address): 0x8739f0EeF3163C3db7b994d0e301BC375d757aF6
Arg [3] : _AtlasTeam (address): 0xCC3241d9F9A534b715CC65d7DC80a235A39b5394
Arg [4] : _barterCalculator (address): 0xE23912E7982584A6B1E8212530D32C05678b1eac
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000088536c9b2c4701b8db824e6a16829d5b5eb84440
Arg [1] : 000000000000000000000000cb8e690062050617c5921a0da7df30a1a72d76fe
Arg [2] : 0000000000000000000000008739f0eef3163c3db7b994d0e301bc375d757af6
Arg [3] : 000000000000000000000000cc3241d9f9a534b715cc65d7dc80a235a39b5394
Arg [4] : 000000000000000000000000e23912e7982584a6b1e8212530d32c05678b1eac
Deployed Bytecode Sourcemap
21298:17481:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22025:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37910:402;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;693:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;918:158;;;:::i;:::-;;26935:467;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22254:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30532:1224;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34558:263;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25096:673;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22571:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22658:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1084:260;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22440:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37301:437;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1356:221;;;:::i;:::-;;22097:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36644:106;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22493:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34288:163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35404:343;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22174:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28084:2295;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36264:281;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26017:722;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22357:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;38502:274;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22724:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35871:270;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27535:318;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22601:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34017:140;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21953:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36852:286;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22907:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22823;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22025:34;;;:::o;37910:402::-;37982:19;38015:18;38036:30;38054:10;38036:16;:30::i;:::-;38015:51;;38077:11;38091:10;:24;38103:10;38091:24;;;;;;;;;;;;;;;:31;;;38077:45;;38157:5;38140:13;:22;38135:170;;38197:6;38180:23;;38135:170;;;38253:40;38286:5;38253:27;38265:13;38253:6;:10;;:27;;;;:::i;:::-;:31;;:40;;;;:::i;:::-;38236:57;;38135:170;37910:402;;;;;:::o;693:89::-;741:7;768:6;;;;;;;;;;;761:13;;693:89;:::o;918:158::-;842:10;832:20;;:6;;;;;;;;;;:20;;;823:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1034:1:::1;1001:37;;1018:6;::::0;::::1;;;;;;;;1001:37;;;;;;;;;;;;1066:1;1049:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;918:158::o:0;26935:467::-;842:10;832:20;;:6;;;;;;;;;;:20;;;823:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27122:44:::1;27160:4;27122:32;27149:3;27122:5;:21;;;:25;;:32;;;;:::i;:::-;:36;;:44;;;;:::i;:::-;27108:10;:58;;27099:92;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27217:177;;;;;;;;27244:9;27217:177;;;;;;27274:10;27217:177;;;;27307:7;27217:177;;;;27337:7;27217:177;;;;27370:12;27217:177;;::::0;27204:10:::1;:190;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26935:467:::0;;;;:::o;22254:39::-;;;:::o;30532:1224::-;30602:4;30628:18;;:::i;:::-;30649:10;:24;30661:10;30649:24;;;;;;;;;;;;;;;30628:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30684:18;30705:30;30723:10;30705:16;:30::i;:::-;30684:51;;30830:5;30813:13;:22;30808:941;;30879:10;:24;30891:10;30879:24;;;;;;;;;;;;;;;;30872:31;;;;;;;;;;;;;;;;;;;;;;;;;;30959:10;30943:44;;;30971:4;:11;;;30984:1;30943:44;;;;;;;;;;;;;;;;;;;;;;;;31029:46;31042:10;31054:6;31062:4;:11;;;31029;:46::i;:::-;31022:53;;;;;;30808:941;31194:11;31208:45;31246:5;31208:32;31225:13;31208:4;:11;;;:15;;:32;;;;:::i;:::-;:36;;:45;;;;:::i;:::-;31194:59;;31340:243;;;;;;;;31374:25;31391:6;31374:4;:11;;;:15;;:25;;;;:::i;:::-;31340:243;;;;31427:54;31445:34;31463:4;:14;;;31445:12;:16;;:34;;;;:::i;:::-;31427:4;:12;;;:16;;:54;;;;:::i;:::-;31340:243;;;;31511:12;31340:243;;;;31553:4;:14;;;31340:243;;;31313:10;:24;31325:10;31313:24;;;;;;;;;;;;;;;:270;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31621:10;31605:69;;;31633:6;31641:10;:24;31653:10;31641:24;;;;;;;;;;;;;;;:31;;;31605:69;;;;;;;;;;;;;;;;;;;;;;;;31696:41;31709:10;31721:6;31729;31696:11;:41::i;:::-;31689:48;;;;;30532:1224;;;;;:::o;34558:263::-;34603:11;34645:69;34709:3;34645:58;34691:10;34645:40;34672:11;:9;:11::i;:::-;34645:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:58;;;;:::i;:::-;:62;;:69;;;;:::i;:::-;34636:78;;34739:5;:18;;;34730:6;:27;34725:89;;;34784:5;:18;;;34775:27;;34725:89;34558:263;:::o;25096:673::-;842:10;832:20;;:6;;;;;;;;;;:20;;;823:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25390:1:::1;25365:5;:21;;;:26;25356:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25450:241;;;;;;;;25489:16;25450:241;;;;25533:12;25450:241;;;;25574:13;25450:241;;;;25613:10;25450:241;;;;25643:4;25450:241;;;;25671:8;25450:241;;::::0;25442:5:::1;:249;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25714:12;25702:9;:24;;;;25749:12;25737:9;:24;;;;25096:673:::0;;;;;;;:::o;22571:21::-;;;;;;;;;;;;;:::o;22658:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1084:260::-;842:10;832:20;;:6;;;;;;;;;;:20;;;823:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1207:1:::1;1186:23;;:9;:23;;;;1177:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1293:9;1268:36;;1285:6;::::0;::::1;;;;;;;;1268:36;;;;;;;;;;;;1327:9;1315;;:21;;;;;;;;;;;;;;;;;;1084:260:::0;:::o;22440:22::-;;;;;;;;;;;;;:::o;37301:437::-;37371:19;37404:20;;:::i;:::-;37427:10;:24;37439:10;37427:24;;;;;;;;;;;;;;;37404:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37462:20;37485:36;37503:6;:16;;;37485:12;:16;;:36;;;;:::i;:::-;37462:59;;37532:12;37547:6;:14;;;37532:29;;37589:1;37579:7;:11;37574:157;;;37625:43;37659:7;37625:28;37646:5;37625:15;:19;;:28;;;;:::i;:::-;:32;;:43;;;;:::i;:::-;37608:60;;37574:157;;;37718:1;37701:18;;37574:157;37301:437;;;;;;:::o;1356:221::-;1440:9;;;;;;;;;;;1426:23;;:10;:23;;;1417:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1529:9;;;;;;;;;;;1504:36;;1521:6;;;;;;;;;;1504:36;;;;;;;;;;;;1560:9;;;;;;;;;;;1551:6;;:18;;;;;;;;;;;;;;;;;;1356:221::o;22097:33::-;;;:::o;36644:106::-;36689:4;36714:28;36729:11;:9;:11::i;:::-;36714:9;;:13;;:28;;;;:::i;:::-;36707:35;;36644:106;:::o;22493:28::-;;;;;;;;;;;;;:::o;34288:163::-;34344:4;34369:74;34437:4;34369:62;:44;34390:6;34398:13;:11;:13::i;:::-;34369:19;:44::i;:::-;:60;:62::i;:::-;:66;;:74;;;;:::i;:::-;34362:81;;34288:163;;;:::o;35404:343::-;35454:11;35483:17;35479:261;;;35527:91;35613:3;35527:80;35565:16;35546:46;;;35594:9;35546:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35527:13;:11;:13::i;:::-;:17;;:80;;;;:::i;:::-;:84;;:91;;;;:::i;:::-;35518:100;;35479:261;;;35660:68;35723:3;35660:57;35693:9;35685:28;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35679:36;;:2;:36;35660:13;:11;:13::i;:::-;:17;;:57;;;;:::i;:::-;:61;;:68;;;;:::i;:::-;35651:77;;35479:261;35404:343;:::o;22174:34::-;;;:::o;28084:2295::-;28206:4;28255:1;28233:24;;:10;:24;;;;28224:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28291:11;:9;:11::i;:::-;28335:5;:13;;;28322:9;;:26;;28313:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28395:15;28413:18;:16;:18::i;:::-;28395:36;;28467:16;28486:14;:12;:14::i;:::-;28467:33;;28535:11;28522:9;:24;;28513:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28623:10;28647:8;28636:29;;;28667:9;28678:7;28636:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28623:64;;28699:11;28713:18;28724:5;28713:9;:18::i;:::-;28699:32;;28797:8;28787:6;:18;;28778:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28911:11;:9;:11::i;:::-;28901:6;:21;;28892:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29039:8;29050:36;29079:5;29050:23;29062:5;:9;;;29050:6;:10;;:23;;;;:::i;:::-;:27;;:36;;;;:::i;:::-;29039:47;;29097:11;29111:30;29136:3;29111:19;29122:6;29111:5;:9;;:19;;;;:::i;:::-;:23;;:30;;;;:::i;:::-;29097:44;;29322:74;29360:10;29380:4;29387:7;29330:9;29322:36;;;;:74;;;;;;:::i;:::-;29415:9;29407:27;;;29445:8;29457:7;29407:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29488:8;29477:29;;;29508:7;29517:9;29528:6;29477:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29569:1;29562:3;:8;29557:124;;29624:44;29652:9;29663:3;29632;29624:26;;;;:44;;;;;:::i;:::-;29557:124;29749:22;29764:5;29749:9;;:13;;:22;;;;:::i;:::-;29737:9;:34;;;;29865:203;;;;;;;;29896:45;29933:6;29896:10;:24;29908:10;29896:24;;;;;;;;;;;;;;;:31;;;:35;;:45;;;;:::i;:::-;29865:203;;;;29965:5;:17;;;29865:203;;;;30008:12;29865:203;;;;30046:10;29865:203;;;29838:10;:24;29850:10;29838:24;;;;;;;;;;;;;;;:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30196:10;30157:37;30175:5;:17;;;30157:12;:16;;:37;;;;:::i;:::-;30149:6;30125:83;30140:7;30125:83;;;;;;;;;;;;;;;;;;30280:11;:9;:11::i;:::-;30264:14;:12;:14::i;:::-;30244:18;:16;:18::i;:::-;30224:69;;;;;;;;;;30306:8;:6;:8::i;:::-;30364:6;30357:13;;;;;;;;28084:2295;;;;;:::o;36264:281::-;36321:4;36344:17;36339:199;;;36386:89;36470:3;36386:78;36422:16;36403:46;;;36451:9;36403:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36386:11;:9;:11::i;:::-;:15;;:78;;;;:::i;:::-;:82;;:89;;;;:::i;:::-;36379:96;;;;36339:199;36515:11;:9;:11::i;:::-;36508:18;;36264:281;;:::o;26017:722::-;842:10;832:20;;:6;;;;;;;;;;:20;;;823:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26131:17:::1;26117:31;;;;;;;;:10;:31;;;;;;;;;26112:620;;;26190:5;26180:6;:15;;26171:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26272:6;26252:5;:17;;:26;;;;26112:620;;;26315:16;26301:30;;;;;;;;:10;:30;;;;;;;;;26296:436;;;26373:4;26363:6;:14;;26354:61;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;26448:6;26430:5;:15;;:24;;;;26296:436;;;26491:13;26477:27;;;;;;;;:10;:27;;;;;;;;;26472:260;;;26546:5;26536:6;:15;;26527:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26618:6;26606:5;:9:::0;::::1;:18;;;;26472:260;;;26661:14;26647:28:::0;::::1;;;;;;;:10;:28;;;;;;;;;26642:90;;;26714:6;26698:5;:13;;:22;;;;26642:90;26472:260;26296:436;26112:620;26017:722:::0;;:::o;22357:41::-;;;:::o;38502:274::-;38565:4;38602:3;38592:13;;:6;:13;;;;38583:24;;;;;;38637:9;38627:19;;:6;:19;;;;38618:30;;;;;;38659:87;38690:9;38709:6;38701:26;;;38737:4;38701:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38667:6;38659:29;;;;:87;;;;;:::i;:::-;38764:4;38757:11;;38502:274;;;:::o;22724:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35871:270::-;35914:15;35946:11;35968:3;35960:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35946:41;;36011:122;36127:4;36011:110;:92;36046:24;36065:3;36046:13;:11;:13::i;:::-;:17;;:24;;;;:::i;:::-;36086:6;36011:19;:92::i;:::-;:108;:110::i;:::-;:114;;:122;;;;:::i;:::-;35998:135;;35871:270;;:::o;27535:318::-;842:10;832:20;;:6;;;;;;;;;;:20;;;823:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27651:1:::1;27631:22;;:8;:22;;;;27622:33;;;::::0;::::1;;27671:7;27666:180;;;27708:4;27696:9;;:16;;;;;;;;;;;;;;;;;;27743:8;27727:13;;:24;;;;;;;;;;;;;;;;;;27666:180;;;27796:5;27784:9;;:17;;;;;;;;;;;;;;;;;;27826:8;27816:7;;:18;;;;;;;;;;;;;;;;;;27666:180;27535:318:::0;;:::o;22601:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34017:140::-;34060:4;34085:64;34141:6;34085:50;34118:5;:15;;;34093:3;34085:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:31;;:50;;;;:::i;:::-;:54;;:64;;;;:::i;:::-;34078:71;;34017:140;:::o;21953:28::-;;;:::o;36852:286::-;36895:11;36920:20;36943:29;36961:9;;36943:12;:16;;:29;;;;:::i;:::-;36920:52;;36992:57;37030:5;:17;;;36992:32;37007:15;36992:9;;:13;;:32;;;;:::i;:::-;:36;;:57;;;;:::i;:::-;36983:66;;37074:9;;37065:6;:18;37060:71;;;37110:9;;37101:18;;37060:71;36852:286;;:::o;22907:21::-;;;;:::o;22823:::-;;;;:::o;2143:250::-;2201:7;2230:1;2225;:6;2221:47;;;2255:1;2248:8;;;;2221:47;2280:9;2296:1;2292;:5;2280:17;;2325:1;2320;2316;:5;;;;;;:10;2308:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2384:1;2377:8;;;2143:250;;;;;:::o;2401:132::-;2459:7;2486:39;2490:1;2493;2486:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;2479:46;;2401:132;;;;:::o;31986:690::-;32075:4;32099:6;32093:551;;32165:3;32157:22;;;32181:10;32193:7;32157:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32093:551;;;32281:9;;;;;;;;;;;32276:357;;;32350:3;32342:21;;;32365:13;;;;;;;;;;;32380:7;32342:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32424:13;;;;;;;;;;;32408:37;;;32447:7;32456:10;32408:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32276:357;;;32517:3;32509:21;;;32532:7;;;;;;;;;;;32541;32509:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32579:7;;;;;;;;;;;32569:25;;;32596:7;32605:10;32569:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32276:357;32093:551;32661:7;32654:14;;31986:690;;;;;:::o;1799:136::-;1857:7;1884:43;1888:1;1891;1884:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1877:50;;1799:136;;;;:::o;1610:181::-;1668:7;1688:9;1704:1;1700;:5;1688:17;;1729:1;1724;:6;;1716:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1782:1;1775:8;;;1610:181;;;;:::o;19956:719::-;20037:16;;:::i;:::-;20088:1;20074:11;:15;20066:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20160:1;20147:9;:14;20143:50;;;20170:23;;;;;;;;20191:1;20170:23;;;;;20163:30;;;;20143:50;20231:2;20210:24;;:9;:24;20206:462;;20251:14;20296:11;19382:3;20269:23;;:9;:23;;20268:39;;;;;;20251:56;;20348:2;20330:21;;:6;:21;;20322:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20408:26;;;;;;;;20426:6;20408:26;;;;;20401:33;;;;;20206:462;20467:14;20484:45;20500:9;19424:31;20517:11;20484:15;:45::i;:::-;20467:62;;20570:2;20552:21;;:6;:21;;20544:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20630:26;;;;;;;;20648:6;20630:26;;;;;20623:33;;;19956:719;;;;;:::o;19811:137::-;19882:4;19924:16;19913:4;:7;;;19908:13;;:32;;;;;;19901:39;;19811:137;;;:::o;33746:124::-;33799:28;33814:11;:9;:11::i;:::-;33799:9;;:13;;:28;;;;:::i;:::-;33787:9;:40;;;;33850:12;33838:9;:24;;;;33746:124::o;34950:347::-;34993:11;35027:69;35091:3;35027:58;35073:10;35027:40;35054:11;:9;:11::i;:::-;35027:5;:21;;;:25;;:40;;;;:::i;:::-;:44;;:58;;;;:::i;:::-;:62;;:69;;;;:::i;:::-;35018:78;;35121:5;:18;;;35112:6;:27;35107:183;;;35166:5;:18;;;35157:27;;35107:183;;;35237:1;35215:5;:18;;;:23;35210:80;;35277:1;35256:5;:18;;:22;;;;35210:80;35107:183;34950:347;:::o;16493:205::-;16594:96;16614:5;16644:27;;;16673:4;16679:2;16683:5;16621:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16594:19;:96::i;:::-;16493:205;;;;:::o;16308:177::-;16391:86;16411:5;16441:23;;;16466:2;16470:5;16418:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16391:19;:86::i;:::-;16308:177;;;:::o;32768:917::-;32806:19;32828:45;32854:10;:17;;;32828:10;:20;;;:24;;:45;;;;:::i;:::-;32806:67;;32907:1;32888:10;:15;;;:20;;:54;;;;;32928:14;32912:12;:30;;32888:54;32884:794;;;32960:12;32975:5;:21;;;32960:36;;33016:10;:14;;;;;;;;;;;;33011:494;;;33076:44;33103:10;:15;;;33076:5;:21;;;:25;;:44;;;;:::i;:::-;33052:5;:21;;:68;;;;33169:10;:17;;;33144:5;:21;;;:42;33139:112;;33230:1;33212:10;:15;;:19;;;;33139:112;33011:494;;;33315:44;33342:10;:15;;;33315:5;:21;;;:25;;:44;;;;:::i;:::-;33291:5;:21;;:68;;;;33408:10;:17;;;33383:5;:21;;;:42;33378:112;;33469:1;33451:10;:15;;:19;;;;33378:112;33011:494;33542:12;33519:10;:20;;:35;;;;33574:92;33601:7;33610:5;:21;;;33633:10;:15;;;33650:10;:14;;;;;;;;;;;;33574:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32884:794;;32768:917;:::o;2541:189::-;2627:7;2659:1;2655;:5;2662:12;2647:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2686:9;2702:1;2698;:5;;;;;;2686:17;;2721:1;2714:8;;;2541:189;;;;;:::o;1943:192::-;2029:7;2062:1;2057;:6;;2065:12;2049:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2089:9;2105:1;2101;:5;2089:17;;2126:1;2119:8;;;1943:192;;;;;:::o;18856:347::-;18962:7;18983:9;18994;19007:13;19015:1;19018;19007:7;:13::i;:::-;18982:38;;;;19031:10;19057:1;19044:15;;;;;19054:1;19051;19044:15;19031:28;;19079:1;19074:2;:6;19070:18;;;19087:1;19082:6;;;;19070:18;19104:2;19099:7;;;;19129:1;19125;:5;19117:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19179:16;19187:1;19190;19193;19179:7;:16::i;:::-;19172:23;;;;;18856:347;;;;;:::o;17697:420::-;17780:23;17806:69;17834:4;17806:69;;;;;;;;;;;;;;;;;17814:5;17806:27;;;;:69;;;;;:::i;:::-;17780:95;;17910:1;17890:10;:17;:21;17886:224;;;18032:10;18021:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18013:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17886:224;17697:420;;;:::o;18148:210::-;18209:9;18220;18242:10;18276:2;18255:25;;;;;18265:1;18262;18255:25;18242:38;;18299:1;18295;:5;18291:9;;18320:1;18315:2;:6;18311:10;;18341:1;18336:2;:6;18332:18;;;18349:1;18344:6;;;;18332:18;18148:210;;;;;;:::o;18366:482::-;18472:7;18492:12;18512:1;18511:2;;18507:1;:6;18492:21;;18529:4;18524:9;;;;;;;;;18549:4;18544:9;;;;;;;;;18591:1;18584:4;18576;18575:5;;18574:14;;;;;;:18;18569:1;:24;18564:29;;;;18604:9;18616:1;18604:13;;18641:1;18637;:5;18633:1;:9;18628:14;;;;18666:1;18662;:5;18658:1;:9;18653:14;;;;18691:1;18687;:5;18683:1;:9;18678:14;;;;18716:1;18712;:5;18708:1;:9;18703:14;;;;18741:1;18737;:5;18733:1;:9;18728:14;;;;18766:1;18762;:5;18758:1;:9;18753:14;;;;18791:1;18787;:5;18783:1;:9;18778:14;;;;18816:1;18812;:5;18808:1;:9;18803:14;;;;18839:1;18835;:5;18828:12;;;;18366:482;;;;;:::o;4242:196::-;4345:12;4377:53;4400:6;4408:4;4414:1;4417:12;4377:22;:53::i;:::-;4370:60;;4242:196;;;;;:::o;5218:979::-;5348:12;5381:18;5392:6;5381:10;:18::i;:::-;5373:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5507:12;5521:23;5548:6;:11;;5568:8;5579:4;5548:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5506:78;;;;5599:7;5595:595;;;5630:10;5623:17;;;;;;5595:595;5764:1;5744:10;:17;:21;5740:439;;;6007:10;6001:17;6068:15;6055:10;6051:2;6047:19;6040:44;5955:148;6150:12;6143:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5218:979;;;;;;;:::o;3415:233::-;3475:4;3494:12;3605:7;3593:20;3585:28;;3639:1;3632:4;:8;3625:15;;;3415:233;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://8233b5426e82528dcda7a188a6917db4f7624a429e19ecac551aad354d1cc090
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $1.76 | 226.3517 | $397.41 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.