Source Code
Overview
MATIC Balance
0 MATIC
Token Holdings
More Info
ContractCreator:
Multichain Info
N/A
Latest 25 from a total of 286 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Redeem | 23344321 | 818 days ago | IN | 0 MATIC | 0.00008301 | ||||
Redeem | 23344320 | 818 days ago | IN | 0 MATIC | 0.00008301 | ||||
Redeem | 23344320 | 818 days ago | IN | 0 MATIC | 0.00012373 | ||||
Transfer | 22328390 | 843 days ago | IN | 1 MATIC | 0.00021 | ||||
Redeem | 22208085 | 846 days ago | IN | 0 MATIC | 0.00006046 | ||||
Redeem | 22208027 | 846 days ago | IN | 0 MATIC | 0.00006046 | ||||
Redeem | 22208009 | 846 days ago | IN | 0 MATIC | 0.00007756 | ||||
Deposit | 22208002 | 846 days ago | IN | 0 MATIC | 0.00026367 | ||||
Deposit | 22207412 | 846 days ago | IN | 0 MATIC | 0.00026365 | ||||
Redeem | 22207044 | 846 days ago | IN | 0 MATIC | 0.00007755 | ||||
Deposit | 22206417 | 846 days ago | IN | 0 MATIC | 0.00026367 | ||||
Deposit | 22205889 | 846 days ago | IN | 0 MATIC | 0.00005814 | ||||
Deposit | 22205844 | 846 days ago | IN | 0 MATIC | 0.00005814 | ||||
Deposit | 22205823 | 846 days ago | IN | 0 MATIC | 0.00018966 | ||||
Deposit | 22205433 | 846 days ago | IN | 0 MATIC | 0.00019246 | ||||
Redeem | 22205387 | 846 days ago | IN | 0 MATIC | 0.00006046 | ||||
Deposit | 22205190 | 846 days ago | IN | 0 MATIC | 0.00018966 | ||||
Deposit | 22205142 | 846 days ago | IN | 0 MATIC | 0.00026367 | ||||
Redeem | 22205096 | 846 days ago | IN | 0 MATIC | 0.00007756 | ||||
Deposit | 22204913 | 846 days ago | IN | 0 MATIC | 0.00005814 | ||||
Deposit | 22204896 | 846 days ago | IN | 0 MATIC | 0.00005814 | ||||
Deposit | 22204756 | 846 days ago | IN | 0 MATIC | 0.00008583 | ||||
Redeem | 22204036 | 846 days ago | IN | 0 MATIC | 0.00007756 | ||||
Redeem | 22202683 | 846 days ago | IN | 0 MATIC | 0.00017964 | ||||
Redeem | 22200627 | 846 days ago | IN | 0 MATIC | 0.00062055 |
Loading...
Loading
Contract Name:
MockOlympusBondDepository
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at mumbai.polygonscan.com on 2021-11-30 */ // 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 (uint256 c) { if (a > 3) { c = a; uint256 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 private constant 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 (uint256) { return uint256(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( uint256 _amount, address _token, uint256 _profit ) external returns (bool); function valueOfToken(address _token, uint256 _amount) external view returns (uint256 value_); } interface IBondCalculator { function valuation(address _LP, uint256 _amount) external view returns (uint256); function markdown(address _LP) external view returns (uint256); } interface IStaking { function stake(uint256 _amount, address _recipient) external returns (bool); } interface IStakingHelper { function stake(uint256 _amount, address _recipient) external; } contract MockOlympusBondDepository is Ownable { using FixedPoint for *; using SafeERC20 for IERC20; using SafeMath for uint256; /* ======== EVENTS ======== */ event BondCreated( uint256 deposit, uint256 indexed payout, uint256 indexed expires, uint256 indexed priceInUSD ); event BondRedeemed( address indexed recipient, uint256 payout, uint256 remaining ); event BondPriceChanged( uint256 indexed priceInUSD, uint256 indexed internalPrice, uint256 indexed debtRatio ); event ControlVariableAdjustment( uint256 initialBCV, uint256 newBCV, uint256 adjustment, bool addition ); /* ======== STATE VARIABLES ======== */ address public immutable OHM; // token given as payment for bond address public immutable principle; // token used to create bond address public immutable treasury; // mints OHM when receives principle address public immutable DAO; // receives profit share from bond bool public immutable isLiquidityBond; // LP and Reserve bonds are treated slightly different address public immutable bondCalculator; // 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 bonds Adjust public adjustment; // stores adjustment to BCV data mapping(address => Bond) public bondInfo; // stores bond information for depositors uint256 public totalDebt; // total value of outstanding bonds; used for pricing uint256 public lastDecay; // reference block for debt decay /* ======== STRUCTS ======== */ // Info for creating new bonds struct Terms { uint256 controlVariable; // scaling variable for price uint256 vestingTerm; // in blocks uint256 minimumPrice; // vs principle value uint256 maxPayout; // in thousandths of a %. i.e. 500 = 0.5% uint256 fee; // as % of bond payout, in hundreths. ( 500 = 5% = 0.05 for every 1 paid) uint256 maxDebt; // 9 decimal debt ratio, max % total supply created as debt } // Info for bond holder struct Bond { uint256 payout; // OHM remaining to be paid uint256 vesting; // Blocks left to vest uint256 lastBlock; // Last interaction uint256 pricePaid; // In DAI, for front end viewing } // Info for incremental adjustments to control variable struct Adjust { bool add; // addition or subtraction uint256 rate; // increment uint256 target; // BCV when adjustment finished uint256 buffer; // minimum length (in blocks) between adjustments uint256 lastBlock; // block when last adjustment made } /* ======== INITIALIZATION ======== */ constructor( address _OHM, address _principle, address _treasury, address _DAO, address _bondCalculator ) { require(_OHM != address(0)); OHM = _OHM; require(_principle != address(0)); principle = _principle; require(_treasury != address(0)); treasury = _treasury; require(_DAO != address(0)); DAO = _DAO; // bondCalculator should be address(0) if not LP bond bondCalculator = _bondCalculator; isLiquidityBond = (_bondCalculator != address(0)); } /** * @notice initializes bond parameters * @param _controlVariable uint * @param _vestingTerm uint * @param _minimumPrice uint * @param _maxPayout uint * @param _fee uint * @param _maxDebt uint * @param _initialDebt uint */ function initializeBondTerms( uint256 _controlVariable, uint256 _vestingTerm, uint256 _minimumPrice, uint256 _maxPayout, uint256 _fee, uint256 _maxDebt, uint256 _initialDebt ) external onlyPolicy { require(terms.controlVariable == 0, "Bonds 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 bonds * @param _parameter PARAMETER * @param _input uint */ function setBondTerms(PARAMETER _parameter, uint256 _input) external onlyPolicy { if (_parameter == PARAMETER.VESTING) { // 0 require(_input >= 10000, "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, "DAO 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, uint256 _increment, uint256 _target, uint256 _buffer ) external onlyPolicy { require( _increment <= terms.controlVariable.mul(25).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 bond * @param _amount uint * @param _maxPrice uint * @param _depositor address * @return uint */ function deposit( uint256 _amount, uint256 _maxPrice, address _depositor ) external returns (uint256) { require(_depositor != address(0), "Invalid address"); decayDebt(); require(totalDebt <= terms.maxDebt, "Max capacity reached"); uint256 priceInUSD = bondPriceInUSD(); // Stored in bond info uint256 nativePrice = _bondPrice(); require(_maxPrice >= nativePrice, "Slippage limit: more than max price"); // slippage protection uint256 value = ITreasury(treasury).valueOfToken(principle, _amount); uint256 payout = payoutFor(value); // payout to bonder is computed require(payout >= 10000000, "Bond too small"); // must be > 0.01 OHM ( underflow protection ) require(payout <= maxPayout(), "Bond too large"); // size protection because there is no slippage // profits are calculated uint256 fee = payout.mul(terms.fee).div(10000); uint256 profit = value.sub(payout).sub(fee); /** principle is transferred in approved and deposited into the treasury, returning (_amount - profit) OHM */ 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 dao IERC20(OHM).safeTransfer(DAO, fee); } // total debt is increased totalDebt = totalDebt.add(value); // depositor info is stored bondInfo[_depositor] = Bond({ payout: bondInfo[_depositor].payout.add(payout), vesting: terms.vestingTerm, lastBlock: block.number, pricePaid: priceInUSD }); // indexed events are emitted emit BondCreated( _amount, payout, block.number.add(terms.vestingTerm), priceInUSD ); emit BondPriceChanged(bondPriceInUSD(), _bondPrice(), debtRatio()); adjust(); // control variable is adjusted return payout; } /** * @notice redeem bond for user * @param _recipient address * @param _stake bool * @return uint */ function redeem(address _recipient, bool _stake) external returns (uint256) { Bond memory info = bondInfo[_recipient]; uint256 percentVested = percentVestedFor(_recipient); // (blocks since last interaction / vesting term remaining) if (percentVested >= 10000) { // if fully vested delete bondInfo[_recipient]; // delete user info emit BondRedeemed(_recipient, info.payout, 0); // emit bond data return stakeOrSend(_recipient, _stake, info.payout); // pay user everything due } else { // if unfinished // calculate payout vested uint256 payout = info.payout.mul(percentVested).div(10000); // store updated deposit info bondInfo[_recipient] = Bond({ payout: info.payout.sub(payout), vesting: info.vesting.sub(block.number.sub(info.lastBlock)), lastBlock: block.number, pricePaid: info.pricePaid }); emit BondRedeemed(_recipient, payout, bondInfo[_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, uint256 _amount ) internal returns (uint256) { if (!_stake) { // if user does not want to stake IERC20(OHM).transfer(_recipient, _amount); // send payout } else { // if user wants to stake if (useHelper) { // use if staking warmup is 0 IERC20(OHM).approve(stakingHelper, _amount); IStakingHelper(stakingHelper).stake(_amount, _recipient); } else { IERC20(OHM).approve(staking, _amount); IStaking(staking).stake(_amount, _recipient); } } return _amount; } /** * @notice makes incremental adjustment to control variable */ function adjust() internal { uint256 blockCanAdjust = adjustment.lastBlock.add(adjustment.buffer); if (adjustment.rate != 0 && block.number >= blockCanAdjust) { uint256 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 bond size * @return uint */ function maxPayout() public view returns (uint256) { return IERC20(OHM).totalSupply().mul(terms.maxPayout).div(100000); } /** * @notice calculate interest due for new bond * @param _value uint * @return uint */ function payoutFor(uint256 _value) public view returns (uint256) { return FixedPoint.fraction(_value, bondPrice()).decode112with18().div(1e16); } /** * @notice calculate current bond premium * @return price_ uint */ function bondPrice() public view returns (uint256 price_) { price_ = terms.controlVariable.mul(debtRatio()).add(1000000000).div(1e7); if (price_ < terms.minimumPrice) { price_ = terms.minimumPrice; } } /** * @notice calculate current bond price and remove floor if above * @return price_ uint */ function _bondPrice() internal returns (uint256 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 bond price to DAI value * @return price_ uint */ function bondPriceInUSD() public view returns (uint256 price_) { if (isLiquidityBond) { price_ = bondPrice() .mul(IBondCalculator(bondCalculator).markdown(principle)) .div(100); } else { price_ = bondPrice().mul(10**IERC20(principle).decimals()).div(100); } } /** * @notice calculate current ratio of debt to OHM supply * @return debtRatio_ uint */ function debtRatio() public view returns (uint256 debtRatio_) { uint256 supply = IERC20(OHM).totalSupply(); debtRatio_ = FixedPoint .fraction(currentDebt().mul(1e9), supply) .decode112with18() .div(1e18); } /** * @notice debt ratio in same terms for reserve or liquidity bonds * @return uint */ function standardizedDebtRatio() external view returns (uint256) { if (isLiquidityBond) { return debtRatio() .mul(IBondCalculator(bondCalculator).markdown(principle)) .div(1e9); } else { return debtRatio(); } } /** * @notice calculate debt factoring in decay * @return uint */ function currentDebt() public view returns (uint256) { return totalDebt.sub(debtDecay()); } /** * @notice amount to decay total debt by * @return decay_ uint */ function debtDecay() public view returns (uint256 decay_) { uint256 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 (uint256 percentVested_) { Bond memory bond = bondInfo[_depositor]; uint256 blocksSinceLast = block.number.sub(bond.lastBlock); uint256 vesting = bond.vesting; if (vesting > 0) { percentVested_ = blocksSinceLast.mul(10000).div(vesting); } else { percentVested_ = 0; } } /** * @notice calculate amount of OHM available for claim by depositor * @param _depositor address * @return pendingPayout_ uint */ function pendingPayoutFor(address _depositor) external view returns (uint256 pendingPayout_) { uint256 percentVested = percentVestedFor(_depositor); uint256 payout = bondInfo[_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 OHM) to the DAO * @return bool */ function recoverLostToken(address _token) external returns (bool) { require(_token != OHM); require(_token != principle); IERC20(_token).safeTransfer(DAO, IERC20(_token).balanceOf(address(this))); return true; } }
[{"inputs":[{"internalType":"address","name":"_OHM","type":"address"},{"internalType":"address","name":"_principle","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_DAO","type":"address"},{"internalType":"address","name":"_bondCalculator","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":"BondCreated","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":"BondPriceChanged","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":"BondRedeemed","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":"DAO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OHM","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":"bondCalculator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bondInfo","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":"bondPrice","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondPriceInUSD","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":"initializeBondTerms","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isLiquidityBond","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 MockOlympusBondDepository.PARAMETER","name":"_parameter","type":"uint8"},{"internalType":"uint256","name":"_input","type":"uint256"}],"name":"setBondTerms","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
6101406040523480156200001257600080fd5b506040516200466738038062004667833981810160405260a08110156200003857600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156200016757600080fd5b8473ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415620001d957600080fd5b8373ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200024b57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620002bd57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff166101208173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561010081151560f81b81525050505050505060805160601c60a05160601c60c05160601c60e05160601c6101005160f81c6101205160601c6142226200044560003980611b5a52806125a552806128b1525080611b2c52806125745280612be752508061235d52806126c052806127bf5250806118c15280611edc52806121ac528061225d5250806109a75280611b965280611c6f5280611f1852806121295280612170528061229a52806125e1528061276352508061237f52806126e4528061270a52806129085280612c845280612e855280612f6c528061310b52506142226000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80637927ebf811610125578063cea55f57116100ad578063d7ccfb0b1161007c578063d7ccfb0b1461090f578063e0176de81461092d578063e392a2621461094b578063f5c2ab5b14610969578063fc7b9c181461098757610211565b8063cea55f5714610840578063d4d863ce1461085e578063d5025625146108ae578063d7969060146108ef57610211565b806398fabd3a116100f457806398fabd3a146106dd578063a6c41fec14610711578063b4abccba14610745578063c5332b7c1461079f578063cd1234b3146107d357610211565b80637927ebf8146105f3578063844b5c7c146106355780638dbdbe6d14610653578063904b3ece146106bf57610211565b8063451ee4a1116101a85780635a96ac0a116101775780635a96ac0a146104f957806361d027b3146105035780637153500814610537578063759076e5146105a157806377b81895146105bf57610211565b8063451ee4a1146103ed57806346f68ee9146104295780634cf088d91461046d578063507930ec146104a157610211565b80631a3d0068116101e45780631a3d0068146102e05780631e321a0f1461032e5780631feed31f146103695780632f3f470a146103cd57610211565b8063016a42841461021657806301b88ee81461024a5780630505c8c9146102a2578063089208d8146102d6575b600080fd5b61021e6109a5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61028c6004803603602081101561026057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109c9565b6040518082815260200191505060405180910390f35b6102aa610a60565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102de610a89565b005b61032c600480360360808110156102f657600080fd5b81019080803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610c08565b005b6103676004803603604081101561034457600080fd5b81019080803560ff16906020019092919080359060200190929190505050610de7565b005b6103b76004803603604081101561037f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506110ac565b6040518082815260200191505060405180910390f35b6103d56113c4565b60405180821515815260200191505060405180910390f35b6103f56113d7565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b61046b6004803603602081101561043f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611408565b005b61047561160d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104e3600480360360208110156104b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611633565b6040518082815260200191505060405180910390f35b610501611719565b005b61050b6118bf565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61059f600480360360e081101561054d57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291905050506118e3565b005b6105a9611aa4565b6040518082815260200191505060405180910390f35b6105c7611ac7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61061f6004803603602081101561060957600080fd5b8101908080359060200190929190505050611aed565b6040518082815260200191505060405180910390f35b61063d611b28565b6040518082815260200191505060405180910390f35b6106a96004803603606081101561066957600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d3e565b6040518082815260200191505060405180910390f35b6106c7612570565b6040518082815260200191505060405180910390f35b6106e56126be565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107196126e2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107876004803603602081101561075b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612706565b60405180821515815260200191505060405180910390f35b6107a76128af565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610815600480360360208110156107e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128d3565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b610848612903565b6040518082815260200191505060405180910390f35b6108ac6004803603604081101561087457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506129f8565b005b6108b6612bbb565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b6108f7612be5565b60405180821515815260200191505060405180910390f35b610917612c09565b6040518082815260200191505060405180910390f35b610935612c70565b6040518082815260200191505060405180910390f35b610953612d44565b6040518082815260200191505060405180910390f35b610971612da0565b6040518082815260200191505060405180910390f35b61098f612da6565b6040518082815260200191505060405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806109d583611633565b90506000600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506127108210610a2f57809250610a59565b610a56612710610a488484612dac90919063ffffffff16565b612e3290919063ffffffff16565b92505b5050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b610cf66103e8610ce86019600460000154612dac90919063ffffffff16565b612e3290919063ffffffff16565b831115610d6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e6372656d656e7420746f6f206c617267650000000000000000000000000081525060200191505060405180910390fd5b6040518060a00160405280851515815260200184815260200183815260200182815260200143815250600a60008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ea8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006003811115610eb557fe5b826003811115610ec157fe5b1415610f3157612710811015610f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061419f6024913960400191505060405180910390fd5b806004600101819055506110a8565b60016003811115610f3e57fe5b826003811115610f4a57fe5b1415610fd7576103e8811115610fc8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5061796f75742063616e6e6f742062652061626f766520312070657263656e7481525060200191505060405180910390fd5b806004600301819055506110a7565b60026003811115610fe457fe5b826003811115610ff057fe5b141561107c5761271081111561106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f44414f206665652063616e6e6f7420657863656564207061796f75740000000081525060200191505060405180910390fd5b8060048001819055506110a6565b60038081111561108857fe5b82600381111561109457fe5b14156110a557806004600501819055505b5b5b5b5050565b60006110b6614093565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050600061113585611633565b9050612710811061121557600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550508473ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b183600001516000604051808381526020018281526020019250505060405180910390a261120c85858460000151612e7c565b925050506113be565b6000611242612710611234848660000151612dac90919063ffffffff16565b612e3290919063ffffffff16565b905060405180608001604052806112668386600001516132d390919063ffffffff16565b81526020016112986112858660400151436132d390919063ffffffff16565b86602001516132d390919063ffffffff16565b81526020014381526020018460600151815250600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050508573ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b182600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808381526020018281526020019250505060405180910390a26113b8868683612e7c565b93505050505b92915050565b600360149054906101000a900460ff1681565b600a8060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561154f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806140ed6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061163d614093565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905060006116ca8260400151436132d390919063ffffffff16565b9050600082602001519050600081111561170c57611705816116f761271085612dac90919063ffffffff16565b612e3290919063ffffffff16565b9350611711565b600093505b505050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806141136022913960400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d60405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600060046000015414611a1f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f426f6e6473206d75737420626520696e697469616c697a65642066726f6d203081525060200191505060405180910390fd5b6040518060c00160405280888152602001878152602001868152602001858152602001848152602001838152506004600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050806010819055504360118190555050505050505050565b6000611ac2611ab1612d44565b6010546132d390919063ffffffff16565b905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611b21662386f26fc10000611b13611b0e85611b09612c09565b61331d565b6135fe565b612e3290919063ffffffff16565b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000015611c6557611c5e6064611c507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bff57600080fd5b505afa158015611c13573d6000803e3d6000fd5b505050506040513d6020811015611c2957600080fd5b8101908080519060200190929190505050611c42612c09565b612dac90919063ffffffff16565b612e3290919063ffffffff16565b9050611d3b565b611d386064611d2a7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611cd357600080fd5b505afa158015611ce7573d6000803e3d6000fd5b505050506040513d6020811015611cfd57600080fd5b810190808051906020019092919050505060ff16600a0a611d1c612c09565b612dac90919063ffffffff16565b612e3290919063ffffffff16565b90505b90565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611de2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611dea61363a565b6004600501546010541115611e67576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b6000611e71611b28565b90506000611e7d613665565b905080851015611ed8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061417c6023913960400191505060405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d1b317e57f0000000000000000000000000000000000000000000000000000000000000000896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b158015611f8957600080fd5b505afa158015611f9d573d6000803e3d6000fd5b505050506040513d6020811015611fb357600080fd5b810190808051906020019092919050505090506000611fd182611aed565b90506298968081101561204c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b612054612c70565b8111156120c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b60006120f66127106120e8600480015485612dac90919063ffffffff16565b612e3290919063ffffffff16565b9050600061211f8261211185876132d390919063ffffffff16565b6132d390919063ffffffff16565b905061216e33308c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166136ea909392919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f00000000000000000000000000000000000000000000000000000000000000008c6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561221f57600080fd5b505af1158015612233573d6000803e3d6000fd5b505050506040513d602081101561224957600080fd5b8101908080519060200190929190505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bc157ac18b7f0000000000000000000000000000000000000000000000000000000000000000846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561231457600080fd5b505af1158015612328573d6000803e3d6000fd5b505050506040513d602081101561233e57600080fd5b810190808051906020019092919050505050600082146123c4576123c37f0000000000000000000000000000000000000000000000000000000000000000837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166137ab9092919063ffffffff16565b5b6123d98460105461384d90919063ffffffff16565b601081905550604051806080016040528061243f85600f60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461384d90919063ffffffff16565b8152602001600460010154815260200143815260200187815250600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050856124dc6004600101544361384d90919063ffffffff16565b847f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae58d6040518082815260200191505060405180910390a461251c612903565b612524613665565b61252c611b28565b7f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a60405160405180910390a46125606138d5565b8296505050505050509392505050565b60007f0000000000000000000000000000000000000000000000000000000000000000156126b0576126a9633b9aca0061269b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561264a57600080fd5b505afa15801561265e573d6000803e3d6000fd5b505050506040513d602081101561267457600080fd5b810190808051906020019092919050505061268d612903565b612dac90919063ffffffff16565b612e3290919063ffffffff16565b90506126bb565b6126b8612903565b90505b90565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561276157600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127ba57600080fd5b6128a67f00000000000000000000000000000000000000000000000000000000000000008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561284557600080fd5b505afa158015612859573d6000803e3d6000fd5b505050506040513d602081101561286f57600080fd5b81019080805190602001909291905050508473ffffffffffffffffffffffffffffffffffffffff166137ab9092919063ffffffff16565b60019050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600f6020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561296c57600080fd5b505afa158015612980573d6000803e3d6000fd5b505050506040513d602081101561299657600080fd5b810190808051906020019092919050505090506129f2670de0b6b3a76400006129e46129df6129d9633b9aca006129cb611aa4565b612dac90919063ffffffff16565b8561331d565b6135fe565b612e3290919063ffffffff16565b91505090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ab9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612af357600080fd5b8015612b5a576001600360146101000a81548160ff02191690831515021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612bb7565b6000600360146101000a81548160ff02191690831515021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b60048060000154908060010154908060020154908060030154908060040154908060050154905086565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000612c5562989680612c47633b9aca00612c39612c25612903565b600460000154612dac90919063ffffffff16565b61384d90919063ffffffff16565b612e3290919063ffffffff16565b9050600460020154811015612c6d5760046002015490505b90565b6000612d3f620186a0612d316004600301547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612ce857600080fd5b505afa158015612cfc573d6000803e3d6000fd5b505050506040513d6020811015612d1257600080fd5b8101908080519060200190929190505050612dac90919063ffffffff16565b612e3290919063ffffffff16565b905090565b600080612d5c601154436132d390919063ffffffff16565b9050612d8a600460010154612d7c83601054612dac90919063ffffffff16565b612e3290919063ffffffff16565b9150601054821115612d9c5760105491505b5090565b60115481565b60105481565b600080831415612dbf5760009050612e2c565b6000828402905082848281612dd057fe5b0414612e27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061415b6021913960400191505060405180910390fd5b809150505b92915050565b6000612e7483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a3b565b905092915050565b600082612f55577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612f1457600080fd5b505af1158015612f28573d6000803e3d6000fd5b505050506040513d6020811015612f3e57600080fd5b8101908080519060200190929190505050506132c9565b600360149054906101000a900460ff1615613109577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561301d57600080fd5b505af1158015613031573d6000803e3d6000fd5b505050506040513d602081101561304757600080fd5b810190808051906020019092919050505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b1580156130ec57600080fd5b505af1158015613100573d6000803e3d6000fd5b505050506132c8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156131bc57600080fd5b505af11580156131d0573d6000803e3d6000fd5b505050506040513d60208110156131e657600080fd5b810190808051906020019092919050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15801561328b57600080fd5b505af115801561329f573d6000803e3d6000fd5b505050506040513d60208110156132b557600080fd5b8101908080519060200190929190505050505b5b8190509392505050565b600061331583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b01565b905092915050565b6133256140bb565b6000821161337e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806141356026913960400191505060405180910390fd5b60008314156133bc57604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090506135f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff1683116134f557600082607060ff1685901b8161340957fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168111156134c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150506135f8565b6000613511846e01000000000000000000000000000085613bc1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168111156135c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168161363257fe5b049050919050565b613656613645612d44565b6010546132d390919063ffffffff16565b60108190555043601181905550565b60006136b1629896806136a3633b9aca00613695613681612903565b600460000154612dac90919063ffffffff16565b61384d90919063ffffffff16565b612e3290919063ffffffff16565b90506004600201548110156136cd5760046002015490506136e7565b6000600460020154146136e65760006004600201819055505b5b90565b6137a5846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c83565b50505050565b6138488363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c83565b505050565b6000808284019050838110156138cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006138f4600a60030154600a6004015461384d90919063ffffffff16565b90506000600a600101541415801561390c5750804310155b15613a385760006004600001549050600a60000160009054906101000a900460ff161561397b57613950600a6001015460046000015461384d90919063ffffffff16565b600460000181905550600a6002015460046000015410613976576000600a600101819055505b6139bf565b613998600a600101546004600001546132d390919063ffffffff16565b600460000181905550600a60020154600460000154116139be576000600a600101819055505b5b43600a600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600460000154600a60010154600a60000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b60008083118290613ae7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613aac578082015181840152602081019050613a91565b50505050905090810190601f168015613ad95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613af357fe5b049050809150509392505050565b6000838311158290613bae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b73578082015181840152602081019050613b58565b50505050905090810190601f168015613ba05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000806000613bd08686613d72565b9150915060008480613bde57fe5b868809905082811115613bf2576001820391505b8083039250848210613c6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b613c77838387613dc5565b93505050509392505050565b6060613ce5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613e629092919063ffffffff16565b9050600081511115613d6d57808060200190516020811015613d0657600080fd5b8101908080519060200190929190505050613d6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806141c3602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80613d9f57fe5b84860990508385029250828103915082811015613dbd576001820391505b509250929050565b6000808260000383169050808381613dd957fe5b049250808581613de557fe5b0494506001818260000381613df657fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b6060613e718484600085613e7a565b90509392505050565b6060613e8585614080565b613ef7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613f475780518252602082019150602081019050602083039250613f24565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613fa9576040519150601f19603f3d011682016040523d82523d6000602084013e613fae565b606091505b50915091508115613fc3578092505050614078565b600081511115613fd65780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561403d578082015181840152602081019050614022565b50505050905090810190601f16801561406a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212207519182ca4b66f8fa178220eac163432c193bf7ed3ccc6afba9b586215d9eeb164736f6c63430007050033000000000000000000000000b16a16b498840b172db683bd2903126d358e29880000000000000000000000002885257bf9918a98e0311e0a74c8d59a3ec594380000000000000000000000005a528c546f56c8f497b60d0f0ea6cf6eb8d63c3b000000000000000000000000188ee96c4fcc5736b3c0ff40cf5310cfd99574110000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102115760003560e01c80637927ebf811610125578063cea55f57116100ad578063d7ccfb0b1161007c578063d7ccfb0b1461090f578063e0176de81461092d578063e392a2621461094b578063f5c2ab5b14610969578063fc7b9c181461098757610211565b8063cea55f5714610840578063d4d863ce1461085e578063d5025625146108ae578063d7969060146108ef57610211565b806398fabd3a116100f457806398fabd3a146106dd578063a6c41fec14610711578063b4abccba14610745578063c5332b7c1461079f578063cd1234b3146107d357610211565b80637927ebf8146105f3578063844b5c7c146106355780638dbdbe6d14610653578063904b3ece146106bf57610211565b8063451ee4a1116101a85780635a96ac0a116101775780635a96ac0a146104f957806361d027b3146105035780637153500814610537578063759076e5146105a157806377b81895146105bf57610211565b8063451ee4a1146103ed57806346f68ee9146104295780634cf088d91461046d578063507930ec146104a157610211565b80631a3d0068116101e45780631a3d0068146102e05780631e321a0f1461032e5780631feed31f146103695780632f3f470a146103cd57610211565b8063016a42841461021657806301b88ee81461024a5780630505c8c9146102a2578063089208d8146102d6575b600080fd5b61021e6109a5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61028c6004803603602081101561026057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109c9565b6040518082815260200191505060405180910390f35b6102aa610a60565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102de610a89565b005b61032c600480360360808110156102f657600080fd5b81019080803515159060200190929190803590602001909291908035906020019092919080359060200190929190505050610c08565b005b6103676004803603604081101561034457600080fd5b81019080803560ff16906020019092919080359060200190929190505050610de7565b005b6103b76004803603604081101561037f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506110ac565b6040518082815260200191505060405180910390f35b6103d56113c4565b60405180821515815260200191505060405180910390f35b6103f56113d7565b6040518086151581526020018581526020018481526020018381526020018281526020019550505050505060405180910390f35b61046b6004803603602081101561043f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611408565b005b61047561160d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104e3600480360360208110156104b757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611633565b6040518082815260200191505060405180910390f35b610501611719565b005b61050b6118bf565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61059f600480360360e081101561054d57600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001909291905050506118e3565b005b6105a9611aa4565b6040518082815260200191505060405180910390f35b6105c7611ac7565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61061f6004803603602081101561060957600080fd5b8101908080359060200190929190505050611aed565b6040518082815260200191505060405180910390f35b61063d611b28565b6040518082815260200191505060405180910390f35b6106a96004803603606081101561066957600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d3e565b6040518082815260200191505060405180910390f35b6106c7612570565b6040518082815260200191505060405180910390f35b6106e56126be565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107196126e2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107876004803603602081101561075b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612706565b60405180821515815260200191505060405180910390f35b6107a76128af565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610815600480360360208110156107e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128d3565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b610848612903565b6040518082815260200191505060405180910390f35b6108ac6004803603604081101561087457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506129f8565b005b6108b6612bbb565b60405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390f35b6108f7612be5565b60405180821515815260200191505060405180910390f35b610917612c09565b6040518082815260200191505060405180910390f35b610935612c70565b6040518082815260200191505060405180910390f35b610953612d44565b6040518082815260200191505060405180910390f35b610971612da0565b6040518082815260200191505060405180910390f35b61098f612da6565b6040518082815260200191505060405180910390f35b7f0000000000000000000000002885257bf9918a98e0311e0a74c8d59a3ec5943881565b6000806109d583611633565b90506000600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015490506127108210610a2f57809250610a59565b610a56612710610a488484612dac90919063ffffffff16565b612e3290919063ffffffff16565b92505b5050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610cc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b610cf66103e8610ce86019600460000154612dac90919063ffffffff16565b612e3290919063ffffffff16565b831115610d6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e6372656d656e7420746f6f206c617267650000000000000000000000000081525060200191505060405180910390fd5b6040518060a00160405280851515815260200184815260200183815260200182815260200143815250600a60008201518160000160006101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015590505050505050565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ea8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60006003811115610eb557fe5b826003811115610ec157fe5b1415610f3157612710811015610f22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602481526020018061419f6024913960400191505060405180910390fd5b806004600101819055506110a8565b60016003811115610f3e57fe5b826003811115610f4a57fe5b1415610fd7576103e8811115610fc8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5061796f75742063616e6e6f742062652061626f766520312070657263656e7481525060200191505060405180910390fd5b806004600301819055506110a7565b60026003811115610fe457fe5b826003811115610ff057fe5b141561107c5761271081111561106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f44414f206665652063616e6e6f7420657863656564207061796f75740000000081525060200191505060405180910390fd5b8060048001819055506110a6565b60038081111561108857fe5b82600381111561109457fe5b14156110a557806004600501819055505b5b5b5b5050565b60006110b6614093565b600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060800160405290816000820154815260200160018201548152602001600282015481526020016003820154815250509050600061113585611633565b9050612710811061121557600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160009055600382016000905550508473ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b183600001516000604051808381526020018281526020019250505060405180910390a261120c85858460000151612e7c565b925050506113be565b6000611242612710611234848660000151612dac90919063ffffffff16565b612e3290919063ffffffff16565b905060405180608001604052806112668386600001516132d390919063ffffffff16565b81526020016112986112858660400151436132d390919063ffffffff16565b86602001516132d390919063ffffffff16565b81526020014381526020018460600151815250600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050508573ffffffffffffffffffffffffffffffffffffffff167f51c99f515c87b0d95ba97f616edd182e8f161c4932eac17c6fefe9dab58b77b182600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154604051808381526020018281526020019250505060405180910390a26113b8868683612e7c565b93505050505b92915050565b600360149054906101000a900460ff1681565b600a8060000160009054906101000a900460ff16908060010154908060020154908060030154908060040154905085565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561154f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806140ed6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba60405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061163d614093565b600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905060006116ca8260400151436132d390919063ffffffff16565b9050600082602001519050600081111561170c57611705816116f761271085612dac90919063ffffffff16565b612e3290919063ffffffff16565b9350611711565b600093505b505050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806141136022913960400191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d60405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f0000000000000000000000005a528c546f56c8f497b60d0f0ea6cf6eb8d63c3b81565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146119a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600060046000015414611a1f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f426f6e6473206d75737420626520696e697469616c697a65642066726f6d203081525060200191505060405180910390fd5b6040518060c00160405280888152602001878152602001868152602001858152602001848152602001838152506004600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050806010819055504360118190555050505050505050565b6000611ac2611ab1612d44565b6010546132d390919063ffffffff16565b905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000611b21662386f26fc10000611b13611b0e85611b09612c09565b61331d565b6135fe565b612e3290919063ffffffff16565b9050919050565b60007f000000000000000000000000000000000000000000000000000000000000000015611c6557611c5e6064611c507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f0000000000000000000000002885257bf9918a98e0311e0a74c8d59a3ec594386040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bff57600080fd5b505afa158015611c13573d6000803e3d6000fd5b505050506040513d6020811015611c2957600080fd5b8101908080519060200190929190505050611c42612c09565b612dac90919063ffffffff16565b612e3290919063ffffffff16565b9050611d3b565b611d386064611d2a7f0000000000000000000000002885257bf9918a98e0311e0a74c8d59a3ec5943873ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611cd357600080fd5b505afa158015611ce7573d6000803e3d6000fd5b505050506040513d6020811015611cfd57600080fd5b810190808051906020019092919050505060ff16600a0a611d1c612c09565b612dac90919063ffffffff16565b612e3290919063ffffffff16565b90505b90565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611de2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f496e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b611dea61363a565b6004600501546010541115611e67576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4d6178206361706163697479207265616368656400000000000000000000000081525060200191505060405180910390fd5b6000611e71611b28565b90506000611e7d613665565b905080851015611ed8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061417c6023913960400191505060405180910390fd5b60007f0000000000000000000000005a528c546f56c8f497b60d0f0ea6cf6eb8d63c3b73ffffffffffffffffffffffffffffffffffffffff1663d1b317e57f0000000000000000000000002885257bf9918a98e0311e0a74c8d59a3ec59438896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060206040518083038186803b158015611f8957600080fd5b505afa158015611f9d573d6000803e3d6000fd5b505050506040513d6020811015611fb357600080fd5b810190808051906020019092919050505090506000611fd182611aed565b90506298968081101561204c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f20736d616c6c00000000000000000000000000000000000081525060200191505060405180910390fd5b612054612c70565b8111156120c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f426f6e6420746f6f206c6172676500000000000000000000000000000000000081525060200191505060405180910390fd5b60006120f66127106120e8600480015485612dac90919063ffffffff16565b612e3290919063ffffffff16565b9050600061211f8261211185876132d390919063ffffffff16565b6132d390919063ffffffff16565b905061216e33308c7f0000000000000000000000002885257bf9918a98e0311e0a74c8d59a3ec5943873ffffffffffffffffffffffffffffffffffffffff166136ea909392919063ffffffff16565b7f0000000000000000000000002885257bf9918a98e0311e0a74c8d59a3ec5943873ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000005a528c546f56c8f497b60d0f0ea6cf6eb8d63c3b8c6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561221f57600080fd5b505af1158015612233573d6000803e3d6000fd5b505050506040513d602081101561224957600080fd5b8101908080519060200190929190505050507f0000000000000000000000005a528c546f56c8f497b60d0f0ea6cf6eb8d63c3b73ffffffffffffffffffffffffffffffffffffffff1663bc157ac18b7f0000000000000000000000002885257bf9918a98e0311e0a74c8d59a3ec59438846040518463ffffffff1660e01b8152600401808481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561231457600080fd5b505af1158015612328573d6000803e3d6000fd5b505050506040513d602081101561233e57600080fd5b810190808051906020019092919050505050600082146123c4576123c37f000000000000000000000000188ee96c4fcc5736b3c0ff40cf5310cfd9957411837f000000000000000000000000b16a16b498840b172db683bd2903126d358e298873ffffffffffffffffffffffffffffffffffffffff166137ab9092919063ffffffff16565b5b6123d98460105461384d90919063ffffffff16565b601081905550604051806080016040528061243f85600f60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015461384d90919063ffffffff16565b8152602001600460010154815260200143815260200187815250600f60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050856124dc6004600101544361384d90919063ffffffff16565b847f1fec6dc81f140574bf43f6b1e420ae1dd47928b9d57db8cbd7b8611063b85ae58d6040518082815260200191505060405180910390a461251c612903565b612524613665565b61252c611b28565b7f375b221f40939bfd8f49723a17cf7bc6d576ebf72efe2cc3e991826f5b3f390a60405160405180910390a46125606138d5565b8296505050505050509392505050565b60007f0000000000000000000000000000000000000000000000000000000000000000156126b0576126a9633b9aca0061269b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332da80a37f0000000000000000000000002885257bf9918a98e0311e0a74c8d59a3ec594386040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561264a57600080fd5b505afa15801561265e573d6000803e3d6000fd5b505050506040513d602081101561267457600080fd5b810190808051906020019092919050505061268d612903565b612dac90919063ffffffff16565b612e3290919063ffffffff16565b90506126bb565b6126b8612903565b90505b90565b7f000000000000000000000000188ee96c4fcc5736b3c0ff40cf5310cfd995741181565b7f000000000000000000000000b16a16b498840b172db683bd2903126d358e298881565b60007f000000000000000000000000b16a16b498840b172db683bd2903126d358e298873ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561276157600080fd5b7f0000000000000000000000002885257bf9918a98e0311e0a74c8d59a3ec5943873ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127ba57600080fd5b6128a67f000000000000000000000000188ee96c4fcc5736b3c0ff40cf5310cfd99574118373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561284557600080fd5b505afa158015612859573d6000803e3d6000fd5b505050506040513d602081101561286f57600080fd5b81019080805190602001909291905050508473ffffffffffffffffffffffffffffffffffffffff166137ab9092919063ffffffff16565b60019050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600f6020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6000807f000000000000000000000000b16a16b498840b172db683bd2903126d358e298873ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561296c57600080fd5b505afa158015612980573d6000803e3d6000fd5b505050506040513d602081101561299657600080fd5b810190808051906020019092919050505090506129f2670de0b6b3a76400006129e46129df6129d9633b9aca006129cb611aa4565b612dac90919063ffffffff16565b8561331d565b6135fe565b612e3290919063ffffffff16565b91505090565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ab9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612af357600080fd5b8015612b5a576001600360146101000a81548160ff02191690831515021790555081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612bb7565b6000600360146101000a81548160ff02191690831515021790555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b60048060000154908060010154908060020154908060030154908060040154908060050154905086565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000612c5562989680612c47633b9aca00612c39612c25612903565b600460000154612dac90919063ffffffff16565b61384d90919063ffffffff16565b612e3290919063ffffffff16565b9050600460020154811015612c6d5760046002015490505b90565b6000612d3f620186a0612d316004600301547f000000000000000000000000b16a16b498840b172db683bd2903126d358e298873ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612ce857600080fd5b505afa158015612cfc573d6000803e3d6000fd5b505050506040513d6020811015612d1257600080fd5b8101908080519060200190929190505050612dac90919063ffffffff16565b612e3290919063ffffffff16565b905090565b600080612d5c601154436132d390919063ffffffff16565b9050612d8a600460010154612d7c83601054612dac90919063ffffffff16565b612e3290919063ffffffff16565b9150601054821115612d9c5760105491505b5090565b60115481565b60105481565b600080831415612dbf5760009050612e2c565b6000828402905082848281612dd057fe5b0414612e27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061415b6021913960400191505060405180910390fd5b809150505b92915050565b6000612e7483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a3b565b905092915050565b600082612f55577f000000000000000000000000b16a16b498840b172db683bd2903126d358e298873ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612f1457600080fd5b505af1158015612f28573d6000803e3d6000fd5b505050506040513d6020811015612f3e57600080fd5b8101908080519060200190929190505050506132c9565b600360149054906101000a900460ff1615613109577f000000000000000000000000b16a16b498840b172db683bd2903126d358e298873ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561301d57600080fd5b505af1158015613031573d6000803e3d6000fd5b505050506040513d602081101561304757600080fd5b810190808051906020019092919050505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b1580156130ec57600080fd5b505af1158015613100573d6000803e3d6000fd5b505050506132c8565b7f000000000000000000000000b16a16b498840b172db683bd2903126d358e298873ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156131bc57600080fd5b505af11580156131d0573d6000803e3d6000fd5b505050506040513d60208110156131e657600080fd5b810190808051906020019092919050505050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637acb775783866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15801561328b57600080fd5b505af115801561329f573d6000803e3d6000fd5b505050506040513d60208110156132b557600080fd5b8101908080519060200190929190505050505b5b8190509392505050565b600061331583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613b01565b905092915050565b6133256140bb565b6000821161337e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806141356026913960400191505060405180910390fd5b60008314156133bc57604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090506135f8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff71ffffffffffffffffffffffffffffffffffff1683116134f557600082607060ff1685901b8161340957fe5b0490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168111156134c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150506135f8565b6000613511846e01000000000000000000000000000085613bc1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168111156135c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4669786564506f696e743a3a6672616374696f6e3a206f766572666c6f77000081525060200191505060405180910390fd5b6040518060200160405280827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509150505b92915050565b60006612725dd1d243ab82600001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168161363257fe5b049050919050565b613656613645612d44565b6010546132d390919063ffffffff16565b60108190555043601181905550565b60006136b1629896806136a3633b9aca00613695613681612903565b600460000154612dac90919063ffffffff16565b61384d90919063ffffffff16565b612e3290919063ffffffff16565b90506004600201548110156136cd5760046002015490506136e7565b6000600460020154146136e65760006004600201819055505b5b90565b6137a5846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c83565b50505050565b6138488363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c83565b505050565b6000808284019050838110156138cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b60006138f4600a60030154600a6004015461384d90919063ffffffff16565b90506000600a600101541415801561390c5750804310155b15613a385760006004600001549050600a60000160009054906101000a900460ff161561397b57613950600a6001015460046000015461384d90919063ffffffff16565b600460000181905550600a6002015460046000015410613976576000600a600101819055505b6139bf565b613998600a600101546004600001546132d390919063ffffffff16565b600460000181905550600a60020154600460000154116139be576000600a600101819055505b5b43600a600401819055507fb923e581a0f83128e9e1d8297aa52b18d6744310476e0b54509c054cd7a93b2a81600460000154600a60010154600a60000160009054906101000a900460ff1660405180858152602001848152602001838152602001821515815260200194505050505060405180910390a1505b50565b60008083118290613ae7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613aac578082015181840152602081019050613a91565b50505050905090810190601f168015613ad95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581613af357fe5b049050809150509392505050565b6000838311158290613bae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613b73578082015181840152602081019050613b58565b50505050905090810190601f168015613ba05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000806000613bd08686613d72565b9150915060008480613bde57fe5b868809905082811115613bf2576001820391505b8083039250848210613c6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f46756c6c4d6174683a3a6d756c4469763a206f766572666c6f7700000000000081525060200191505060405180910390fd5b613c77838387613dc5565b93505050509392505050565b6060613ce5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613e629092919063ffffffff16565b9050600081511115613d6d57808060200190516020811015613d0657600080fd5b8101908080519060200190929190505050613d6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806141c3602a913960400191505060405180910390fd5b5b505050565b60008060007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80613d9f57fe5b84860990508385029250828103915082811015613dbd576001820391505b509250929050565b6000808260000383169050808381613dd957fe5b049250808581613de557fe5b0494506001818260000381613df657fe5b04018402850194506000600190508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808402600203810290508084026002038102905080840260020381029050808602925050509392505050565b6060613e718484600085613e7a565b90509392505050565b6060613e8585614080565b613ef7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613f475780518252602082019150602081019050602083039250613f24565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613fa9576040519150601f19603f3d011682016040523d82523d6000602084013e613fae565b606091505b50915091508115613fc3578092505050614078565b600081511115613fd65780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561403d578082015181840152602081019050614022565b50505050905090810190601f16801561406a5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b604051806020016040528060007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4669786564506f696e743a3a6672616374696f6e3a206469766973696f6e206279207a65726f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77536c697070616765206c696d69743a206d6f7265207468616e206d617820707269636556657374696e67206d757374206265206c6f6e676572207468616e20333620686f7572735361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a26469706673582212207519182ca4b66f8fa178220eac163432c193bf7ed3ccc6afba9b586215d9eeb164736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b16a16b498840b172db683bd2903126d358e29880000000000000000000000002885257bf9918a98e0311e0a74c8d59a3ec594380000000000000000000000005a528c546f56c8f497b60d0f0ea6cf6eb8d63c3b000000000000000000000000188ee96c4fcc5736b3c0ff40cf5310cfd99574110000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _OHM (address): 0xB16A16b498840b172Db683bd2903126D358E2988
Arg [1] : _principle (address): 0x2885257BF9918A98E0311e0A74c8D59A3EC59438
Arg [2] : _treasury (address): 0x5a528C546F56C8F497B60D0F0EA6CF6EB8d63c3b
Arg [3] : _DAO (address): 0x188Ee96C4FcC5736b3C0fF40Cf5310Cfd9957411
Arg [4] : _bondCalculator (address): 0x0000000000000000000000000000000000000000
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000b16a16b498840b172db683bd2903126d358e2988
Arg [1] : 0000000000000000000000002885257bf9918a98e0311e0a74c8d59a3ec59438
Arg [2] : 0000000000000000000000005a528c546f56c8f497b60d0f0ea6cf6eb8d63c3b
Arg [3] : 000000000000000000000000188ee96c4fcc5736b3c0ff40cf5310cfd9957411
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
21237:15951:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22041:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36406:379;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;690:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;893:144;;;:::i;:::-;;26559:422;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25704:675;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29761:1071;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22557:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22638:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1043:262;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22430:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35844:402;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1311:204;;;:::i;:::-;;22109:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;24864:595;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35246:99;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22481:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33130:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34112:309;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27571:2055;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34884:273;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22184:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;21973;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36951:234;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22351:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;22702:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34533:240;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27102:268;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22585:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22254:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33376:226;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32884:129;;;:::i;:::-;;;;;;;;;;;;;;;;;;;35437:258;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22874:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22791;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22041:34;;;:::o;36406:379::-;36490:22;36524:21;36548:28;36565:10;36548:16;:28::i;:::-;36524:52;;36583:14;36600:8;:20;36609:10;36600:20;;;;;;;;;;;;;;;:27;;;36583:44;;36657:5;36640:13;:22;36636:144;;36690:6;36673:23;;36636:144;;;36736:36;36766:5;36736:25;36747:13;36736:6;:10;;:25;;;;:::i;:::-;:29;;:36;;;;:::i;:::-;36719:53;;36636:144;36406:379;;;;;:::o;690:83::-;738:7;761:6;;;;;;;;;;;754:13;;690:83;:::o;893:144::-;826:10;816:20;;:6;;;;;;;;;;:20;;;808:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1002:1:::1;970:35;;986:6;::::0;::::1;;;;;;;;970:35;;;;;;;;;;;;1029:1;1012:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;893:144::o:0;26559:422::-;826:10;816:20;;:6;;;;;;;;;;:20;;;808:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26734:39:::1;26768:4;26734:29;26760:2;26734:5;:21;;;:25;;:29;;;;:::i;:::-;:33;;:39;;;;:::i;:::-;26720:10;:53;;26704:106;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;26832:143;;;;;;;;26853:9;26832:143;;;;;;26877:10;26832:143;;;;26904:7;26832:143;;;;26928:7;26832:143;;;;26955:12;26832:143;;::::0;26819:10:::1;:156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26559:422:::0;;;;:::o;25704:675::-;826:10;816:20;;:6;;;;;;;;;;:20;;;808:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25822:17:::1;25808:31;;;;;;;;:10;:31;;;;;;;;;25804:570;;;25880:5;25870:6;:15;;25862:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25955:6;25935:5;:17;;:26;;;;25804:570;;;25993:16;25979:30;;;;;;;;:10;:30;;;;;;;;;25975:399;;;26050:4;26040:6;:14;;26032:59;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;26118:6;26100:5;:15;;:24;;;;25975:399;;;26156:13;26142:27;;;;;;;;:10;:27;;;;;;;;;26138:236;;;26210:5;26200:6;:15;;26192:56;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;26269:6;26257:5;:9:::0;::::1;:18;;;;26138:236;;;26307:14;26293:28:::0;::::1;;;;;;;:10;:28;;;;;;;;;26289:85;;;26360:6;26344:5;:13;;:22;;;;26289:85;26138:236;25975:399;25804:570;25704:675:::0;;:::o;29761:1071::-;29828:7;29844:16;;:::i;:::-;29863:8;:20;29872:10;29863:20;;;;;;;;;;;;;;;29844:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29890:21;29914:28;29931:10;29914:16;:28::i;:::-;29890:52;;30032:5;30015:13;:22;30011:816;;30081:8;:20;30090:10;30081:20;;;;;;;;;;;;;;;;30074:27;;;;;;;;;;;;;;;;;;;;;;;;;;30148:10;30135:40;;;30160:4;:11;;;30173:1;30135:40;;;;;;;;;;;;;;;;;;;;;;;;30209:44;30221:10;30233:6;30241:4;:11;;;30209;:44::i;:::-;30202:51;;;;;;30011:816;30361:14;30378:41;30413:5;30378:30;30394:13;30378:4;:11;;;:15;;:30;;;;:::i;:::-;:34;;:41;;;;:::i;:::-;30361:58;;30490:197;;;;;;;;30514:23;30530:6;30514:4;:11;;;:15;;:23;;;;:::i;:::-;30490:197;;;;30557:50;30574:32;30591:4;:14;;;30574:12;:16;;:32;;;;:::i;:::-;30557:4;:12;;;:16;;:50;;;;:::i;:::-;30490:197;;;;30629:12;30490:197;;;;30663:4;:14;;;30490:197;;;30467:8;:20;30476:10;30467:20;;;;;;;;;;;;;;;:220;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30716:10;30703:61;;;30728:6;30736:8;:20;30745:10;30736:20;;;;;;;;;;;;;;;:27;;;30703:61;;;;;;;;;;;;;;;;;;;;;;;;30780:39;30792:10;30804:6;30812;30780:11;:39::i;:::-;30773:46;;;;;29761:1071;;;;;:::o;22557:21::-;;;;;;;;;;;;;:::o;22638:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1043:262::-;826:10;816:20;;:6;;;;;;;;;;:20;;;808:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1180:1:::1;1159:23;;:9;:23;;;;1151:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1261:9;1237:34;;1253:6;::::0;::::1;;;;;;;;1237:34;;;;;;;;;;;;1290:9;1278;;:21;;;;;;;;;;;;;;;;;;1043:262:::0;:::o;22430:22::-;;;;;;;;;;;;;:::o;35844:402::-;35926:22;35960:16;;:::i;:::-;35979:8;:20;35988:10;35979:20;;;;;;;;;;;;;;;35960:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36006:23;36032:32;36049:4;:14;;;36032:12;:16;;:32;;;;:::i;:::-;36006:58;;36071:15;36089:4;:12;;;36071:30;;36124:1;36114:7;:11;36110:131;;;36153:39;36184:7;36153:26;36173:5;36153:15;:19;;:26;;;;:::i;:::-;:30;;:39;;;;:::i;:::-;36136:56;;36110:131;;;36232:1;36215:18;;36110:131;35844:402;;;;;;:::o;1311:204::-;1390:9;;;;;;;;;;;1376:23;;:10;:23;;;1368:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1474:9;;;;;;;;;;;1450:34;;1466:6;;;;;;;;;;1450:34;;;;;;;;;;;;1500:9;;;;;;;;;;;1491:6;;:18;;;;;;;;;;;;;;;;;;1311:204::o;22109:33::-;;;:::o;24864:595::-;826:10;816:20;;:6;;;;;;;;;;:20;;;808:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25138:1:::1;25113:5;:21;;;:26;25105:71;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;25191:200;;;;;;;;25223:16;25191:200;;;;25261:12;25191:200;;;;25296:13;25191:200;;;;25329:10;25191:200;;;;25353:4;25191:200;;;;25375:8;25191:200;;::::0;25183:5:::1;:208;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25410:12;25398:9;:24;;;;25441:12;25429:9;:24;;;;24864:595:::0;;;;;;;:::o;35246:99::-;35290:7;35313:26;35327:11;:9;:11::i;:::-;35313:9;;:13;;:26;;;;:::i;:::-;35306:33;;35246:99;:::o;22481:28::-;;;;;;;;;;;;;:::o;33130:153::-;33186:7;33209:68;33272:4;33209:58;:40;33229:6;33237:11;:9;:11::i;:::-;33209:19;:40::i;:::-;:56;:58::i;:::-;:62;;:68;;;;:::i;:::-;33202:75;;33130:153;;;:::o;34112:309::-;34159:14;34186:15;34182:234;;;34221:97;34314:3;34221:78;34263:14;34247:40;;;34288:9;34247:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34221:11;:9;:11::i;:::-;:25;;:78;;;;:::i;:::-;:92;;:97;;;;:::i;:::-;34212:106;;34182:234;;;34350:58;34404:3;34350:49;34377:9;34370:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34366:32;;:2;:32;34350:11;:9;:11::i;:::-;:15;;:49;;;;:::i;:::-;:53;;:58;;;;:::i;:::-;34341:67;;34182:234;34112:309;:::o;27571:2055::-;27682:7;27728:1;27706:24;;:10;:24;;;;27698:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27759:11;:9;:11::i;:::-;27798:5;:13;;;27785:9;;:26;;27777:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27845:18;27866:16;:14;:16::i;:::-;27845:37;;27912:19;27934:12;:10;:12::i;:::-;27912:34;;27976:11;27963:9;:24;;27955:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28059:13;28085:8;28075:32;;;28108:9;28119:7;28075:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28059:68;;28134:14;28151:16;28161:5;28151:9;:16::i;:::-;28134:33;;28226:8;28216:6;:18;;28208:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28325:11;:9;:11::i;:::-;28315:6;:21;;28307:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28443:11;28457:32;28483:5;28457:21;28468:5;:9;;;28457:6;:10;;:21;;;;:::i;:::-;:25;;:32;;;;:::i;:::-;28443:46;;28496:14;28513:26;28535:3;28513:17;28523:6;28513:5;:9;;:17;;;;:::i;:::-;:21;;:26;;;;:::i;:::-;28496:43;;28712:70;28747:10;28767:4;28774:7;28719:9;28712:34;;;;:70;;;;;;:::i;:::-;28796:9;28789:25;;;28823:8;28834:7;28789:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28859:8;28849:27;;;28877:7;28886:9;28897:6;28849:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28924:1;28917:3;:8;28913:101;;28972:34;28997:3;29002;28979;28972:24;;;;:34;;;;;:::i;:::-;28913:101;29066:20;29080:5;29066:9;;:13;;:20;;;;:::i;:::-;29054:9;:32;;;;29151:166;;;;;;;;29173:39;29205:6;29173:8;:20;29182:10;29173:20;;;;;;;;;;;;;;;:27;;;:31;;:39;;;;:::i;:::-;29151:166;;;;29230:5;:17;;;29151:166;;;;29267:12;29151:166;;;;29299:10;29151:166;;;29128:8;:20;29137:10;29128:20;;;;;;;;;;;;;;;:189;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29461:10;29417:35;29434:5;:17;;;29417:12;:16;;:35;;;;:::i;:::-;29402:6;29366:112;29386:7;29366:112;;;;;;;;;;;;;;;;;;29539:11;:9;:11::i;:::-;29525:12;:10;:12::i;:::-;29507:16;:14;:16::i;:::-;29490:61;;;;;;;;;;29560:8;:6;:8::i;:::-;29614:6;29607:13;;;;;;;;27571:2055;;;;;:::o;34884:273::-;34940:7;34960:15;34956:196;;;35002:101;35099:3;35002:80;35046:14;35030:40;;;35071:9;35030:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35002:11;:9;:11::i;:::-;:27;;:80;;;;:::i;:::-;:96;;:101;;;;:::i;:::-;34986:117;;;;34956:196;35133:11;:9;:11::i;:::-;35126:18;;34884:273;;:::o;22184:28::-;;;:::o;21973:::-;;;:::o;36951:234::-;37011:4;37042:3;37032:13;;:6;:13;;;;37024:22;;;;;;37071:9;37061:19;;:6;:19;;;;37053:28;;;;;;37088:73;37116:3;37128:6;37121:24;;;37154:4;37121:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37095:6;37088:27;;;;:73;;;;;:::i;:::-;37175:4;37168:11;;36951:234;;;:::o;22351:39::-;;;:::o;22702:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34533:240::-;34575:18;34602:14;34626:3;34619:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34602:42;;34664:103;34762:4;34664:85;:59;34692:22;34710:3;34692:13;:11;:13::i;:::-;:17;;:22;;;;:::i;:::-;34716:6;34664:27;:59::i;:::-;:83;:85::i;:::-;:97;;:103;;;;:::i;:::-;34651:116;;34533:240;;:::o;27102:268::-;826:10;816:20;;:6;;;;;;;;;;:20;;;808:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27209:1:::1;27189:22;;:8;:22;;;;27181:31;;;::::0;::::1;;27223:7;27219:146;;;27253:4;27241:9;;:16;;;;;;;;;;;;;;;;;;27282:8;27266:13;;:24;;;;;;;;;;;;;;;;;;27219:146;;;27325:5;27313:9;;:17;;;;;;;;;;;;;;;;;;27349:8;27339:7;;:18;;;;;;;;;;;;;;;;;;27219:146;27102:268:::0;;:::o;22585:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22254:37::-;;;:::o;33376:226::-;33418:14;33450:63;33509:3;33450:54;33493:10;33450:38;33476:11;:9;:11::i;:::-;33450:5;:21;;;:25;;:38;;;;:::i;:::-;:42;;:54;;;;:::i;:::-;:58;;:63;;;;:::i;:::-;33441:72;;33533:5;:18;;;33524:6;:27;33520:77;;;33571:5;:18;;;33562:27;;33520:77;33376:226;:::o;32884:129::-;32926:7;32949:58;33000:6;32949:46;32979:5;:15;;;32956:3;32949:23;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;:46;;;;:::i;:::-;:50;;:58;;;;:::i;:::-;32942:65;;32884:129;:::o;35437:258::-;35479:14;35502:23;35528:27;35545:9;;35528:12;:16;;:27;;;;:::i;:::-;35502:53;;35571;35606:5;:17;;;35571:30;35585:15;35571:9;;:13;;:30;;;;:::i;:::-;:34;;:53;;;;:::i;:::-;35562:62;;35644:9;;35635:6;:18;35631:59;;;35673:9;;35664:18;;35631:59;35437:258;;:::o;22874:24::-;;;;:::o;22791:::-;;;;:::o;2057:222::-;2115:7;2140:1;2135;:6;2131:37;;;2159:1;2152:8;;;;2131:37;2176:9;2192:1;2188;:5;2176:17;;2217:1;2212;2208;:5;;;;;;:10;2200:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2272:1;2265:8;;;2057:222;;;;;:::o;2285:126::-;2343:7;2366:39;2370:1;2373;2366:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;2359:46;;2285:126;;;;:::o;31036:637::-;31145:7;31166:6;31161:486;;31231:3;31224:20;;;31245:10;31257:7;31224:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31161:486;;;31340:9;;;;;;;;;;;31336:304;;;31408:3;31401:19;;;31421:13;;;;;;;;;;;31436:7;31401:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31470:13;;;;;;;;;;;31455:35;;;31491:7;31500:10;31455:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31336:304;;;31545:3;31538:19;;;31558:7;;;;;;;;;;;31567;31538:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31595:7;;;;;;;;;;;31586:23;;;31610:7;31619:10;31586:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31336:304;31161:486;31660:7;31653:14;;31036:637;;;;;:::o;1717:130::-;1775:7;1798:43;1802:1;1805;1798:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1791:50;;1717:130;;;;:::o;19885:679::-;19981:16;;:::i;:::-;20031:1;20017:11;:15;20009:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20099:1;20086:9;:14;20082:50;;;20109:23;;;;;;;;20130:1;20109:23;;;;;20102:30;;;;20082:50;20166:2;20145:24;;:9;:24;20141:418;;20180:14;20225:11;19308:3;20198:23;;:9;:23;;20197:39;;;;;;20180:56;;20271:2;20253:21;;:6;:21;;20245:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20325:26;;;;;;;;20343:6;20325:26;;;;;20318:33;;;;;20141:418;20374:14;20391:45;20407:9;19348:31;20424:11;20391:15;:45::i;:::-;20374:62;;20471:2;20453:21;;:6;:21;;20445:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20525:26;;;;;;;;20543:6;20525:26;;;;;20518:33;;;19885:679;;;;;:::o;19726:153::-;19812:7;19857:16;19846:4;:7;;;19838:16;;:35;;;;;;19831:42;;19726:153;;;:::o;32645:112::-;32694:26;32708:11;:9;:11::i;:::-;32694:9;;:13;;:26;;;;:::i;:::-;32682:9;:38;;;;32739:12;32727:9;:24;;;;32645:112::o;33719:298::-;33759:14;33791:63;33850:3;33791:54;33834:10;33791:38;33817:11;:9;:11::i;:::-;33791:5;:21;;;:25;;:38;;;;:::i;:::-;:42;;:54;;;;:::i;:::-;:58;;:63;;;;:::i;:::-;33782:72;;33874:5;:18;;;33865:6;:27;33861:151;;;33912:5;:18;;;33903:27;;33861:151;;;33970:1;33948:5;:18;;;:23;33944:68;;34003:1;33982:5;:18;;:22;;;;33944:68;33861:151;33719:298;:::o;16388:245::-;16510:117;16538:5;16575:27;;;16604:4;16610:2;16614:5;16552:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16510:19;:117::i;:::-;16388:245;;;;:::o;16170:212::-;16269:107;16297:5;16334:23;;;16359:2;16363:5;16311:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16269:19;:107::i;:::-;16170:212;;;:::o;1544:167::-;1602:7;1618:9;1634:1;1630;:5;1618:17;;1655:1;1650;:6;;1642:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1704:1;1697:8;;;1544:167;;;;:::o;31757:835::-;31791:22;31816:43;31841:10;:17;;;31816:10;:20;;;:24;;:43;;;;:::i;:::-;31791:68;;31889:1;31870:10;:15;;;:20;;:54;;;;;31910:14;31894:12;:30;;31870:54;31866:721;;;31935:15;31953:5;:21;;;31935:39;;31987:10;:14;;;;;;;;;;;;31983:404;;;32038:42;32064:10;:15;;;32038:5;:21;;;:25;;:42;;;;:::i;:::-;32014:5;:21;;:66;;;;32120:10;:17;;;32095:5;:21;;;:42;32091:92;;32170:1;32152:10;:15;;:19;;;;32091:92;31983:404;;;32233:42;32259:10;:15;;;32233:5;:21;;;:25;;:42;;;;:::i;:::-;32209:5;:21;;:66;;;;32315:10;:17;;;32290:5;:21;;;:42;32286:92;;32365:1;32347:10;:15;;:19;;;;32286:92;31983:404;32418:12;32395:10;:20;;:35;;;;32444:135;32480:7;32498:5;:21;;;32530:10;:15;;;32556:10;:14;;;;;;;;;;;;32444:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31866:721;;31757:835;:::o;2417:195::-;2523:7;2551:1;2547;:5;2554:12;2539:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2574:9;2590:1;2586;:5;;;;;;2574:17;;2605:1;2598:8;;;2417:195;;;;;:::o;1853:198::-;1959:7;1988:1;1983;:6;;1991:12;1975:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2011:9;2027:1;2023;:5;2011:17;;2044:1;2037:8;;;1853:198;;;;;:::o;18842:307::-;18934:7;18951:9;18962;18975:13;18983:1;18986;18975:7;:13::i;:::-;18950:38;;;;18995:10;19021:1;19008:15;;;;;19018:1;19015;19008:15;18995:28;;19039:1;19034:2;:6;19030:18;;;19047:1;19042:6;;;;19030:18;19060:2;19055:7;;;;19081:1;19077;:5;19069:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19127:16;19135:1;19138;19141;19127:7;:16::i;:::-;19120:23;;;;;18842:307;;;;;:::o;17734:447::-;17811:23;17837:90;17873:4;17837:90;;;;;;;;;;;;;;;;;17845:5;17837:27;;;;:90;;;;;:::i;:::-;17811:116;;17958:1;17938:10;:17;:21;17934:242;;;18085:10;18074:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18056:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17934:242;17734:447;;;:::o;18210:210::-;18286:9;18297;18318:10;18352:2;18331:25;;;;;18341:1;18338;18331:25;18318:38;;18371:1;18367;:5;18363:9;;18388:1;18383:2;:6;18379:10;;18405:1;18400:2;:6;18396:18;;;18413:1;18408:6;;;;18396:18;18210:210;;;;;;:::o;18426:410::-;18518:7;18534:12;18554:1;18553:2;;18549:1;:6;18534:21;;18567:4;18562:9;;;;;;;;;18583:4;18578:9;;;;;;;;;18621:1;18614:4;18606;18605:5;;18604:14;;;;;;:18;18599:1;:24;18594:29;;;;18630:9;18642:1;18630:13;;18663:1;18659;:5;18655:1;:9;18650:14;;;;18684:1;18680;:5;18676:1;:9;18671:14;;;;18705:1;18701;:5;18697:1;:9;18692:14;;;;18726:1;18722;:5;18718:1;:9;18713:14;;;;18747:1;18743;:5;18739:1;:9;18734:14;;;;18768:1;18764;:5;18760:1;:9;18755:14;;;;18789:1;18785;:5;18781:1;:9;18776:14;;;;18810:1;18806;:5;18802:1;:9;18797:14;;;;18829:1;18825;:5;18818:12;;;;18426:410;;;;;:::o;4052:210::-;4175:12;4203:53;4226:6;4234:4;4240:1;4243:12;4203:22;:53::i;:::-;4196:60;;4052:210;;;;;:::o;5124:900::-;5279:12;5308:18;5319:6;5308:10;:18::i;:::-;5300:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5426:12;5440:23;5467:6;:11;;5486:8;5504:4;5467:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5425:90;;;;5526:7;5522:497;;;5551:10;5544:17;;;;;;5522:497;5669:1;5649:10;:17;:21;5645:367;;;5878:10;5872:17;5929:15;5916:10;5912:2;5908:19;5901:44;5836:120;5989:12;5982:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5124:900;;;;;;;:::o;3229:225::-;3289:4;3302:12;3412:7;3400:20;3392:28;;3447:1;3440:4;:8;3433:15;;;3229:225;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://7519182ca4b66f8fa178220eac163432c193bf7ed3ccc6afba9b586215d9eeb1
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.