Overview
ETH Balance
0.000082364970059884 ETH
Eth Value
$0.29 (@ $3,467.58/ETH)More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 520 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Register New Bon... | 11222995 | 1530 days ago | IN | 0 ETH | 0.00115599 | ||||
Register New Bon... | 11222992 | 1530 days ago | IN | 0 ETH | 0.00120076 | ||||
Register New Bon... | 11222983 | 1530 days ago | IN | 0 ETH | 0.00059277 | ||||
Register New Bon... | 11222975 | 1530 days ago | IN | 0 ETH | 0.00062019 | ||||
Exchange Equival... | 11222891 | 1530 days ago | IN | 0 ETH | 0.00088529 | ||||
Exchange Equival... | 11222843 | 1530 days ago | IN | 0 ETH | 0.00099862 | ||||
Exchange Equival... | 11222792 | 1530 days ago | IN | 0 ETH | 0.00110241 | ||||
Exchange Equival... | 11222785 | 1530 days ago | IN | 0 ETH | 0.00114233 | ||||
Reverse Bond To ... | 10873287 | 1584 days ago | IN | 0 ETH | 0.00346777 | ||||
Reverse Bond To ... | 10872843 | 1584 days ago | IN | 0 ETH | 0.00724636 | ||||
Reverse Bond To ... | 10872793 | 1584 days ago | IN | 0 ETH | 0.0153536 | ||||
Reverse Bond To ... | 10872787 | 1584 days ago | IN | 0 ETH | 0.0153536 | ||||
Reverse Bond To ... | 10872782 | 1584 days ago | IN | 0 ETH | 0.00679316 | ||||
Reverse Bond To ... | 10872778 | 1584 days ago | IN | 0 ETH | 0.0131752 | ||||
Reverse Bond To ... | 10872724 | 1584 days ago | IN | 0 ETH | 0.0061756 | ||||
Exchange Equival... | 10872710 | 1584 days ago | IN | 0 ETH | 0.050598 | ||||
Register New Bon... | 10872710 | 1584 days ago | IN | 0 ETH | 0.02108138 | ||||
Reverse Bond To ... | 10872672 | 1584 days ago | IN | 0 ETH | 0.00605208 | ||||
Reverse Bond To ... | 10872642 | 1584 days ago | IN | 0 ETH | 0.00642387 | ||||
Reverse Bond To ... | 10872419 | 1584 days ago | IN | 0 ETH | 0.0077195 | ||||
Reverse Bond To ... | 10872354 | 1584 days ago | IN | 0 ETH | 0.00889286 | ||||
Reverse Bond To ... | 10872143 | 1584 days ago | IN | 0 ETH | 0.01025149 | ||||
Reverse Bond To ... | 10872112 | 1584 days ago | IN | 0 ETH | 0.01228944 | ||||
Reverse Bond To ... | 10872052 | 1584 days ago | IN | 0 ETH | 0.00753569 | ||||
Reverse Bond To ... | 10871971 | 1584 days ago | IN | 0 ETH | 0.01185945 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
20264669 | 193 days ago | Contract Creation | 0 ETH | |||
20264669 | 193 days ago | Contract Creation | 0 ETH | |||
11168285 | 1539 days ago | 1.19238 ETH | ||||
11167725 | 1539 days ago | 1.19238 ETH | ||||
11167725 | 1539 days ago | 1.002 ETH | ||||
10872793 | 1584 days ago | 43.177 ETH | ||||
10872787 | 1584 days ago | 25,700 ETH | ||||
10872782 | 1584 days ago | 19.66304941 ETH | ||||
10872724 | 1584 days ago | 3.08910966 ETH | ||||
10872672 | 1584 days ago | 7.49999958 ETH | ||||
10872642 | 1584 days ago | 150.85399833 ETH | ||||
10872419 | 1584 days ago | 9.99999937 ETH | ||||
10872354 | 1584 days ago | 7.75013255 ETH | ||||
10872143 | 1584 days ago | 19.99997214 ETH | ||||
10872117 | 1584 days ago | 0.026 ETH | ||||
10872117 | 1584 days ago | 13.026 ETH | ||||
10872112 | 1584 days ago | 21.90937125 ETH | ||||
10872052 | 1584 days ago | 124.62003236 ETH | ||||
10871971 | 1584 days ago | 292.69599707 ETH | ||||
10871914 | 1584 days ago | 148.04549842 ETH | ||||
10871700 | 1584 days ago | 19.99999941 ETH | ||||
10871353 | 1584 days ago | 20.47690916 ETH | ||||
10870848 | 1584 days ago | 19.9999995 ETH | ||||
10870718 | 1584 days ago | 19.99999944 ETH | ||||
10870599 | 1584 days ago | 0.05 ETH |
Loading...
Loading
Contract Name:
BondMaker
Compiler Version
v0.6.6+commit.6c089d02
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-08-31 */ pragma solidity 0.6.6; // File: @openzeppelin/contracts/math/SafeMath.sol /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/math/SignedSafeMath.sol /** * @title SignedSafeMath * @dev Signed math operations with safety checks that revert on error. */ library SignedSafeMath { int256 constant private _INT256_MIN = -2**255; /** * @dev Multiplies two signed integers, reverts on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow"); int256 c = a * b; require(c / a == b, "SignedSafeMath: multiplication overflow"); return c; } /** * @dev Integer division of two signed integers truncating the quotient, reverts on division by zero. */ function div(int256 a, int256 b) internal pure returns (int256) { require(b != 0, "SignedSafeMath: division by zero"); require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow"); int256 c = a / b; return c; } /** * @dev Subtracts two signed integers, reverts on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow"); return c; } /** * @dev Adds two signed integers, reverts on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow"); return c; } } // File: @openzeppelin/contracts/utils/SafeCast.sol /** * @dev Wrappers over Solidity's uintXX casting operators with added overflow * checks. * * Downcasting from uint256 in Solidity does not revert on overflow. This can * easily result in undesired exploitation or bugs, since developers usually * assume that overflows raise errors. `SafeCast` restores this intuition by * reverting the transaction when such an operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. * * Can be combined with {SafeMath} to extend it to smaller types, by performing * all math on `uint256` and then downcasting. */ library SafeCast { /** * @dev Returns the downcasted uint128 from uint256, reverting on * overflow (when the input is greater than largest uint128). * * Counterpart to Solidity's `uint128` operator. * * Requirements: * * - input must fit into 128 bits */ function toUint128(uint256 value) internal pure returns (uint128) { require(value < 2**128, "SafeCast: value doesn\'t fit in 128 bits"); return uint128(value); } /** * @dev Returns the downcasted uint64 from uint256, reverting on * overflow (when the input is greater than largest uint64). * * Counterpart to Solidity's `uint64` operator. * * Requirements: * * - input must fit into 64 bits */ function toUint64(uint256 value) internal pure returns (uint64) { require(value < 2**64, "SafeCast: value doesn\'t fit in 64 bits"); return uint64(value); } /** * @dev Returns the downcasted uint32 from uint256, reverting on * overflow (when the input is greater than largest uint32). * * Counterpart to Solidity's `uint32` operator. * * Requirements: * * - input must fit into 32 bits */ function toUint32(uint256 value) internal pure returns (uint32) { require(value < 2**32, "SafeCast: value doesn\'t fit in 32 bits"); return uint32(value); } /** * @dev Returns the downcasted uint16 from uint256, reverting on * overflow (when the input is greater than largest uint16). * * Counterpart to Solidity's `uint16` operator. * * Requirements: * * - input must fit into 16 bits */ function toUint16(uint256 value) internal pure returns (uint16) { require(value < 2**16, "SafeCast: value doesn\'t fit in 16 bits"); return uint16(value); } /** * @dev Returns the downcasted uint8 from uint256, reverting on * overflow (when the input is greater than largest uint8). * * Counterpart to Solidity's `uint8` operator. * * Requirements: * * - input must fit into 8 bits. */ function toUint8(uint256 value) internal pure returns (uint8) { require(value < 2**8, "SafeCast: value doesn\'t fit in 8 bits"); return uint8(value); } /** * @dev Converts a signed int256 into an unsigned uint256. * * Requirements: * * - input must be greater than or equal to 0. */ function toUint256(int256 value) internal pure returns (uint256) { require(value >= 0, "SafeCast: value must be positive"); return uint256(value); } /** * @dev Converts an unsigned uint256 into a signed int256. * * Requirements: * * - input must be less than or equal to maxInt256. */ function toInt256(uint256 value) internal pure returns (int256) { require(value < 2**255, "SafeCast: value doesn't fit in an int256"); return int256(value); } } // File: contracts/math/UseSafeMath.sol /** * @notice ((a - 1) / b) + 1 = (a + b -1) / b * for example a.add(10**18 -1).div(10**18) = a.sub(1).div(10**18) + 1 */ library SafeMathDivRoundUp { using SafeMath for uint256; function divRoundUp( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { if (a == 0) { return 0; } require(b > 0, errorMessage); return ((a - 1) / b) + 1; } function divRoundUp(uint256 a, uint256 b) internal pure returns (uint256) { return divRoundUp(a, b, "SafeMathDivRoundUp: modulo by zero"); } } /** * @title UseSafeMath * @dev One can use SafeMath for not only uint256 but also uin64 or uint16, * and also can use SafeCast for uint256. * For example: * uint64 a = 1; * uint64 b = 2; * a = a.add(b).toUint64() // `a` become 3 as uint64 * In additionally, one can use SignedSafeMath and SafeCast.toUint256(int256) for int256. * In the case of the operation to the uint64 value, one need to cast the value into int256 in * advance to use `sub` as SignedSafeMath.sub not SafeMath.sub. * For example: * int256 a = 1; * uint64 b = 2; * int256 c = 3; * a = a.add(int256(b).sub(c)); // `a` become 0 as int256 * b = a.toUint256().toUint64(); // `b` become 0 as uint64 */ abstract contract UseSafeMath { using SafeMath for uint256; using SafeMathDivRoundUp for uint256; using SafeMath for uint64; using SafeMathDivRoundUp for uint64; using SafeMath for uint16; using SignedSafeMath for int256; using SafeCast for uint256; using SafeCast for int256; } // File: contracts/BondMakerInterface.sol interface BondMakerInterface { event LogNewBond( bytes32 indexed bondID, address bondTokenAddress, uint64 stableStrikePrice, bytes32 fnMapID ); event LogNewBondGroup(uint256 indexed bondGroupID); event LogIssueNewBonds( uint256 indexed bondGroupID, address indexed issuer, uint256 amount ); event LogReverseBondToETH( uint256 indexed bondGroupID, address indexed owner, uint256 amount ); event LogExchangeEquivalentBonds( address indexed owner, uint256 indexed inputBondGroupID, uint256 indexed outputBondGroupID, uint256 amount ); event LogTransferETH( address indexed from, address indexed to, uint256 value ); function registerNewBond(uint256 maturity, bytes calldata fnMap) external returns ( bytes32 bondID, address bondTokenAddress, uint64 solidStrikePrice, bytes32 fnMapID ); function registerNewBondGroup( bytes32[] calldata bondIDList, uint256 maturity ) external returns (uint256 bondGroupID); function issueNewBonds(uint256 bondGroupID) external payable returns (uint256 amount); function reverseBondToETH(uint256 bondGroupID, uint256 amount) external returns (bool success); function exchangeEquivalentBonds( uint256 inputBondGroupID, uint256 outputBondGroupID, uint256 amount, bytes32[] calldata exceptionBonds ) external returns (bool); function liquidateBond(uint256 bondGroupID, uint256 oracleHintID) external; function getBond(bytes32 bondID) external view returns ( address bondAddress, uint256 maturity, uint64 solidStrikePrice, bytes32 fnMapID ); function getFnMap(bytes32 fnMapID) external view returns (bytes memory fnMap); function getBondGroup(uint256 bondGroupID) external view returns (bytes32[] memory bondIDs, uint256 maturity); function generateBondID(uint256 maturity, bytes calldata functionHash) external pure returns (bytes32 bondID); } // File: contracts/util/Time.sol abstract contract Time { function _getBlockTimestampSec() internal view returns (uint256 unixtimesec) { unixtimesec = now; // solium-disable-line security/no-block-members } } // File: contracts/util/TransferETHInterface.sol interface TransferETHInterface { receive() external payable; event LogTransferETH( address indexed from, address indexed to, uint256 value ); } // File: contracts/util/TransferETH.sol abstract contract TransferETH is TransferETHInterface { receive() external override payable { emit LogTransferETH(msg.sender, address(this), msg.value); } function _hasSufficientBalance(uint256 amount) internal view returns (bool ok) { address thisContract = address(this); return amount <= thisContract.balance; } /** * @notice transfer `amount` ETH to the `recipient` account with emitting log */ function _transferETH( address payable recipient, uint256 amount, string memory errorMessage ) internal { require(_hasSufficientBalance(amount), errorMessage); (bool success, ) = recipient.call{value: amount}(""); require(success, "transferring Ether failed"); emit LogTransferETH(address(this), recipient, amount); } function _transferETH(address payable recipient, uint256 amount) internal { _transferETH( recipient, amount, "TransferETH: transfer amount exceeds balance" ); } } // File: @openzeppelin/contracts/GSN/Context.sol /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/utils/Address.sol /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20MinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _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); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } // File: contracts/bondToken/BondTokenInterface.sol interface BondTokenInterface is TransferETHInterface, IERC20 { event LogExpire( uint128 rateNumerator, uint128 rateDenominator, bool firstTime ); function mint(address account, uint256 amount) external returns (bool success); function expire(uint128 rateNumerator, uint128 rateDenominator) external returns (bool firstTime); function burn(uint256 amount) external returns (bool success); function burnAll() external returns (uint256 amount); function isMinter(address account) external view returns (bool minter); function getRate() external view returns (uint128 rateNumerator, uint128 rateDenominator); } // File: contracts/util/DeployerRole.sol abstract contract DeployerRole { address internal immutable _deployer; modifier onlyDeployer() { require( _isDeployer(msg.sender), "only deployer is allowed to call this function" ); _; } constructor() public { _deployer = msg.sender; } function _isDeployer(address account) internal view returns (bool) { return account == _deployer; } } // File: contracts/bondToken/BondToken.sol contract BondToken is DeployerRole, BondTokenInterface, TransferETH, ERC20 { struct Frac128x128 { uint128 numerator; uint128 denominator; } Frac128x128 internal _rate; constructor(string memory name, string memory symbol) public ERC20(name, symbol) { _setupDecimals(8); } function mint(address account, uint256 amount) public virtual override onlyDeployer returns (bool success) { require(!isExpired(), "this token contract has expired"); _mint(account, amount); return true; } function transfer(address recipient, uint256 amount) public override(ERC20, IERC20) returns (bool success) { _transfer(msg.sender, recipient, amount); return true; } function transferFrom( address sender, address recipient, uint256 amount ) public override(ERC20, IERC20) returns (bool success) { _transfer(sender, recipient, amount); _approve( sender, msg.sender, allowance(sender, msg.sender).sub( amount, "ERC20: transfer amount exceeds allowance" ) ); return true; } /** * @dev Record the settlement price at maturity in the form of a fraction and let the bond * token expire. */ function expire(uint128 rateNumerator, uint128 rateDenominator) public override onlyDeployer returns (bool isFirstTime) { isFirstTime = !isExpired(); if (isFirstTime) { _setRate(Frac128x128(rateNumerator, rateDenominator)); } emit LogExpire(rateNumerator, rateDenominator, isFirstTime); } function simpleBurn(address from, uint256 amount) public onlyDeployer returns (bool) { if (amount > balanceOf(from)) { return false; } _burn(from, amount); return true; } function burn(uint256 amount) public override returns (bool success) { if (!isExpired()) { return false; } _burn(msg.sender, amount); if (_rate.numerator != 0) { uint256 withdrawAmount = amount .mul(10**(18 - 8)) .mul(_rate.numerator) .div(_rate.denominator); _transferETH( msg.sender, withdrawAmount, "system error: insufficient balance" ); } return true; } function burnAll() public override returns (uint256 amount) { amount = balanceOf(msg.sender); bool success = burn(amount); if (!success) { amount = 0; } } /** * @dev rateDenominator never be zero due to div() function, thus initial _rateDenominator is 0 * can be used for flag of non-expired; */ function isExpired() public view returns (bool) { return _rate.denominator != 0; } function isMinter(address account) public override view returns (bool) { return _isDeployer(account); } function getRate() public override view returns (uint128 rateNumerator, uint128 rateDenominator) { rateNumerator = _rate.numerator; rateDenominator = _rate.denominator; } function _setRate(Frac128x128 memory rate) internal { require( rate.denominator != 0, "system error: the exchange rate must be non-negative number" ); _rate = rate; } } // File: contracts/util/Polyline.sol contract Polyline is UseSafeMath { struct Point { uint64 x; // Value of the x-axis of the x-y plane uint64 y; // Value of the y-axis of the x-y plane } struct LineSegment { Point left; // The left end of the line definition range Point right; // The right end of the line definition range } /** * @notice Return the value of y corresponding to x on the given line line in the form of * a rational number (numerator / denominator). * If you treat a line as a line segment instead of a line, you should run * includesDomain(line, x) to check whether x is included in the line's domain or not. * @dev To guarantee accuracy, the bit length of the denominator must be greater than or equal * to the bit length of x, and the bit length of the numerator must be greater than or equal * to the sum of the bit lengths of x and y. */ function _mapXtoY(LineSegment memory line, uint64 x) internal pure returns (uint128 numerator, uint64 denominator) { int256 x1 = int256(line.left.x); int256 y1 = int256(line.left.y); int256 x2 = int256(line.right.x); int256 y2 = int256(line.right.y); require(x2 > x1, "must be left.x < right.x"); denominator = uint64(x2 - x1); // Calculate y = ((x2 - x) * y1 + (x - x1) * y2) / (x2 - x1) // in the form of a fraction (numerator / denominator). int256 n = (x - x1) * y2 + (x2 - x) * y1; require(n >= 0, "underflow n"); require(n < 2**128, "system error: overflow n"); numerator = uint128(n); } /** * @notice Checking that a line segment is a line segment of a valid format. */ function assertLineSegment(LineSegment memory segment) internal pure { uint64 x1 = segment.left.x; uint64 x2 = segment.right.x; require(x1 < x2, "must be left.x < right.x"); } /** * @notice Checking that a polyline is a line graph of a valid form. */ function assertPolyline(LineSegment[] memory polyline) internal pure { uint256 numOfSegment = polyline.length; require(numOfSegment > 0, "polyline must not be empty array"); // About the first line segment. LineSegment memory firstSegment = polyline[0]; // The beginning of the first line segment's domain is 0. require( firstSegment.left.x == uint64(0), "the x coordinate of left end of the first segment is 0" ); // The value of y when x is 0 is 0. require( firstSegment.left.y == uint64(0), "the y coordinate of left end of the first segment is 0" ); // About the last line segment. LineSegment memory lastSegment = polyline[numOfSegment - 1]; // The slope of the last line segment should be between 0 and 1. int256 gradientNumerator = int256(lastSegment.right.y).sub( lastSegment.left.y ); int256 gradientDenominator = int256(lastSegment.right.x).sub( lastSegment.left.x ); require( gradientNumerator >= 0 && gradientNumerator <= gradientDenominator, "the gradient of last line segment must be non-negative number equal to or less than 1" ); // Making sure that the first line segment is in the correct format. assertLineSegment(firstSegment); // The end of the domain of a segment and the beginning of the domain of the adjacent // segment coincide. for (uint256 i = 1; i < numOfSegment; i++) { LineSegment memory leftSegment = polyline[i - 1]; LineSegment memory rightSegment = polyline[i]; // Make sure that the i-th line segment is in the correct format. assertLineSegment(rightSegment); // Checking that the x-coordinates are same. require( leftSegment.right.x == rightSegment.left.x, "given polyline is not single-valued function." ); // Checking that the y-coordinates are same. require( leftSegment.right.y == rightSegment.left.y, "given polyline is not continuous function" ); } } /** * @notice zip a LineSegment structure to uint256 * @return zip uint256( 0 ... 0 | x1 | y1 | x2 | y2 ) */ function zipLineSegment(LineSegment memory segment) internal pure returns (uint256 zip) { uint256 x1U256 = uint256(segment.left.x) << (64 + 64 + 64); // uint64 uint256 y1U256 = uint256(segment.left.y) << (64 + 64); // uint64 uint256 x2U256 = uint256(segment.right.x) << 64; // uint64 uint256 y2U256 = uint256(segment.right.y); // uint64 zip = x1U256 | y1U256 | x2U256 | y2U256; } /** * @notice unzip uint256 to a LineSegment structure */ function unzipLineSegment(uint256 zip) internal pure returns (LineSegment memory) { uint64 x1 = uint64(zip >> (64 + 64 + 64)); uint64 y1 = uint64(zip >> (64 + 64)); uint64 x2 = uint64(zip >> 64); uint64 y2 = uint64(zip); return LineSegment({ left: Point({x: x1, y: y1}), right: Point({x: x2, y: y2}) }); } /** * @notice unzip the fnMap to uint256[]. */ function decodePolyline(bytes memory fnMap) internal pure returns (uint256[] memory) { return abi.decode(fnMap, (uint256[])); } } // File: contracts/oracle/OracleInterface.sol // Oracle referenced by OracleProxy must implement this interface. interface OracleInterface { // Returns if oracle is running. function alive() external view returns (bool); // Returns latest id. // The first id is 1 and 0 value is invalid as id. // Each price values and theirs timestamps are identified by id. // Ids are assigned incrementally to values. function latestId() external returns (uint256); // Returns latest price value. // decimal 8 function latestPrice() external returns (uint256); // Returns timestamp of latest price. function latestTimestamp() external returns (uint256); // Returns price of id. function getPrice(uint256 id) external returns (uint256); // Returns timestamp of id. function getTimestamp(uint256 id) external returns (uint256); function getVolatility() external returns (uint256); } // File: contracts/oracle/UseOracle.sol abstract contract UseOracle { OracleInterface internal _oracleContract; constructor(address contractAddress) public { require( contractAddress != address(0), "contract should be non-zero address" ); _oracleContract = OracleInterface(contractAddress); } /// @notice Get the latest USD/ETH price and historical volatility using oracle. /// @return rateETH2USDE8 (10^-8 USD/ETH) /// @return volatilityE8 (10^-8) function _getOracleData() internal returns (uint256 rateETH2USDE8, uint256 volatilityE8) { rateETH2USDE8 = _oracleContract.latestPrice(); volatilityE8 = _oracleContract.getVolatility(); return (rateETH2USDE8, volatilityE8); } /// @notice Get the price of the oracle data with a minimum timestamp that does more than input value /// when you know the ID you are looking for. /// @param timestamp is the timestamp that you want to get price. /// @param hintID is the ID of the oracle data you are looking for. /// @return rateETH2USDE8 (10^-8 USD/ETH) function _getPriceOn(uint256 timestamp, uint256 hintID) internal returns (uint256 rateETH2USDE8) { uint256 latestID = _oracleContract.latestId(); require( latestID != 0, "system error: the ID of oracle data should not be zero" ); require(hintID != 0, "the hint ID must not be zero"); uint256 id = hintID; if (hintID > latestID) { id = latestID; } require( _oracleContract.getTimestamp(id) > timestamp, "there is no price data after maturity" ); id--; while (id != 0) { if (_oracleContract.getTimestamp(id) <= timestamp) { break; } id--; } return _oracleContract.getPrice(id + 1); } } // File: contracts/bondTokenName/BondTokenNameInterface.sol /** * @title bond token name contract interface */ interface BondTokenNameInterface { function genBondTokenName( string calldata shortNamePrefix, string calldata longNamePrefix, uint256 maturity, uint256 solidStrikePriceE4 ) external pure returns (string memory shortName, string memory longName); function getBondTokenName( uint256 maturity, uint256 solidStrikePriceE4, uint256 rateLBTWorthlessE4 ) external pure returns (string memory shortName, string memory longName); } // File: contracts/UseBondTokenName.sol abstract contract UseBondTokenName { BondTokenNameInterface internal immutable _bondTokenNameContract; constructor(address contractAddress) public { require( contractAddress != address(0), "contract should be non-zero address" ); _bondTokenNameContract = BondTokenNameInterface(contractAddress); } } // File: contracts/BondMaker.sol contract BondMaker is UseSafeMath, BondMakerInterface, Time, TransferETH, Polyline, UseOracle, UseBondTokenName { uint8 internal constant DECIMALS_OF_BOND_AMOUNT = 8; address internal immutable LIEN_TOKEN_ADDRESS; uint256 internal immutable MATURITY_SCALE; uint256 public nextBondGroupID = 1; /** * @dev The contents in this internal storage variable can be seen by getBond function. */ struct BondInfo { uint256 maturity; BondToken contractInstance; uint64 solidStrikePriceE4; bytes32 fnMapID; } mapping(bytes32 => BondInfo) internal _bonds; /** * @notice mapping fnMapID to polyline * @dev The contents in this internal storage variable can be seen by getFnMap function. */ mapping(bytes32 => LineSegment[]) internal _registeredFnMap; /** * @dev The contents in this internal storage variable can be seen by getBondGroup function. */ struct BondGroup { bytes32[] bondIDs; uint256 maturity; } mapping(uint256 => BondGroup) internal _bondGroupList; constructor( address oracleAddress, address lienTokenAddress, address bondTokenNameAddress, uint256 maturityScale ) public UseOracle(oracleAddress) UseBondTokenName(bondTokenNameAddress) { LIEN_TOKEN_ADDRESS = lienTokenAddress; require(maturityScale != 0, "MATURITY_SCALE must be positive"); MATURITY_SCALE = maturityScale; } /** * @notice Create bond token contract. * The name of this bond token is its bond ID. * @dev To convert bytes32 to string, encode its bond ID at first, then convert to string. * The symbol of any bond token with bond ID is either SBT or LBT; * As SBT is a special case of bond token, any bond token which does not match to the form of * SBT is defined as LBT. */ function registerNewBond(uint256 maturity, bytes memory fnMap) public override returns ( bytes32, address, uint64, bytes32 ) { require( maturity > _getBlockTimestampSec(), "the maturity has already expired" ); require(maturity % MATURITY_SCALE == 0, "maturity must be HH:00:00"); bytes32 bondID = generateBondID(maturity, fnMap); // Check if the same form of bond is already registered. // Cannot detect if the bond is described in a different polyline while two are // mathematically equivalent. require( address(_bonds[bondID].contractInstance) == address(0), "already register given bond type" ); // Register function mapping if necessary. bytes32 fnMapID = generateFnMapID(fnMap); if (_registeredFnMap[fnMapID].length == 0) { uint256[] memory polyline = decodePolyline(fnMap); for (uint256 i = 0; i < polyline.length; i++) { _registeredFnMap[fnMapID].push(unzipLineSegment(polyline[i])); } assertPolyline(_registeredFnMap[fnMapID]); } uint64 solidStrikePrice = _getSolidStrikePrice( _registeredFnMap[fnMapID] ); uint64 rateLBTWorthless = _getRateLBTWorthless( _registeredFnMap[fnMapID] ); ( string memory shortName, string memory longName ) = _bondTokenNameContract.getBondTokenName( maturity, solidStrikePrice, rateLBTWorthless ); BondToken bondTokenContract = _createNewBondToken(longName, shortName); // Set bond info to storage. _bonds[bondID] = BondInfo({ maturity: maturity, contractInstance: bondTokenContract, solidStrikePriceE4: solidStrikePrice, fnMapID: fnMapID }); emit LogNewBond( bondID, address(bondTokenContract), solidStrikePrice, fnMapID ); return (bondID, address(bondTokenContract), solidStrikePrice, fnMapID); } function _assertBondGroup(bytes32[] memory bondIDs, uint256 maturity) internal view { /** * @dev Count the number of the end points on x axis. In the case of a simple SBT/LBT split, * 3 for SBT plus 3 for LBT equals to 6. * In the case of SBT with the strike price 100, (x,y) = (0,0), (100,100), (200,100) defines * the form of SBT on the field. * In the case of LBT with the strike price 100, (x,y) = (0,0), (100,0), (200,100) defines * the form of LBT on the field. * Right hand side area of the last grid point is expanded on the last line to the infinity. * @param nextBreakPointIndex returns the number of unique points on x axis. * In the case of SBT and LBT with the strike price 100, x = 0,100,200 are the unique points * and the number is 3. */ uint256 numOfBreakPoints = 0; for (uint256 i = 0; i < bondIDs.length; i++) { BondInfo storage bond = _bonds[bondIDs[i]]; require( bond.maturity == maturity, "the maturity of the bonds must be same" ); LineSegment[] storage polyline = _registeredFnMap[bond.fnMapID]; numOfBreakPoints = numOfBreakPoints.add(polyline.length); } uint256 nextBreakPointIndex = 0; uint64[] memory rateBreakPoints = new uint64[](numOfBreakPoints); for (uint256 i = 0; i < bondIDs.length; i++) { BondInfo storage bond = _bonds[bondIDs[i]]; LineSegment[] storage segments = _registeredFnMap[bond.fnMapID]; for (uint256 j = 0; j < segments.length; j++) { uint64 breakPoint = segments[j].right.x; bool ok = false; for (uint256 k = 0; k < nextBreakPointIndex; k++) { if (rateBreakPoints[k] == breakPoint) { ok = true; break; } } if (ok) { continue; } rateBreakPoints[nextBreakPointIndex] = breakPoint; nextBreakPointIndex++; } } for (uint256 k = 0; k < rateBreakPoints.length; k++) { uint64 rate = rateBreakPoints[k]; uint256 totalBondPriceN = 0; uint256 totalBondPriceD = 1; for (uint256 i = 0; i < bondIDs.length; i++) { BondInfo storage bond = _bonds[bondIDs[i]]; LineSegment[] storage segments = _registeredFnMap[bond.fnMapID]; (uint256 segmentIndex, bool ok) = _correspondSegment( segments, rate ); require(ok, "invalid domain expression"); (uint128 n, uint64 d) = _mapXtoY(segments[segmentIndex], rate); if (n != 0) { // totalBondPrice += (n / d); // N = D*n + N*d, D = D*d totalBondPriceN = totalBondPriceD.mul(n).add( totalBondPriceN.mul(d) ); totalBondPriceD = totalBondPriceD.mul(d); } } /** * @dev Ensure that totalBondPrice (= totalBondPriceN / totalBondPriceD) is the same * with rate. Because we need 1 Ether to mint a unit of each bond token respectively, * the sum of strike price (USD) per a unit of bond token is the same with USD/ETH * rate at maturity. */ require( totalBondPriceN == totalBondPriceD.mul(rate), "the total price at any rateBreakPoints should be the same value as the rate" ); } } /** * @notice Collect bondIDs that regenerate the original ETH, and group them as a bond group. * Any bond is described as a set of linear functions(i.e. polyline), * so we can easily check if the set of bondIDs are well-formed by looking at all the end * points of the lines. */ function registerNewBondGroup(bytes32[] memory bondIDs, uint256 maturity) public override returns (uint256 bondGroupID) { _assertBondGroup(bondIDs, maturity); // Get and increment next bond group ID bondGroupID = nextBondGroupID; nextBondGroupID = nextBondGroupID.add(1); _bondGroupList[bondGroupID] = BondGroup(bondIDs, maturity); emit LogNewBondGroup(bondGroupID); return bondGroupID; } /** * @notice A user needs to issue a bond via BondGroup in order to guarantee that the total value * of bonds in the bond group equals to the input Ether except for about 0.2% fee (accurately 2/1002). */ function issueNewBonds(uint256 bondGroupID) public override payable returns (uint256) { BondGroup storage bondGroup = _bondGroupList[bondGroupID]; bytes32[] storage bondIDs = bondGroup.bondIDs; require( _getBlockTimestampSec() < bondGroup.maturity, "the maturity has already expired" ); uint256 fee = msg.value.mul(2).div(1002); uint256 amount = msg.value.sub(fee).div(10**10); // ether's decimal is 18 and that of LBT is 8; bytes32 bondID; for ( uint256 bondFnMapIndex = 0; bondFnMapIndex < bondIDs.length; bondFnMapIndex++ ) { bondID = bondIDs[bondFnMapIndex]; _issueNewBond(bondID, msg.sender, amount); } _transferETH(payable(LIEN_TOKEN_ADDRESS), fee); emit LogIssueNewBonds(bondGroupID, msg.sender, amount); return amount; } /** * @notice redeems ETH from the total set of bonds in the bondGroupID before maturity date. */ function reverseBondToETH(uint256 bondGroupID, uint256 amountE8) public override returns (bool) { BondGroup storage bondGroup = _bondGroupList[bondGroupID]; bytes32[] storage bondIDs = bondGroup.bondIDs; require( _getBlockTimestampSec() < bondGroup.maturity, "the maturity has already expired" ); bytes32 bondID; for ( uint256 bondFnMapIndex = 0; bondFnMapIndex < bondIDs.length; bondFnMapIndex++ ) { bondID = bondIDs[bondFnMapIndex]; _burnBond(bondID, msg.sender, amountE8); } _transferETH( msg.sender, amountE8.mul(10**10), "system error: insufficient Ether balance" ); emit LogReverseBondToETH(bondGroupID, msg.sender, amountE8.mul(10**10)); return true; } /** * @notice Burns set of LBTs and mints equivalent set of LBTs that are not in the exception list. * @param inputBondGroupID is the BondGroupID of bonds which you want to burn. * @param outputBondGroupID is the BondGroupID of bonds which you want to mint. * @param exceptionBonds is the list of bondIDs that should be excluded in burn/mint process. */ function exchangeEquivalentBonds( uint256 inputBondGroupID, uint256 outputBondGroupID, uint256 amount, bytes32[] memory exceptionBonds ) public override returns (bool) { (bytes32[] memory inputIDs, uint256 inputMaturity) = getBondGroup( inputBondGroupID ); (bytes32[] memory outputIDs, uint256 outputMaturity) = getBondGroup( outputBondGroupID ); require( inputMaturity == outputMaturity, "cannot exchange bonds with different maturities" ); require( _getBlockTimestampSec() < inputMaturity, "the maturity has already expired" ); bool flag; uint256 exceptionCount; for (uint256 i = 0; i < inputIDs.length; i++) { // this flag control checks whether the bond is in the scope of burn/mint flag = true; for (uint256 j = 0; j < exceptionBonds.length; j++) { if (exceptionBonds[j] == inputIDs[i]) { flag = false; // this count checks if all the bondIDs in exceptionBonds are included both in inputBondGroupID and outputBondGroupID exceptionCount = exceptionCount.add(1); } } if (flag) { _burnBond(inputIDs[i], msg.sender, amount); } } require( exceptionBonds.length == exceptionCount, "All the exceptionBonds need to be included in input" ); for (uint256 i = 0; i < outputIDs.length; i++) { flag = true; for (uint256 j = 0; j < exceptionBonds.length; j++) { if (exceptionBonds[j] == outputIDs[i]) { flag = false; exceptionCount = exceptionCount.sub(1); } } if (flag) { _issueNewBond(outputIDs[i], msg.sender, amount); } } require( exceptionCount == 0, "All the exceptionBonds need to be included both in input and output" ); emit LogExchangeEquivalentBonds( msg.sender, inputBondGroupID, outputBondGroupID, amount ); return true; } /** * @notice Distributes ETH to the bond token holders after maturity date based on the oracle price. * @param oracleHintID is manyally set to be smaller number than the oracle latestId when the caller wants to save gas. */ function liquidateBond(uint256 bondGroupID, uint256 oracleHintID) public override { if (oracleHintID == 0) { _distributeETH2BondTokenContract( bondGroupID, _oracleContract.latestId() ); } else { _distributeETH2BondTokenContract(bondGroupID, oracleHintID); } } /** * @notice Returns multiple information for the bondID. */ function getBond(bytes32 bondID) public override view returns ( address bondTokenAddress, uint256 maturity, uint64 solidStrikePrice, bytes32 fnMapID ) { BondInfo memory bondInfo = _bonds[bondID]; bondTokenAddress = address(bondInfo.contractInstance); maturity = bondInfo.maturity; solidStrikePrice = bondInfo.solidStrikePriceE4; fnMapID = bondInfo.fnMapID; } /** * @dev Returns polyline for the fnMapID. */ function getFnMap(bytes32 fnMapID) public override view returns (bytes memory) { LineSegment[] storage segments = _registeredFnMap[fnMapID]; uint256[] memory polyline = new uint256[](segments.length); for (uint256 i = 0; i < segments.length; i++) { polyline[i] = zipLineSegment(segments[i]); } return abi.encode(polyline); } /** * @dev Returns all the bondIDs and their maturity for the bondGroupID. */ function getBondGroup(uint256 bondGroupID) public virtual override view returns (bytes32[] memory bondIDs, uint256 maturity) { BondGroup memory bondGroup = _bondGroupList[bondGroupID]; bondIDs = bondGroup.bondIDs; maturity = bondGroup.maturity; } /** * @dev Returns keccak256 for the fnMap. */ function generateFnMapID(bytes memory fnMap) public pure returns (bytes32) { return keccak256(fnMap); } /** * @dev Returns keccak256 for the pair of maturity and fnMap. */ function generateBondID(uint256 maturity, bytes memory fnMap) public override pure returns (bytes32) { return keccak256(abi.encodePacked(maturity, fnMap)); } function _createNewBondToken(string memory name, string memory symbol) internal virtual returns (BondToken) { return new BondToken(name, symbol); } function _issueNewBond( bytes32 bondID, address account, uint256 amount ) internal { BondToken bondTokenContract = _bonds[bondID].contractInstance; require( address(bondTokenContract) != address(0), "the bond is not registered" ); require( bondTokenContract.mint(account, amount), "failed to mint bond token" ); } function _burnBond( bytes32 bondID, address account, uint256 amount ) internal { BondToken bondTokenContract = _bonds[bondID].contractInstance; require( address(bondTokenContract) != address(0), "the bond is not registered" ); require( bondTokenContract.simpleBurn(account, amount), "failed to burn bond token" ); } function _distributeETH2BondTokenContract( uint256 bondGroupID, uint256 oracleHintID ) internal { BondGroup storage bondGroup = _bondGroupList[bondGroupID]; require(bondGroup.bondIDs.length > 0, "the bond group does not exist"); require( _getBlockTimestampSec() >= bondGroup.maturity, "the bond has not expired yet" ); // rateETH2USDE8 is the USD/ETH price multiplied by 10^8 returned from the oracle. uint256 rateETH2USDE8 = _getPriceOn(bondGroup.maturity, oracleHintID); // rateETH2USDE8 needs to be converted to rateETH2USDE4 as to match the decimal of the // values in segment. uint256 rateETH2USDE4 = rateETH2USDE8.div(10000); require( rateETH2USDE4 != 0, "system error: rate should be non-zero value" ); require( rateETH2USDE4 < 2**64, "system error: rate should be less than the maximum value of uint64" ); for (uint256 i = 0; i < bondGroup.bondIDs.length; i++) { bytes32 bondID = bondGroup.bondIDs[i]; BondToken bondTokenContract = _bonds[bondID].contractInstance; require( address(bondTokenContract) != address(0), "the bond is not registered" ); LineSegment[] storage segments = _registeredFnMap[_bonds[bondID] .fnMapID]; (uint256 segmentIndex, bool ok) = _correspondSegment( segments, uint64(rateETH2USDE4) ); require( ok, "system error: did not found a segment whose price range include USD/ETH rate" ); LineSegment storage segment = segments[segmentIndex]; (uint128 n, uint64 _d) = _mapXtoY(segment, uint64(rateETH2USDE4)); // uint64(-1) * uint64(-1) < uint128(-1) uint128 d = uint128(_d) * uint128(rateETH2USDE4); uint256 totalSupply = bondTokenContract.totalSupply(); bool expiredFlag = bondTokenContract.expire(n, d); if (expiredFlag) { uint256 payment = totalSupply.mul(10**(18 - 8)).mul(n).div(d); _transferETH( address(bondTokenContract), payment, "system error: BondMaker's balance is less than payment" ); } } } /** * @dev Return the strike price only when the form of polyline matches to the definition of SBT. * Check if the form is SBT even when the polyline is in a verbose style. */ function _getSolidStrikePrice(LineSegment[] memory polyline) internal pure returns (uint64) { uint64 solidStrikePrice = polyline[0].right.x; if (solidStrikePrice == 0) { return 0; } for (uint256 i = 0; i < polyline.length; i++) { LineSegment memory segment = polyline[i]; if (segment.right.y != solidStrikePrice) { return 0; } } return uint64(solidStrikePrice); } /** * @dev Only when the form of polyline matches to the definition of LBT, this function returns * the minimum USD/ETH rate that LBT is not worthless. * Check if the form is LBT even when the polyline is in a verbose style. */ function _getRateLBTWorthless(LineSegment[] memory polyline) internal pure returns (uint64) { uint64 rateLBTWorthless = polyline[0].right.x; if (rateLBTWorthless == 0) { return 0; } for (uint256 i = 0; i < polyline.length; i++) { LineSegment memory segment = polyline[i]; if (segment.right.y.add(rateLBTWorthless) != segment.right.x) { return 0; } } return uint64(rateLBTWorthless); } /** * @dev In order to calculate y axis value for the corresponding x axis value, we need to find * the place of domain of x value on the polyline. * As the polyline is already checked to be correctly formed, we can simply look from the right * hand side of the polyline. */ function _correspondSegment(LineSegment[] memory segments, uint64 x) internal pure returns (uint256 i, bool ok) { i = segments.length; while (i > 0) { i--; if (segments[i].left.x <= x) { ok = true; break; } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"oracleAddress","type":"address"},{"internalType":"address","name":"lienTokenAddress","type":"address"},{"internalType":"address","name":"bondTokenNameAddress","type":"address"},{"internalType":"uint256","name":"maturityScale","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"inputBondGroupID","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"outputBondGroupID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogExchangeEquivalentBonds","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"bondGroupID","type":"uint256"},{"indexed":true,"internalType":"address","name":"issuer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogIssueNewBonds","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"bondID","type":"bytes32"},{"indexed":false,"internalType":"address","name":"bondTokenAddress","type":"address"},{"indexed":false,"internalType":"uint64","name":"stableStrikePrice","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"fnMapID","type":"bytes32"}],"name":"LogNewBond","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"bondGroupID","type":"uint256"}],"name":"LogNewBondGroup","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"bondGroupID","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogReverseBondToETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"LogTransferETH","type":"event"},{"inputs":[{"internalType":"uint256","name":"inputBondGroupID","type":"uint256"},{"internalType":"uint256","name":"outputBondGroupID","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"exceptionBonds","type":"bytes32[]"}],"name":"exchangeEquivalentBonds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"bytes","name":"fnMap","type":"bytes"}],"name":"generateBondID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"fnMap","type":"bytes"}],"name":"generateFnMapID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"bondID","type":"bytes32"}],"name":"getBond","outputs":[{"internalType":"address","name":"bondTokenAddress","type":"address"},{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"uint64","name":"solidStrikePrice","type":"uint64"},{"internalType":"bytes32","name":"fnMapID","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bondGroupID","type":"uint256"}],"name":"getBondGroup","outputs":[{"internalType":"bytes32[]","name":"bondIDs","type":"bytes32[]"},{"internalType":"uint256","name":"maturity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"fnMapID","type":"bytes32"}],"name":"getFnMap","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"bondGroupID","type":"uint256"}],"name":"issueNewBonds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bondGroupID","type":"uint256"},{"internalType":"uint256","name":"oracleHintID","type":"uint256"}],"name":"liquidateBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nextBondGroupID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"maturity","type":"uint256"},{"internalType":"bytes","name":"fnMap","type":"bytes"}],"name":"registerNewBond","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint64","name":"","type":"uint64"},{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"bondIDs","type":"bytes32[]"},{"internalType":"uint256","name":"maturity","type":"uint256"}],"name":"registerNewBondGroup","outputs":[{"internalType":"uint256","name":"bondGroupID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bondGroupID","type":"uint256"},{"internalType":"uint256","name":"amountE8","type":"uint256"}],"name":"reverseBondToETH","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e0604052600180553480156200001557600080fd5b5060405162005e6c38038062005e6c833981810160405260808110156200003b57600080fd5b508051602082015160408301516060909301519192909181846001600160a01b038116620000b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018062005e496023913960400191505060405180910390fd5b600080546001600160a01b0319166001600160a01b0392831617905581166200012a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018062005e496023913960400191505060405180910390fd5b6001600160601b0319606091821b81166080529084901b1660a05280620001b257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d415455524954595f5343414c45206d75737420626520706f73697469766500604482015290519081900360640190fd5b60c05250505060805160601c60a05160601c60c051615c5e620001eb60003980610e475250806117ae5250806112c15250615c5e6000f3fe608060405260043610620000df5760003560e01c80637369bcaa116200007f578063e59455e01162000055578063e59455e0146200061b578063f2eefd8014620006d4578063ff23a08f146200075f576200011e565b80637369bcaa14620004de5780638376c24d14620005e3578063ac3fd8861462000603576200011e565b806356481cb411620000b557806356481cb414620003485780636d17f16814620003ee5780636f23bd4014620004a8576200011e565b806326d6c97b14620001235780632770aa641462000197578063529aa16b146200026a576200011e565b366200011e57604080513481529051309133917fdd4e7375a5084e0c4cc4e1bfc7ba67beb26a368120ea78d2e0948123910bbf7c9181900360200190a3005b600080fd5b3480156200013057600080fd5b5062000151600480360360208110156200014957600080fd5b503562000793565b6040805173ffffffffffffffffffffffffffffffffffffffff9095168552602085019390935267ffffffffffffffff909116838301526060830152519081900360800190f35b348015620001a457600080fd5b506200025860048036036040811015620001bd57600080fd5b81359190810190604081016020820135640100000000811115620001e057600080fd5b820183602082011115620001f357600080fd5b803590602001918460018302840111640100000000831117156200021657600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955062000826945050505050565b60408051918252519081900360200190f35b3480156200027757600080fd5b5062000334600480360360808110156200029057600080fd5b81359160208101359160408201359190810190608081016060820135640100000000811115620002bf57600080fd5b820183602082011115620002d257600080fd5b80359060200191846020830284011164010000000083111715620002f557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550620008c7945050505050565b604080519115158252519081900360200190f35b3480156200035557600080fd5b5062000376600480360360208110156200036e57600080fd5b503562000ba4565b6040805160208082528351818301528351919283929083019185019080838360005b83811015620003b257818101518382015260200162000398565b50505050905090810190601f168015620003e05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015620003fb57600080fd5b5062000258600480360360208110156200041457600080fd5b8101906020810181356401000000008111156200043057600080fd5b8201836020820111156200044357600080fd5b803590602001918460018302840111640100000000831117156200046657600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955062000d17945050505050565b348015620004b557600080fd5b50620004dc60048036036040811015620004ce57600080fd5b508035906020013562000d22565b005b348015620004eb57600080fd5b506200059f600480360360408110156200050457600080fd5b813591908101906040810160208201356401000000008111156200052757600080fd5b8201836020820111156200053a57600080fd5b803590602001918460018302840111640100000000831117156200055d57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955062000de1945050505050565b6040805194855273ffffffffffffffffffffffffffffffffffffffff909316602085015267ffffffffffffffff909116838301526060830152519081900360800190f35b6200025860048036036020811015620005fb57600080fd5b5035620016ac565b3480156200061057600080fd5b506200025862001815565b3480156200062857600080fd5b5062000258600480360360408110156200064157600080fd5b8101906020810181356401000000008111156200065d57600080fd5b8201836020820111156200067057600080fd5b803590602001918460208302840111640100000000831117156200069357600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050913592506200181b915050565b348015620006e157600080fd5b506200070260048036036020811015620006fa57600080fd5b5035620018bc565b6040518080602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156200074a57818101518382015260200162000730565b50505050905001935050505060405180910390f35b3480156200076c57600080fd5b5062000334600480360360408110156200078557600080fd5b50803590602001356200194f565b600080600080620007a362003a1c565b505050600092835250506002602081815260409283902083516080810185528154808252600183015473ffffffffffffffffffffffffffffffffffffffff811694830185905274010000000000000000000000000000000000000000900467ffffffffffffffff1695820186905291909301546060909301839052909390929190565b600082826040516020018083815260200182805190602001908083835b602083106200088257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910162000843565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040528051906020012090505b92915050565b600060606000620008d887620018bc565b9150915060606000620008eb88620018bc565b915091508083146200092f5760405162461bcd60e51b815260040180806020018281038252602f815260200180620058ad602f913960400191505060405180910390fd5b826200093a62001a93565b106200098d576040805162461bcd60e51b815260206004820181905260248201527f746865206d617475726974792068617320616c72656164792065787069726564604482015290519081900360640190fd5b600080805b865181101562000a33576001925060005b895181101562000a0157878281518110620009ba57fe5b60200260200101518a8281518110620009cf57fe5b60200260200101511415620009f85760009350620009f583600163ffffffff62001a9716565b92505b600101620009a3565b50821562000a2a5762000a2a87828151811062000a1a57fe5b6020026020010151338c62001af9565b60010162000992565b508088511462000a755760405162461bcd60e51b8152600401808060200182810382526033815260200180620059e96033913960400191505060405180910390fd5b60005b845181101562000b19576001925060005b895181101562000ae75785828151811062000aa057fe5b60200260200101518a828151811062000ab557fe5b6020026020010151141562000ade576000935062000adb83600163ffffffff62001c8216565b92505b60010162000a89565b50821562000b105762000b1085828151811062000b0057fe5b6020026020010151338c62001cc6565b60010162000a78565b50801562000b595760405162461bcd60e51b815260040180806020018281038252604381526020018062005a1c6043913960600191505060405180910390fd5b604080518a815290518b918d9133917fd7cc25b50fd05b627f35998c0c134fd1f025ced4e16b99ca2feaeb8361664d44919081900360200190a45060019a9950505050505050505050565b6000818152600360205260409020805460609190829067ffffffffffffffff8111801562000bd157600080fd5b5060405190808252806020026020018201604052801562000bfc578160200160208202803683370190505b50905060005b825481101562000cac5762000c8b83828154811062000c1d57fe5b6000918252602091829020604080516080810182526002909302909101805467ffffffffffffffff8082168585019081526801000000000000000092839004821660608701528552835180850190945260019092015480831684520416818401529181019190915262001e49565b82828151811062000c9857fe5b602090810291909101015260010162000c02565b50806040516020018080602001828103825283818151815260200191508051906020019060200280838360005b8381101562000cf357818101518382015260200162000cd9565b5050505090500192505050604051602081830303815290604052925050505b919050565b805160209091012090565b8062000dd15762000dcb826000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634bfbbe0b6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801562000d9757600080fd5b505af115801562000dac573d6000803e3d6000fd5b505050506040513d602081101562000dc357600080fd5b505162001ed2565b62000ddd565b62000ddd828262001ed2565b5050565b60008060008062000df162001a93565b861162000e45576040805162461bcd60e51b815260206004820181905260248201527f746865206d617475726974792068617320616c72656164792065787069726564604482015290519081900360640190fd5b7f0000000000000000000000000000000000000000000000000000000000000000868162000e6f57fe5b061562000ec3576040805162461bcd60e51b815260206004820152601960248201527f6d61747572697479206d7573742062652048483a30303a303000000000000000604482015290519081900360640190fd5b600062000ed1878762000826565b60008181526002602052604090206001015490915073ffffffffffffffffffffffffffffffffffffffff161562000f4f576040805162461bcd60e51b815260206004820181905260248201527f616c726561647920726567697374657220676976656e20626f6e642074797065604482015290519081900360640190fd5b600062000f5c8762000d17565b6000818152600360205260409020549091506200113d57606062000f808862002468565b905060005b815181101562001078576000838152600360205260409020825162000fbf9084908490811062000fb157fe5b602002602001015162002518565b81546001808201845560009384526020938490208351805160029094029091018054918601517fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000092831667ffffffffffffffff958616177fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff908116680100000000000000009287168302178355958701518051928501805491909801519316918516919091179094169216909202179091550162000f85565b506200113b60036000848152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015620011315760008481526020908190206040805160808101825260028602909201805467ffffffffffffffff808216858501908152680100000000000000009283900482166060870152855283518085019094526001928301548082168552919091041682850152828401919091529083529092019101620010b0565b5050505062002570565b505b60008181526003602090815260408083208054825181850281018501909352808352620011f493859084015b82821015620011ea5760008481526020908190206040805160808101825260028602909201805467ffffffffffffffff80821685850190815268010000000000000000928390048216606087015285528351808501909452600192830154808216855291909104168285015282840191909152908352909201910162001169565b5050505062002896565b90506000620012ba60036000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015620012b05760008481526020908190206040805160808101825260028602909201805467ffffffffffffffff8082168585019081526801000000000000000092839004821660608701528552835180850190945260019283015480821685529190910416828501528284019190915290835290920191016200122f565b5050505062002948565b90506060807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166317161e398d86866040518463ffffffff1660e01b8152600401808481526020018367ffffffffffffffff1681526020018267ffffffffffffffff168152602001935050505060006040518083038186803b1580156200135557600080fd5b505afa1580156200136a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040908152811015620013b257600080fd5b8101908080516040519392919084640100000000821115620013d357600080fd5b908301906020820185811115620013e957600080fd5b82516401000000008111828201881017156200140457600080fd5b82525081516020918201929091019080838360005b838110156200143357818101518382015260200162001419565b50505050905090810190601f168015620014615780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200148557600080fd5b9083019060208201858111156200149b57600080fd5b8251640100000000811182820188101715620014b657600080fd5b82525081516020918201929091019080838360005b83811015620014e5578181015183820152602001620014cb565b50505050905090810190601f168015620015135780820380516001836020036101000a031916815260200191505b506040525050509150915060006200152c828462002a19565b905060405180608001604052808e81526020018273ffffffffffffffffffffffffffffffffffffffff1681526020018667ffffffffffffffff16815260200187815250600260008981526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160020155905050867f3185f99fd61874232eddfc3d4ae727d973183fb0fbefa8dc7a443ae1c16dc5b2828789604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018367ffffffffffffffff1667ffffffffffffffff168152602001828152602001935050505060405180910390a2959c959b509299509297509295505050505050565b600081815260046020526040812060018101548190620016cb62001a93565b106200171e576040805162461bcd60e51b815260206004820181905260248201527f746865206d617475726974792068617320616c72656164792065787069726564604482015290519081900360640190fd5b6000620017476103ea6200173a34600263ffffffff62002b2516565b9063ffffffff62002b8316565b90506000620017676402540be4006200173a348563ffffffff62001c8216565b90506000805b8454811015620017a7578481815481106200178457fe5b906000526020600020015491506200179e82338562001cc6565b6001016200176d565b50620017d47f00000000000000000000000000000000000000000000000000000000000000008462002bc7565b604080518381529051339189917f58119118163827fe45f023219bbd8afd3de022473ee123ab28257e6e7cb1a5969181900360200190a35095945050505050565b60015481565b600062001829838362002bed565b5060018054906200184290829063ffffffff62001a9716565b60015560408051808201825284815260208082018590526000848152600482529290922081518051929391926200187d928492019062003a43565b506020919091015160019091015560405181907f299da85b2166984ad952bf40538a783c3ec87a2ddb1b2718ec578f7204bff2d990600090a292915050565b60606000620018ca62003a93565b60008481526004602090815260409182902082518154606093810282018401855293810184815290939192849284918401828280156200192a57602002820191906000526020600020905b81548152602001906001019080831162001915575b5050509183525050600191909101546020918201528151910151909590945092505050565b6000828152600460205260408120600181015481906200196e62001a93565b10620019c1576040805162461bcd60e51b815260206004820181905260248201527f746865206d617475726974792068617320616c72656164792065787069726564604482015290519081900360640190fd5b6000805b8254811015620019ff57828181548110620019dc57fe5b90600052602060002001549150620019f682338862001af9565b600101620019c5565b5062001a3c3362001a1c876402540be40063ffffffff62002b2516565b6040518060600160405280602881526020016200584f6028913962003139565b33867fd87ae36701fa64edb5f93045405cac815776cdad12578e706de077762be7946162001a76886402540be40063ffffffff62002b2516565b60408051918252519081900360200190a350600195945050505050565b4290565b60008282018381101562001af2576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008381526002602052604090206001015473ffffffffffffffffffffffffffffffffffffffff168062001b74576040805162461bcd60e51b815260206004820152601a60248201527f74686520626f6e64206973206e6f742072656769737465726564000000000000604482015290519081900360640190fd5b8073ffffffffffffffffffffffffffffffffffffffff1663f05fcdf284846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801562001bfc57600080fd5b505af115801562001c11573d6000803e3d6000fd5b505050506040513d602081101562001c2857600080fd5b505162001c7c576040805162461bcd60e51b815260206004820152601960248201527f6661696c656420746f206275726e20626f6e6420746f6b656e00000000000000604482015290519081900360640190fd5b50505050565b600062001af283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250620032dc565b60008381526002602052604090206001015473ffffffffffffffffffffffffffffffffffffffff168062001d41576040805162461bcd60e51b815260206004820152601a60248201527f74686520626f6e64206973206e6f742072656769737465726564000000000000604482015290519081900360640190fd5b8073ffffffffffffffffffffffffffffffffffffffff166340c10f1984846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801562001dc957600080fd5b505af115801562001dde573d6000803e3d6000fd5b505050506040513d602081101562001df557600080fd5b505162001c7c576040805162461bcd60e51b815260206004820152601960248201527f6661696c656420746f206d696e7420626f6e6420746f6b656e00000000000000604482015290519081900360640190fd5b8051805160209182015192820151805192015167ffffffffffffffff1660409290921b6fffffffffffffffff00000000000000001660c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660809390931b77ffffffffffffffff000000000000000000000000000000001692909217919091171790565b6000828152600460205260409020805462001f34576040805162461bcd60e51b815260206004820152601d60248201527f74686520626f6e642067726f757020646f6573206e6f74206578697374000000604482015290519081900360640190fd5b806001015462001f4362001a93565b101562001f97576040805162461bcd60e51b815260206004820152601c60248201527f74686520626f6e6420686173206e6f7420657870697265642079657400000000604482015290519081900360640190fd5b600062001fa982600101548462003339565b9050600062001fc18261271063ffffffff62002b8316565b905080620020015760405162461bcd60e51b815260040180806020018281038252602b81526020018062005b70602b913960400191505060405180910390fd5b6801000000000000000081106200204a5760405162461bcd60e51b815260040180806020018281038252604281526020018062005b9b6042913960600191505060405180910390fd5b60005b8354811015620024605760008460000182815481106200206957fe5b6000918252602080832090910154808352600290915260409091206001015490915073ffffffffffffffffffffffffffffffffffffffff1680620020f4576040805162461bcd60e51b815260206004820152601a60248201527f74686520626f6e64206973206e6f742072656769737465726564000000000000604482015290519081900360640190fd5b60008281526002602081815260408084209092015483526003815281832080548351818402810184019094528084529093928392620021c0928691859084015b82821015620021b55760008481526020908190206040805160808101825260028602909201805467ffffffffffffffff80821685850190815268010000000000000000928390048216606087015285528351808501909452600192830154808216855291909104168285015282840191909152908352909201910162002134565b505050508862003707565b9150915080620022025760405162461bcd60e51b815260040180806020018281038252604c81526020018062005bdd604c913960600191505060405180910390fd5b60008383815481106200221157fe5b60009182526020808320604080516080810182526002909402909101805467ffffffffffffffff8082168685019081526801000000000000000092839004821660608801528652835180850190945260018301548082168552919091041682840152918301529250819062002287908b6200376a565b9150915060008a8267ffffffffffffffff1602905060008873ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015620022e557600080fd5b505afa158015620022fa573d6000803e3d6000fd5b505050506040513d60208110156200231157600080fd5b5051604080517f903d8e770000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff808816600483015285166024820152905191925060009173ffffffffffffffffffffffffffffffffffffffff8c169163903d8e7791604480830192602092919082900301818787803b158015620023a157600080fd5b505af1158015620023b6573d6000803e3d6000fd5b505050506040513d6020811015620023cd57600080fd5b505190508015620024485760006200241e6fffffffffffffffffffffffffffffffff808616906200173a90891662002411876402540be40063ffffffff62002b2516565b9063ffffffff62002b2516565b9050620024468b8260405180606001604052806036815260200162005a5f6036913962003139565b505b5050600190990198506200204d975050505050505050565b505050505050565b60608180602001905160208110156200248057600080fd5b8101908080516040519392919084640100000000821115620024a157600080fd5b908301906020820185811115620024b757600080fd5b8251866020820283011164010000000082111715620024d557600080fd5b82525081516020918201928201910280838360005b8381101562002504578181015183820152602001620024ea565b505050509050016040525050509050919050565b6200252262003aad565b50604080516080808201835260c084901c82840190815267ffffffffffffffff9185901c821660608401528252825180840184529284901c8116835290921660208083019190915282015290565b805180620025c5576040805162461bcd60e51b815260206004820181905260248201527f706f6c796c696e65206d757374206e6f7420626520656d707479206172726179604482015290519081900360640190fd5b620025cf62003aad565b82600081518110620025dd57fe5b602090810291909101015180515190915067ffffffffffffffff1615620026365760405162461bcd60e51b8152600401808060200182810382526036815260200180620058776036913960400191505060405180910390fd5b80516020015167ffffffffffffffff1615620026845760405162461bcd60e51b815260040180806020018281038252603681526020018062005ac16036913960400191505060405180910390fd5b6200268e62003aad565b8360018403815181106200269e57fe5b602002602001015190506000620026e382600001516020015167ffffffffffffffff1683602001516020015167ffffffffffffffff16620038d290919063ffffffff16565b825151602084015151919250600091620027119167ffffffffffffffff918216911663ffffffff620038d216565b905060008212158015620027255750808213155b620027625760405162461bcd60e51b815260040180806020018281038252605581526020018062005af76055913960600191505060405180910390fd5b6200276d846200393c565b60015b858110156200288d576200278362003aad565b8760018303815181106200279357fe5b60200260200101519050620027a762003aad565b888381518110620027b457fe5b60200260200101519050620027c9816200393c565b80515160208301515167ffffffffffffffff9081169116146200281e5760405162461bcd60e51b815260040180806020018281038252602d81526020018062005927602d913960400191505060405180910390fd5b80600001516020015167ffffffffffffffff1682602001516020015167ffffffffffffffff1614620028825760405162461bcd60e51b81526004018080602001828103825260298152602001806200599f6029913960400191505060405180910390fd5b505060010162002770565b50505050505050565b60008082600081518110620028a757fe5b6020026020010151602001516000015190508067ffffffffffffffff1660001415620028d857600091505062000d12565b60005b83518110156200294157620028ef62003aad565b848281518110620028fc57fe5b602002602001015190508267ffffffffffffffff1681602001516020015167ffffffffffffffff161462002937576000935050505062000d12565b50600101620028db565b5092915050565b600080826000815181106200295957fe5b6020026020010151602001516000015190508067ffffffffffffffff16600014156200298a57600091505062000d12565b60005b83518110156200294157620029a162003aad565b848281518110620029ae57fe5b6020026020010151905080602001516000015167ffffffffffffffff16620029fc8467ffffffffffffffff1683602001516020015167ffffffffffffffff1662001a9790919063ffffffff16565b1462002a0f576000935050505062000d12565b506001016200298d565b6000828260405162002a2b9062003ad6565b604080825283519082015282518190602080830191606084019187019080838360005b8381101562002a6857818101518382015260200162002a4e565b50505050905090810190601f16801562002a965780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101562002acb57818101518382015260200162002ab1565b50505050905090810190601f16801562002af95780820380516001836020036101000a031916815260200191505b50945050505050604051809103906000f08015801562002b1d573d6000803e3d6000fd5b509392505050565b60008262002b3657506000620008c1565b8282028284828162002b4457fe5b041462001af25760405162461bcd60e51b8152600401808060200182810382526021815260200180620059c86021913960400191505060405180910390fd5b600062001af283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250620039ac565b62000ddd82826040518060600160405280602c815260200162005a95602c913962003139565b6000805b835181101562002c9f5760006002600086848151811062002c0e57fe5b6020026020010151815260200190815260200160002090508381600001541462002c6a5760405162461bcd60e51b8152600401808060200182810382526026815260200180620058dc6026913960400191505060405180910390fd5b60028101546000908152600360205260409020805462002c9290859063ffffffff62001a9716565b9350505060010162002bf1565b50600060608267ffffffffffffffff8111801562002cbc57600080fd5b5060405190808252806020026020018201604052801562002ce7578160200160208202803683370190505b50905060005b855181101562002e1f5760006002600088848151811062002d0a57fe5b60200260200101518152602001908152602001600020905060006003600083600201548152602001908152602001600020905060008090505b815481101562002e1357600082828154811062002d5c57fe5b6000918252602082206001600290920201015467ffffffffffffffff169150805b8881101562002dca578267ffffffffffffffff1688828151811062002d9e57fe5b602002602001015167ffffffffffffffff16141562002dc1576001915062002dca565b60010162002d7d565b50801562002dda57505062002e0a565b8187898151811062002de857fe5b67ffffffffffffffff9092166020928302919091019091015250506001909501945b60010162002d43565b50505060010162002ced565b5060005b81518110156200246057600082828151811062002e3c57fe5b6020908102919091010151905060006001815b8951811015620030d1576000600260008c848151811062002e6c57fe5b60200260200101518152602001908152602001600020905060006003600083600201548152602001908152602001600020905060008062002f5383805480602002602001604051908101604052809291908181526020016000905b8282101562002f485760008481526020908190206040805160808101825260028602909201805467ffffffffffffffff80821685850190815268010000000000000000928390048216606087015285528351808501909452600192830154808216855291909104168285015282840191909152908352909201910162002ec7565b505050508962003707565b915091508062002faa576040805162461bcd60e51b815260206004820152601960248201527f696e76616c696420646f6d61696e2065787072657373696f6e00000000000000604482015290519081900360640190fd5b6000806200302d85858154811062002fbe57fe5b6000918252602091829020604080516080810182526002909302909101805467ffffffffffffffff808216858501908152680100000000000000009283900482166060870152855283518085019094526001909201548083168452041681840152918101919091528b6200376a565b91509150816fffffffffffffffffffffffffffffffff16600014620030be576200309d6200306c8a67ffffffffffffffff841663ffffffff62002b2516565b620030908a6fffffffffffffffffffffffffffffffff861663ffffffff62002b2516565b9063ffffffff62001a9716565b9850620030bb8867ffffffffffffffff831663ffffffff62002b2516565b97505b50506001909401935062002e4f92505050565b50620030ee8167ffffffffffffffff851663ffffffff62002b2516565b82146200312d5760405162461bcd60e51b815260040180806020018281038252604b81526020018062005954604b913960600191505060405180910390fd5b50505060010162002e23565b620031448262003a15565b8190620031d25760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620031965781810151838201526020016200317c565b50505050905090810190601f168015620031c45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060405160009073ffffffffffffffffffffffffffffffffffffffff85169084908381818185875af1925050503d80600081146200322d576040519150601f19603f3d011682016040523d82523d6000602084013e62003232565b606091505b505090508062003289576040805162461bcd60e51b815260206004820152601960248201527f7472616e7366657272696e67204574686572206661696c656400000000000000604482015290519081900360640190fd5b60408051848152905173ffffffffffffffffffffffffffffffffffffffff86169130917fdd4e7375a5084e0c4cc4e1bfc7ba67beb26a368120ea78d2e0948123910bbf7c9181900360200190a350505050565b60008184841115620033315760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315620031965781810151838201526020016200317c565b505050900390565b60008054604080517f4bfbbe0b0000000000000000000000000000000000000000000000000000000081529051839273ffffffffffffffffffffffffffffffffffffffff1691634bfbbe0b91600480830192602092919082900301818787803b158015620033a657600080fd5b505af1158015620033bb573d6000803e3d6000fd5b505050506040513d6020811015620033d257600080fd5b5051905080620034145760405162461bcd60e51b8152600401808060200182810382526036815260200180620058196036913960400191505060405180910390fd5b8262003467576040805162461bcd60e51b815260206004820152601c60248201527f7468652068696e74204944206d757374206e6f74206265207a65726f00000000604482015290519081900360640190fd5b8281811115620034745750805b846000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b633620c836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015620034ea57600080fd5b505af1158015620034ff573d6000803e3d6000fd5b505050506040513d60208110156200351657600080fd5b505111620035565760405162461bcd60e51b8152600401808060200182810382526025815260200180620059026025913960400191505060405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b80156200365857846000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b633620c836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015620035f657600080fd5b505af11580156200360b573d6000803e3d6000fd5b505050506040513d60208110156200362257600080fd5b505111620036305762003658565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0162003579565b60008054604080517fe7572230000000000000000000000000000000000000000000000000000000008152600185016004820152905173ffffffffffffffffffffffffffffffffffffffff9092169263e7572230926024808401936020939083900390910190829087803b158015620036d057600080fd5b505af1158015620036e5573d6000803e3d6000fd5b505050506040513d6020811015620036fc57600080fd5b505195945050505050565b815160005b811562003763578180600190039250508267ffffffffffffffff168483815181106200373457fe5b6020026020010151600001516000015167ffffffffffffffff16116200375d5750600162003763565b6200370c565b9250929050565b81518051602091820151828501518051930151600093849367ffffffffffffffff908116938116929181169116838213620037ec576040805162461bcd60e51b815260206004820152601860248201527f6d757374206265206c6566742e78203c2072696768742e780000000000000000604482015290519081900360640190fd5b838203945067ffffffffffffffff8716848103820290830384020160008112156200385e576040805162461bcd60e51b815260206004820152600b60248201527f756e646572666c6f77206e000000000000000000000000000000000000000000604482015290519081900360640190fd5b7001000000000000000000000000000000008112620038c4576040805162461bcd60e51b815260206004820152601860248201527f73797374656d206572726f723a206f766572666c6f77206e0000000000000000604482015290519081900360640190fd5b989497509395505050505050565b6000818303818312801590620038e85750838113155b80620038ff5750600083128015620038ff57508381135b62001af25760405162461bcd60e51b815260040180806020018281038252602481526020018062005b4c6024913960400191505060405180910390fd5b80515160208201515167ffffffffffffffff80821690831610620039a7576040805162461bcd60e51b815260206004820152601860248201527f6d757374206265206c6566742e78203c2072696768742e780000000000000000604482015290519081900360640190fd5b505050565b60008183620039fe5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315620031965781810151838201526020016200317c565b50600083858162003a0b57fe5b0495945050505050565b3031101590565b60408051608081018252600080825260208201819052918101829052606081019190915290565b82805482825590600052602060002090810192821562003a81579160200282015b8281111562003a8157825182559160200191906001019062003a64565b5062003a8f92915062003ae4565b5090565b604051806040016040528060608152602001600081525090565b604051806040016040528062003ac262003b04565b815260200162003ad162003b04565b905290565b611cfd8062003b1c83390190565b62003b0191905b8082111562003a8f576000815560010162003aeb565b90565b60408051808201909152600080825260208201529056fe60a06040523480156200001157600080fd5b5060405162001cfd38038062001cfd833981810160405260408110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b9083019060208201858111156200006e57600080fd5b82516401000000008111828201881017156200008957600080fd5b82525081516020918201929091019080838360005b83811015620000b85781810151838201526020016200009e565b50505050905090810190601f168015620000e65780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200010a57600080fd5b9083019060208201858111156200012057600080fd5b82516401000000008111828201881017156200013b57600080fd5b82525081516020918201929091019080838360005b838110156200016a57818101518382015260200162000150565b50505050905090810190601f168015620001985780820380516001836020036101000a031916815260200191505b506040525050503360601b608052815182908290620001bf90600390602085019062000218565b508051620001d590600490602084019062000218565b50506005805460ff1916601217905550620001fa60086001600160e01b036200020216565b5050620002bd565b6005805460ff191660ff92909216919091179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200025b57805160ff19168380011785556200028b565b828001600101855582156200028b579182015b828111156200028b5782518255916020019190600101906200026e565b50620002999291506200029d565b5090565b620002ba91905b80821115620002995760008155600101620002a4565b90565b60805160601c611a22620002db600039806111475250611a226000f3fe6080604052600436106101485760003560e01c8063679aefce116100c0578063a457c2d711610074578063aa271e1a11610059578063aa271e1a1461055a578063dd62ed3e1461059a578063f05fcdf2146105e257610186565b8063a457c2d7146104ce578063a9059cbb1461051457610186565b8063903d8e77116100a5578063903d8e771461046057806395d89b41146104a45780639975038c146104b957610186565b8063679aefce146103dc57806370a082311461042057610186565b80632f13b60c1161011757806339509351116100fc578063395093511461032657806340c10f191461036c57806342966c68146103b257610186565b80632f13b60c146102e6578063313ce567146102fb57610186565b806306fdde031461018b578063095ea7b31461021557806318160ddd1461026f57806323b872dd1461029657610186565b3661018657604080513481529051309133917fdd4e7375a5084e0c4cc4e1bfc7ba67beb26a368120ea78d2e0948123910bbf7c9181900360200190a3005b600080fd5b34801561019757600080fd5b506101a0610628565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101da5781810151838201526020016101c2565b50505050905090810190601f1680156102075780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561022157600080fd5b5061025b6004803603604081101561023857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356106dc565b604080519115158252519081900360200190f35b34801561027b57600080fd5b506102846106fa565b60408051918252519081900360200190f35b3480156102a257600080fd5b5061025b600480360360608110156102b957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610700565b3480156102f257600080fd5b5061025b610755565b34801561030757600080fd5b50610310610783565b6040805160ff9092168252519081900360200190f35b34801561033257600080fd5b5061025b6004803603604081101561034957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561078c565b34801561037857600080fd5b5061025b6004803603604081101561038f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356107ed565b3480156103be57600080fd5b5061025b600480360360208110156103d557600080fd5b50356108cb565b3480156103e857600080fd5b506103f1610999565b604080516fffffffffffffffffffffffffffffffff938416815291909216602082015281519081900390910190f35b34801561042c57600080fd5b506102846004803603602081101561044357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166109ca565b34801561046c57600080fd5b5061025b6004803603604081101561048357600080fd5b506fffffffffffffffffffffffffffffffff813581169160200135166109f2565b3480156104b057600080fd5b506101a0610afe565b3480156104c557600080fd5b50610284610b7d565b3480156104da57600080fd5b5061025b600480360360408110156104f157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610ba5565b34801561052057600080fd5b5061025b6004803603604081101561053757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610c20565b34801561056657600080fd5b5061025b6004803603602081101561057d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610c2d565b3480156105a657600080fd5b50610284600480360360408110156105bd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610c38565b3480156105ee57600080fd5b5061025b6004803603604081101561060557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610c70565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106d25780601f106106a7576101008083540402835291602001916106d2565b820191906000526020600020905b8154815290600101906020018083116106b557829003601f168201915b5050505050905090565b60006106f06106e9610cf2565b8484610cf6565b5060015b92915050565b60025490565b600061070d848484610e3d565b61074b843361074685604051806060016040528060288152602001611936602891396107398a33610c38565b919063ffffffff61101916565b610cf6565b5060019392505050565b60065470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16151590565b60055460ff1690565b60006106f0610799610cf2565b8461074685600160006107aa610cf2565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6110ca16565b60006107f833611145565b61084d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806118ac602e913960400191505060405180910390fd5b610855610755565b156108c157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f7468697320746f6b656e20636f6e747261637420686173206578706972656400604482015290519081900360640190fd5b6106f08383611184565b60006108d5610755565b6108e157506000610994565b6108eb33836112c1565b6006546fffffffffffffffffffffffffffffffff161561099057600654600090610969906fffffffffffffffffffffffffffffffff700100000000000000000000000000000000820481169161095d9116610951876402540be40063ffffffff61141716565b9063ffffffff61141716565b9063ffffffff61148a16565b905061098e338260405180606001604052806022815260200161188a602291396114cc565b505b5060015b919050565b6006546fffffffffffffffffffffffffffffffff808216927001000000000000000000000000000000009092041690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b60006109fd33611145565b610a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806118ac602e913960400191505060405180910390fd5b610a5a610755565b1590508015610aa457610aa46040518060400160405280856fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff1681525061165d565b604080516fffffffffffffffffffffffffffffffff8086168252841660208201528215158183015290517fcdcd2e977c58a9c82d799c0986ab5c6fe48d43a9b96bbf60a654b46728c6f6679181900360600190a192915050565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106d25780601f106106a7576101008083540402835291602001916106d2565b6000610b88336109ca565b90506000610b95826108cb565b905080610ba157600091505b5090565b60006106f0610bb2610cf2565b84610746856040518060600160405280602581526020016119c86025913960016000610bdc610cf2565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61101916565b60006106f0338484610e3d565b60006106f482611145565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6000610c7b33611145565b610cd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806118ac602e913960400191505060405180910390fd5b610cd9836109ca565b821115610ce8575060006106f4565b6106f083836112c1565b3390565b73ffffffffffffffffffffffffffffffffffffffff8316610d62576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806119a46024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216610dce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806118426022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061197f6025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216610f15576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806117fd6023913960400191505060405180910390fd5b610f2083838361172f565b610f70816040518060600160405280602681526020016118646026913973ffffffffffffffffffffffffffffffffffffffff8616600090815260208190526040902054919063ffffffff61101916565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152602081905260408082209390935590841681522054610fb2908263ffffffff6110ca16565b73ffffffffffffffffffffffffffffffffffffffff8084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156110c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561108757818101518382015260200161106f565b50505050905090810190601f1680156110b45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008282018381101561113e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b73ffffffffffffffffffffffffffffffffffffffff821661120657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6112126000838361172f565b600254611225908263ffffffff6110ca16565b60025573ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205461125e908263ffffffff6110ca16565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff821661132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061195e6021913960400191505060405180910390fd5b6113398260008361172f565b611389816040518060600160405280602281526020016118206022913973ffffffffffffffffffffffffffffffffffffffff8516600090815260208190526040902054919063ffffffff61101916565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260409020556002546113c2908263ffffffff61173416565b60025560408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600082611426575060006106f4565b8282028284828161143357fe5b041461113e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806119156021913960400191505060405180910390fd5b600061113e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611776565b6114d5826117f5565b819061153c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561108757818101518382015260200161106f565b5060405160009073ffffffffffffffffffffffffffffffffffffffff85169084908381818185875af1925050503d8060008114611595576040519150601f19603f3d011682016040523d82523d6000602084013e61159a565b606091505b505090508061160a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f7472616e7366657272696e67204574686572206661696c656400000000000000604482015290519081900360640190fd5b60408051848152905173ffffffffffffffffffffffffffffffffffffffff86169130917fdd4e7375a5084e0c4cc4e1bfc7ba67beb26a368120ea78d2e0948123910bbf7c9181900360200190a350505050565b60208101516fffffffffffffffffffffffffffffffff166116c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001806118da603b913960400191505060405180910390fd5b8051600680546020909301516fffffffffffffffffffffffffffffffff908116700100000000000000000000000000000000029281167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941693909317909216179055565b505050565b600061113e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611019565b600081836117df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561108757818101518382015260200161106f565b5060008385816117eb57fe5b0495945050505050565b303110159056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636573797374656d206572726f723a20696e73756666696369656e742062616c616e63656f6e6c79206465706c6f79657220697320616c6c6f77656420746f2063616c6c20746869732066756e6374696f6e73797374656d206572726f723a207468652065786368616e67652072617465206d757374206265206e6f6e2d6e65676174697665206e756d626572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212204d7f6c98e7947c587cb2cacbbd60112ff671feabdd34e2fe6aaa8e4e36045e5964736f6c6343000606003373797374656d206572726f723a20746865204944206f66206f7261636c6520646174612073686f756c64206e6f74206265207a65726f73797374656d206572726f723a20696e73756666696369656e742045746865722062616c616e6365746865207820636f6f7264696e617465206f66206c65667420656e64206f6620746865206669727374207365676d656e74206973203063616e6e6f742065786368616e676520626f6e6473207769746820646966666572656e74206d617475726974696573746865206d61747572697479206f662074686520626f6e6473206d7573742062652073616d657468657265206973206e6f2070726963652064617461206166746572206d61747572697479676976656e20706f6c796c696e65206973206e6f742073696e676c652d76616c7565642066756e6374696f6e2e74686520746f74616c20707269636520617420616e792072617465427265616b506f696e74732073686f756c64206265207468652073616d652076616c7565206173207468652072617465676976656e20706f6c796c696e65206973206e6f7420636f6e74696e756f75732066756e6374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77416c6c2074686520657863657074696f6e426f6e6473206e65656420746f20626520696e636c7564656420696e20696e707574416c6c2074686520657863657074696f6e426f6e6473206e65656420746f20626520696e636c7564656420626f746820696e20696e70757420616e64206f757470757473797374656d206572726f723a20426f6e644d616b657227732062616c616e6365206973206c657373207468616e207061796d656e745472616e736665724554483a207472616e7366657220616d6f756e7420657863656564732062616c616e6365746865207920636f6f7264696e617465206f66206c65667420656e64206f6620746865206669727374207365676d656e742069732030746865206772616469656e74206f66206c617374206c696e65207365676d656e74206d757374206265206e6f6e2d6e65676174697665206e756d62657220657175616c20746f206f72206c657373207468616e20315369676e6564536166654d6174683a207375627472616374696f6e206f766572666c6f7773797374656d206572726f723a20726174652073686f756c64206265206e6f6e2d7a65726f2076616c756573797374656d206572726f723a20726174652073686f756c64206265206c657373207468616e20746865206d6178696d756d2076616c7565206f662075696e74363473797374656d206572726f723a20646964206e6f7420666f756e642061207365676d656e742077686f73652070726963652072616e676520696e636c756465205553442f4554482072617465a26469706673582212204278218a946c2ad66e5cf564df612117578f94a8b00397a2d9afe188b652056d64736f6c63430006060033636f6e74726163742073686f756c64206265206e6f6e2d7a65726f2061646472657373000000000000000000000000120a078fdc516a1a98bbecb9e961f8741ac7ac82000000000000000000000000ab37e1358b639fd877f015027bb62d3ddaa7557e0000000000000000000000000b06dada89d0df1c9162c97009af56509caeed720000000000000000000000000000000000000000000000000000000000000e10
Deployed Bytecode
0x608060405260043610620000df5760003560e01c80637369bcaa116200007f578063e59455e01162000055578063e59455e0146200061b578063f2eefd8014620006d4578063ff23a08f146200075f576200011e565b80637369bcaa14620004de5780638376c24d14620005e3578063ac3fd8861462000603576200011e565b806356481cb411620000b557806356481cb414620003485780636d17f16814620003ee5780636f23bd4014620004a8576200011e565b806326d6c97b14620001235780632770aa641462000197578063529aa16b146200026a576200011e565b366200011e57604080513481529051309133917fdd4e7375a5084e0c4cc4e1bfc7ba67beb26a368120ea78d2e0948123910bbf7c9181900360200190a3005b600080fd5b3480156200013057600080fd5b5062000151600480360360208110156200014957600080fd5b503562000793565b6040805173ffffffffffffffffffffffffffffffffffffffff9095168552602085019390935267ffffffffffffffff909116838301526060830152519081900360800190f35b348015620001a457600080fd5b506200025860048036036040811015620001bd57600080fd5b81359190810190604081016020820135640100000000811115620001e057600080fd5b820183602082011115620001f357600080fd5b803590602001918460018302840111640100000000831117156200021657600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955062000826945050505050565b60408051918252519081900360200190f35b3480156200027757600080fd5b5062000334600480360360808110156200029057600080fd5b81359160208101359160408201359190810190608081016060820135640100000000811115620002bf57600080fd5b820183602082011115620002d257600080fd5b80359060200191846020830284011164010000000083111715620002f557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550620008c7945050505050565b604080519115158252519081900360200190f35b3480156200035557600080fd5b5062000376600480360360208110156200036e57600080fd5b503562000ba4565b6040805160208082528351818301528351919283929083019185019080838360005b83811015620003b257818101518382015260200162000398565b50505050905090810190601f168015620003e05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015620003fb57600080fd5b5062000258600480360360208110156200041457600080fd5b8101906020810181356401000000008111156200043057600080fd5b8201836020820111156200044357600080fd5b803590602001918460018302840111640100000000831117156200046657600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955062000d17945050505050565b348015620004b557600080fd5b50620004dc60048036036040811015620004ce57600080fd5b508035906020013562000d22565b005b348015620004eb57600080fd5b506200059f600480360360408110156200050457600080fd5b813591908101906040810160208201356401000000008111156200052757600080fd5b8201836020820111156200053a57600080fd5b803590602001918460018302840111640100000000831117156200055d57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955062000de1945050505050565b6040805194855273ffffffffffffffffffffffffffffffffffffffff909316602085015267ffffffffffffffff909116838301526060830152519081900360800190f35b6200025860048036036020811015620005fb57600080fd5b5035620016ac565b3480156200061057600080fd5b506200025862001815565b3480156200062857600080fd5b5062000258600480360360408110156200064157600080fd5b8101906020810181356401000000008111156200065d57600080fd5b8201836020820111156200067057600080fd5b803590602001918460208302840111640100000000831117156200069357600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050913592506200181b915050565b348015620006e157600080fd5b506200070260048036036020811015620006fa57600080fd5b5035620018bc565b6040518080602001838152602001828103825284818151815260200191508051906020019060200280838360005b838110156200074a57818101518382015260200162000730565b50505050905001935050505060405180910390f35b3480156200076c57600080fd5b5062000334600480360360408110156200078557600080fd5b50803590602001356200194f565b600080600080620007a362003a1c565b505050600092835250506002602081815260409283902083516080810185528154808252600183015473ffffffffffffffffffffffffffffffffffffffff811694830185905274010000000000000000000000000000000000000000900467ffffffffffffffff1695820186905291909301546060909301839052909390929190565b600082826040516020018083815260200182805190602001908083835b602083106200088257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910162000843565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040528051906020012090505b92915050565b600060606000620008d887620018bc565b9150915060606000620008eb88620018bc565b915091508083146200092f5760405162461bcd60e51b815260040180806020018281038252602f815260200180620058ad602f913960400191505060405180910390fd5b826200093a62001a93565b106200098d576040805162461bcd60e51b815260206004820181905260248201527f746865206d617475726974792068617320616c72656164792065787069726564604482015290519081900360640190fd5b600080805b865181101562000a33576001925060005b895181101562000a0157878281518110620009ba57fe5b60200260200101518a8281518110620009cf57fe5b60200260200101511415620009f85760009350620009f583600163ffffffff62001a9716565b92505b600101620009a3565b50821562000a2a5762000a2a87828151811062000a1a57fe5b6020026020010151338c62001af9565b60010162000992565b508088511462000a755760405162461bcd60e51b8152600401808060200182810382526033815260200180620059e96033913960400191505060405180910390fd5b60005b845181101562000b19576001925060005b895181101562000ae75785828151811062000aa057fe5b60200260200101518a828151811062000ab557fe5b6020026020010151141562000ade576000935062000adb83600163ffffffff62001c8216565b92505b60010162000a89565b50821562000b105762000b1085828151811062000b0057fe5b6020026020010151338c62001cc6565b60010162000a78565b50801562000b595760405162461bcd60e51b815260040180806020018281038252604381526020018062005a1c6043913960600191505060405180910390fd5b604080518a815290518b918d9133917fd7cc25b50fd05b627f35998c0c134fd1f025ced4e16b99ca2feaeb8361664d44919081900360200190a45060019a9950505050505050505050565b6000818152600360205260409020805460609190829067ffffffffffffffff8111801562000bd157600080fd5b5060405190808252806020026020018201604052801562000bfc578160200160208202803683370190505b50905060005b825481101562000cac5762000c8b83828154811062000c1d57fe5b6000918252602091829020604080516080810182526002909302909101805467ffffffffffffffff8082168585019081526801000000000000000092839004821660608701528552835180850190945260019092015480831684520416818401529181019190915262001e49565b82828151811062000c9857fe5b602090810291909101015260010162000c02565b50806040516020018080602001828103825283818151815260200191508051906020019060200280838360005b8381101562000cf357818101518382015260200162000cd9565b5050505090500192505050604051602081830303815290604052925050505b919050565b805160209091012090565b8062000dd15762000dcb826000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634bfbbe0b6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801562000d9757600080fd5b505af115801562000dac573d6000803e3d6000fd5b505050506040513d602081101562000dc357600080fd5b505162001ed2565b62000ddd565b62000ddd828262001ed2565b5050565b60008060008062000df162001a93565b861162000e45576040805162461bcd60e51b815260206004820181905260248201527f746865206d617475726974792068617320616c72656164792065787069726564604482015290519081900360640190fd5b7f0000000000000000000000000000000000000000000000000000000000000e10868162000e6f57fe5b061562000ec3576040805162461bcd60e51b815260206004820152601960248201527f6d61747572697479206d7573742062652048483a30303a303000000000000000604482015290519081900360640190fd5b600062000ed1878762000826565b60008181526002602052604090206001015490915073ffffffffffffffffffffffffffffffffffffffff161562000f4f576040805162461bcd60e51b815260206004820181905260248201527f616c726561647920726567697374657220676976656e20626f6e642074797065604482015290519081900360640190fd5b600062000f5c8762000d17565b6000818152600360205260409020549091506200113d57606062000f808862002468565b905060005b815181101562001078576000838152600360205260409020825162000fbf9084908490811062000fb157fe5b602002602001015162002518565b81546001808201845560009384526020938490208351805160029094029091018054918601517fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000092831667ffffffffffffffff958616177fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff908116680100000000000000009287168302178355958701518051928501805491909801519316918516919091179094169216909202179091550162000f85565b506200113b60036000848152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015620011315760008481526020908190206040805160808101825260028602909201805467ffffffffffffffff808216858501908152680100000000000000009283900482166060870152855283518085019094526001928301548082168552919091041682850152828401919091529083529092019101620010b0565b5050505062002570565b505b60008181526003602090815260408083208054825181850281018501909352808352620011f493859084015b82821015620011ea5760008481526020908190206040805160808101825260028602909201805467ffffffffffffffff80821685850190815268010000000000000000928390048216606087015285528351808501909452600192830154808216855291909104168285015282840191909152908352909201910162001169565b5050505062002896565b90506000620012ba60036000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015620012b05760008481526020908190206040805160808101825260028602909201805467ffffffffffffffff8082168585019081526801000000000000000092839004821660608701528552835180850190945260019283015480821685529190910416828501528284019190915290835290920191016200122f565b5050505062002948565b90506060807f0000000000000000000000000b06dada89d0df1c9162c97009af56509caeed7273ffffffffffffffffffffffffffffffffffffffff166317161e398d86866040518463ffffffff1660e01b8152600401808481526020018367ffffffffffffffff1681526020018267ffffffffffffffff168152602001935050505060006040518083038186803b1580156200135557600080fd5b505afa1580156200136a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040908152811015620013b257600080fd5b8101908080516040519392919084640100000000821115620013d357600080fd5b908301906020820185811115620013e957600080fd5b82516401000000008111828201881017156200140457600080fd5b82525081516020918201929091019080838360005b838110156200143357818101518382015260200162001419565b50505050905090810190601f168015620014615780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200148557600080fd5b9083019060208201858111156200149b57600080fd5b8251640100000000811182820188101715620014b657600080fd5b82525081516020918201929091019080838360005b83811015620014e5578181015183820152602001620014cb565b50505050905090810190601f168015620015135780820380516001836020036101000a031916815260200191505b506040525050509150915060006200152c828462002a19565b905060405180608001604052808e81526020018273ffffffffffffffffffffffffffffffffffffffff1681526020018667ffffffffffffffff16815260200187815250600260008981526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160020155905050867f3185f99fd61874232eddfc3d4ae727d973183fb0fbefa8dc7a443ae1c16dc5b2828789604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018367ffffffffffffffff1667ffffffffffffffff168152602001828152602001935050505060405180910390a2959c959b509299509297509295505050505050565b600081815260046020526040812060018101548190620016cb62001a93565b106200171e576040805162461bcd60e51b815260206004820181905260248201527f746865206d617475726974792068617320616c72656164792065787069726564604482015290519081900360640190fd5b6000620017476103ea6200173a34600263ffffffff62002b2516565b9063ffffffff62002b8316565b90506000620017676402540be4006200173a348563ffffffff62001c8216565b90506000805b8454811015620017a7578481815481106200178457fe5b906000526020600020015491506200179e82338562001cc6565b6001016200176d565b50620017d47f000000000000000000000000ab37e1358b639fd877f015027bb62d3ddaa7557e8462002bc7565b604080518381529051339189917f58119118163827fe45f023219bbd8afd3de022473ee123ab28257e6e7cb1a5969181900360200190a35095945050505050565b60015481565b600062001829838362002bed565b5060018054906200184290829063ffffffff62001a9716565b60015560408051808201825284815260208082018590526000848152600482529290922081518051929391926200187d928492019062003a43565b506020919091015160019091015560405181907f299da85b2166984ad952bf40538a783c3ec87a2ddb1b2718ec578f7204bff2d990600090a292915050565b60606000620018ca62003a93565b60008481526004602090815260409182902082518154606093810282018401855293810184815290939192849284918401828280156200192a57602002820191906000526020600020905b81548152602001906001019080831162001915575b5050509183525050600191909101546020918201528151910151909590945092505050565b6000828152600460205260408120600181015481906200196e62001a93565b10620019c1576040805162461bcd60e51b815260206004820181905260248201527f746865206d617475726974792068617320616c72656164792065787069726564604482015290519081900360640190fd5b6000805b8254811015620019ff57828181548110620019dc57fe5b90600052602060002001549150620019f682338862001af9565b600101620019c5565b5062001a3c3362001a1c876402540be40063ffffffff62002b2516565b6040518060600160405280602881526020016200584f6028913962003139565b33867fd87ae36701fa64edb5f93045405cac815776cdad12578e706de077762be7946162001a76886402540be40063ffffffff62002b2516565b60408051918252519081900360200190a350600195945050505050565b4290565b60008282018381101562001af2576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008381526002602052604090206001015473ffffffffffffffffffffffffffffffffffffffff168062001b74576040805162461bcd60e51b815260206004820152601a60248201527f74686520626f6e64206973206e6f742072656769737465726564000000000000604482015290519081900360640190fd5b8073ffffffffffffffffffffffffffffffffffffffff1663f05fcdf284846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801562001bfc57600080fd5b505af115801562001c11573d6000803e3d6000fd5b505050506040513d602081101562001c2857600080fd5b505162001c7c576040805162461bcd60e51b815260206004820152601960248201527f6661696c656420746f206275726e20626f6e6420746f6b656e00000000000000604482015290519081900360640190fd5b50505050565b600062001af283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250620032dc565b60008381526002602052604090206001015473ffffffffffffffffffffffffffffffffffffffff168062001d41576040805162461bcd60e51b815260206004820152601a60248201527f74686520626f6e64206973206e6f742072656769737465726564000000000000604482015290519081900360640190fd5b8073ffffffffffffffffffffffffffffffffffffffff166340c10f1984846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801562001dc957600080fd5b505af115801562001dde573d6000803e3d6000fd5b505050506040513d602081101562001df557600080fd5b505162001c7c576040805162461bcd60e51b815260206004820152601960248201527f6661696c656420746f206d696e7420626f6e6420746f6b656e00000000000000604482015290519081900360640190fd5b8051805160209182015192820151805192015167ffffffffffffffff1660409290921b6fffffffffffffffff00000000000000001660c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660809390931b77ffffffffffffffff000000000000000000000000000000001692909217919091171790565b6000828152600460205260409020805462001f34576040805162461bcd60e51b815260206004820152601d60248201527f74686520626f6e642067726f757020646f6573206e6f74206578697374000000604482015290519081900360640190fd5b806001015462001f4362001a93565b101562001f97576040805162461bcd60e51b815260206004820152601c60248201527f74686520626f6e6420686173206e6f7420657870697265642079657400000000604482015290519081900360640190fd5b600062001fa982600101548462003339565b9050600062001fc18261271063ffffffff62002b8316565b905080620020015760405162461bcd60e51b815260040180806020018281038252602b81526020018062005b70602b913960400191505060405180910390fd5b6801000000000000000081106200204a5760405162461bcd60e51b815260040180806020018281038252604281526020018062005b9b6042913960600191505060405180910390fd5b60005b8354811015620024605760008460000182815481106200206957fe5b6000918252602080832090910154808352600290915260409091206001015490915073ffffffffffffffffffffffffffffffffffffffff1680620020f4576040805162461bcd60e51b815260206004820152601a60248201527f74686520626f6e64206973206e6f742072656769737465726564000000000000604482015290519081900360640190fd5b60008281526002602081815260408084209092015483526003815281832080548351818402810184019094528084529093928392620021c0928691859084015b82821015620021b55760008481526020908190206040805160808101825260028602909201805467ffffffffffffffff80821685850190815268010000000000000000928390048216606087015285528351808501909452600192830154808216855291909104168285015282840191909152908352909201910162002134565b505050508862003707565b9150915080620022025760405162461bcd60e51b815260040180806020018281038252604c81526020018062005bdd604c913960600191505060405180910390fd5b60008383815481106200221157fe5b60009182526020808320604080516080810182526002909402909101805467ffffffffffffffff8082168685019081526801000000000000000092839004821660608801528652835180850190945260018301548082168552919091041682840152918301529250819062002287908b6200376a565b9150915060008a8267ffffffffffffffff1602905060008873ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015620022e557600080fd5b505afa158015620022fa573d6000803e3d6000fd5b505050506040513d60208110156200231157600080fd5b5051604080517f903d8e770000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff808816600483015285166024820152905191925060009173ffffffffffffffffffffffffffffffffffffffff8c169163903d8e7791604480830192602092919082900301818787803b158015620023a157600080fd5b505af1158015620023b6573d6000803e3d6000fd5b505050506040513d6020811015620023cd57600080fd5b505190508015620024485760006200241e6fffffffffffffffffffffffffffffffff808616906200173a90891662002411876402540be40063ffffffff62002b2516565b9063ffffffff62002b2516565b9050620024468b8260405180606001604052806036815260200162005a5f6036913962003139565b505b5050600190990198506200204d975050505050505050565b505050505050565b60608180602001905160208110156200248057600080fd5b8101908080516040519392919084640100000000821115620024a157600080fd5b908301906020820185811115620024b757600080fd5b8251866020820283011164010000000082111715620024d557600080fd5b82525081516020918201928201910280838360005b8381101562002504578181015183820152602001620024ea565b505050509050016040525050509050919050565b6200252262003aad565b50604080516080808201835260c084901c82840190815267ffffffffffffffff9185901c821660608401528252825180840184529284901c8116835290921660208083019190915282015290565b805180620025c5576040805162461bcd60e51b815260206004820181905260248201527f706f6c796c696e65206d757374206e6f7420626520656d707479206172726179604482015290519081900360640190fd5b620025cf62003aad565b82600081518110620025dd57fe5b602090810291909101015180515190915067ffffffffffffffff1615620026365760405162461bcd60e51b8152600401808060200182810382526036815260200180620058776036913960400191505060405180910390fd5b80516020015167ffffffffffffffff1615620026845760405162461bcd60e51b815260040180806020018281038252603681526020018062005ac16036913960400191505060405180910390fd5b6200268e62003aad565b8360018403815181106200269e57fe5b602002602001015190506000620026e382600001516020015167ffffffffffffffff1683602001516020015167ffffffffffffffff16620038d290919063ffffffff16565b825151602084015151919250600091620027119167ffffffffffffffff918216911663ffffffff620038d216565b905060008212158015620027255750808213155b620027625760405162461bcd60e51b815260040180806020018281038252605581526020018062005af76055913960600191505060405180910390fd5b6200276d846200393c565b60015b858110156200288d576200278362003aad565b8760018303815181106200279357fe5b60200260200101519050620027a762003aad565b888381518110620027b457fe5b60200260200101519050620027c9816200393c565b80515160208301515167ffffffffffffffff9081169116146200281e5760405162461bcd60e51b815260040180806020018281038252602d81526020018062005927602d913960400191505060405180910390fd5b80600001516020015167ffffffffffffffff1682602001516020015167ffffffffffffffff1614620028825760405162461bcd60e51b81526004018080602001828103825260298152602001806200599f6029913960400191505060405180910390fd5b505060010162002770565b50505050505050565b60008082600081518110620028a757fe5b6020026020010151602001516000015190508067ffffffffffffffff1660001415620028d857600091505062000d12565b60005b83518110156200294157620028ef62003aad565b848281518110620028fc57fe5b602002602001015190508267ffffffffffffffff1681602001516020015167ffffffffffffffff161462002937576000935050505062000d12565b50600101620028db565b5092915050565b600080826000815181106200295957fe5b6020026020010151602001516000015190508067ffffffffffffffff16600014156200298a57600091505062000d12565b60005b83518110156200294157620029a162003aad565b848281518110620029ae57fe5b6020026020010151905080602001516000015167ffffffffffffffff16620029fc8467ffffffffffffffff1683602001516020015167ffffffffffffffff1662001a9790919063ffffffff16565b1462002a0f576000935050505062000d12565b506001016200298d565b6000828260405162002a2b9062003ad6565b604080825283519082015282518190602080830191606084019187019080838360005b8381101562002a6857818101518382015260200162002a4e565b50505050905090810190601f16801562002a965780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101562002acb57818101518382015260200162002ab1565b50505050905090810190601f16801562002af95780820380516001836020036101000a031916815260200191505b50945050505050604051809103906000f08015801562002b1d573d6000803e3d6000fd5b509392505050565b60008262002b3657506000620008c1565b8282028284828162002b4457fe5b041462001af25760405162461bcd60e51b8152600401808060200182810382526021815260200180620059c86021913960400191505060405180910390fd5b600062001af283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250620039ac565b62000ddd82826040518060600160405280602c815260200162005a95602c913962003139565b6000805b835181101562002c9f5760006002600086848151811062002c0e57fe5b6020026020010151815260200190815260200160002090508381600001541462002c6a5760405162461bcd60e51b8152600401808060200182810382526026815260200180620058dc6026913960400191505060405180910390fd5b60028101546000908152600360205260409020805462002c9290859063ffffffff62001a9716565b9350505060010162002bf1565b50600060608267ffffffffffffffff8111801562002cbc57600080fd5b5060405190808252806020026020018201604052801562002ce7578160200160208202803683370190505b50905060005b855181101562002e1f5760006002600088848151811062002d0a57fe5b60200260200101518152602001908152602001600020905060006003600083600201548152602001908152602001600020905060008090505b815481101562002e1357600082828154811062002d5c57fe5b6000918252602082206001600290920201015467ffffffffffffffff169150805b8881101562002dca578267ffffffffffffffff1688828151811062002d9e57fe5b602002602001015167ffffffffffffffff16141562002dc1576001915062002dca565b60010162002d7d565b50801562002dda57505062002e0a565b8187898151811062002de857fe5b67ffffffffffffffff9092166020928302919091019091015250506001909501945b60010162002d43565b50505060010162002ced565b5060005b81518110156200246057600082828151811062002e3c57fe5b6020908102919091010151905060006001815b8951811015620030d1576000600260008c848151811062002e6c57fe5b60200260200101518152602001908152602001600020905060006003600083600201548152602001908152602001600020905060008062002f5383805480602002602001604051908101604052809291908181526020016000905b8282101562002f485760008481526020908190206040805160808101825260028602909201805467ffffffffffffffff80821685850190815268010000000000000000928390048216606087015285528351808501909452600192830154808216855291909104168285015282840191909152908352909201910162002ec7565b505050508962003707565b915091508062002faa576040805162461bcd60e51b815260206004820152601960248201527f696e76616c696420646f6d61696e2065787072657373696f6e00000000000000604482015290519081900360640190fd5b6000806200302d85858154811062002fbe57fe5b6000918252602091829020604080516080810182526002909302909101805467ffffffffffffffff808216858501908152680100000000000000009283900482166060870152855283518085019094526001909201548083168452041681840152918101919091528b6200376a565b91509150816fffffffffffffffffffffffffffffffff16600014620030be576200309d6200306c8a67ffffffffffffffff841663ffffffff62002b2516565b620030908a6fffffffffffffffffffffffffffffffff861663ffffffff62002b2516565b9063ffffffff62001a9716565b9850620030bb8867ffffffffffffffff831663ffffffff62002b2516565b97505b50506001909401935062002e4f92505050565b50620030ee8167ffffffffffffffff851663ffffffff62002b2516565b82146200312d5760405162461bcd60e51b815260040180806020018281038252604b81526020018062005954604b913960600191505060405180910390fd5b50505060010162002e23565b620031448262003a15565b8190620031d25760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620031965781810151838201526020016200317c565b50505050905090810190601f168015620031c45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060405160009073ffffffffffffffffffffffffffffffffffffffff85169084908381818185875af1925050503d80600081146200322d576040519150601f19603f3d011682016040523d82523d6000602084013e62003232565b606091505b505090508062003289576040805162461bcd60e51b815260206004820152601960248201527f7472616e7366657272696e67204574686572206661696c656400000000000000604482015290519081900360640190fd5b60408051848152905173ffffffffffffffffffffffffffffffffffffffff86169130917fdd4e7375a5084e0c4cc4e1bfc7ba67beb26a368120ea78d2e0948123910bbf7c9181900360200190a350505050565b60008184841115620033315760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315620031965781810151838201526020016200317c565b505050900390565b60008054604080517f4bfbbe0b0000000000000000000000000000000000000000000000000000000081529051839273ffffffffffffffffffffffffffffffffffffffff1691634bfbbe0b91600480830192602092919082900301818787803b158015620033a657600080fd5b505af1158015620033bb573d6000803e3d6000fd5b505050506040513d6020811015620033d257600080fd5b5051905080620034145760405162461bcd60e51b8152600401808060200182810382526036815260200180620058196036913960400191505060405180910390fd5b8262003467576040805162461bcd60e51b815260206004820152601c60248201527f7468652068696e74204944206d757374206e6f74206265207a65726f00000000604482015290519081900360640190fd5b8281811115620034745750805b846000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b633620c836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015620034ea57600080fd5b505af1158015620034ff573d6000803e3d6000fd5b505050506040513d60208110156200351657600080fd5b505111620035565760405162461bcd60e51b8152600401808060200182810382526025815260200180620059026025913960400191505060405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b80156200365857846000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b633620c836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015620035f657600080fd5b505af11580156200360b573d6000803e3d6000fd5b505050506040513d60208110156200362257600080fd5b505111620036305762003658565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0162003579565b60008054604080517fe7572230000000000000000000000000000000000000000000000000000000008152600185016004820152905173ffffffffffffffffffffffffffffffffffffffff9092169263e7572230926024808401936020939083900390910190829087803b158015620036d057600080fd5b505af1158015620036e5573d6000803e3d6000fd5b505050506040513d6020811015620036fc57600080fd5b505195945050505050565b815160005b811562003763578180600190039250508267ffffffffffffffff168483815181106200373457fe5b6020026020010151600001516000015167ffffffffffffffff16116200375d5750600162003763565b6200370c565b9250929050565b81518051602091820151828501518051930151600093849367ffffffffffffffff908116938116929181169116838213620037ec576040805162461bcd60e51b815260206004820152601860248201527f6d757374206265206c6566742e78203c2072696768742e780000000000000000604482015290519081900360640190fd5b838203945067ffffffffffffffff8716848103820290830384020160008112156200385e576040805162461bcd60e51b815260206004820152600b60248201527f756e646572666c6f77206e000000000000000000000000000000000000000000604482015290519081900360640190fd5b7001000000000000000000000000000000008112620038c4576040805162461bcd60e51b815260206004820152601860248201527f73797374656d206572726f723a206f766572666c6f77206e0000000000000000604482015290519081900360640190fd5b989497509395505050505050565b6000818303818312801590620038e85750838113155b80620038ff5750600083128015620038ff57508381135b62001af25760405162461bcd60e51b815260040180806020018281038252602481526020018062005b4c6024913960400191505060405180910390fd5b80515160208201515167ffffffffffffffff80821690831610620039a7576040805162461bcd60e51b815260206004820152601860248201527f6d757374206265206c6566742e78203c2072696768742e780000000000000000604482015290519081900360640190fd5b505050565b60008183620039fe5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315620031965781810151838201526020016200317c565b50600083858162003a0b57fe5b0495945050505050565b3031101590565b60408051608081018252600080825260208201819052918101829052606081019190915290565b82805482825590600052602060002090810192821562003a81579160200282015b8281111562003a8157825182559160200191906001019062003a64565b5062003a8f92915062003ae4565b5090565b604051806040016040528060608152602001600081525090565b604051806040016040528062003ac262003b04565b815260200162003ad162003b04565b905290565b611cfd8062003b1c83390190565b62003b0191905b8082111562003a8f576000815560010162003aeb565b90565b60408051808201909152600080825260208201529056fe60a06040523480156200001157600080fd5b5060405162001cfd38038062001cfd833981810160405260408110156200003757600080fd5b81019080805160405193929190846401000000008211156200005857600080fd5b9083019060208201858111156200006e57600080fd5b82516401000000008111828201881017156200008957600080fd5b82525081516020918201929091019080838360005b83811015620000b85781810151838201526020016200009e565b50505050905090810190601f168015620000e65780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200010a57600080fd5b9083019060208201858111156200012057600080fd5b82516401000000008111828201881017156200013b57600080fd5b82525081516020918201929091019080838360005b838110156200016a57818101518382015260200162000150565b50505050905090810190601f168015620001985780820380516001836020036101000a031916815260200191505b506040525050503360601b608052815182908290620001bf90600390602085019062000218565b508051620001d590600490602084019062000218565b50506005805460ff1916601217905550620001fa60086001600160e01b036200020216565b5050620002bd565b6005805460ff191660ff92909216919091179055565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200025b57805160ff19168380011785556200028b565b828001600101855582156200028b579182015b828111156200028b5782518255916020019190600101906200026e565b50620002999291506200029d565b5090565b620002ba91905b80821115620002995760008155600101620002a4565b90565b60805160601c611a22620002db600039806111475250611a226000f3fe6080604052600436106101485760003560e01c8063679aefce116100c0578063a457c2d711610074578063aa271e1a11610059578063aa271e1a1461055a578063dd62ed3e1461059a578063f05fcdf2146105e257610186565b8063a457c2d7146104ce578063a9059cbb1461051457610186565b8063903d8e77116100a5578063903d8e771461046057806395d89b41146104a45780639975038c146104b957610186565b8063679aefce146103dc57806370a082311461042057610186565b80632f13b60c1161011757806339509351116100fc578063395093511461032657806340c10f191461036c57806342966c68146103b257610186565b80632f13b60c146102e6578063313ce567146102fb57610186565b806306fdde031461018b578063095ea7b31461021557806318160ddd1461026f57806323b872dd1461029657610186565b3661018657604080513481529051309133917fdd4e7375a5084e0c4cc4e1bfc7ba67beb26a368120ea78d2e0948123910bbf7c9181900360200190a3005b600080fd5b34801561019757600080fd5b506101a0610628565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101da5781810151838201526020016101c2565b50505050905090810190601f1680156102075780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561022157600080fd5b5061025b6004803603604081101561023857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356106dc565b604080519115158252519081900360200190f35b34801561027b57600080fd5b506102846106fa565b60408051918252519081900360200190f35b3480156102a257600080fd5b5061025b600480360360608110156102b957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610700565b3480156102f257600080fd5b5061025b610755565b34801561030757600080fd5b50610310610783565b6040805160ff9092168252519081900360200190f35b34801561033257600080fd5b5061025b6004803603604081101561034957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561078c565b34801561037857600080fd5b5061025b6004803603604081101561038f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356107ed565b3480156103be57600080fd5b5061025b600480360360208110156103d557600080fd5b50356108cb565b3480156103e857600080fd5b506103f1610999565b604080516fffffffffffffffffffffffffffffffff938416815291909216602082015281519081900390910190f35b34801561042c57600080fd5b506102846004803603602081101561044357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166109ca565b34801561046c57600080fd5b5061025b6004803603604081101561048357600080fd5b506fffffffffffffffffffffffffffffffff813581169160200135166109f2565b3480156104b057600080fd5b506101a0610afe565b3480156104c557600080fd5b50610284610b7d565b3480156104da57600080fd5b5061025b600480360360408110156104f157600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610ba5565b34801561052057600080fd5b5061025b6004803603604081101561053757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610c20565b34801561056657600080fd5b5061025b6004803603602081101561057d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610c2d565b3480156105a657600080fd5b50610284600480360360408110156105bd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610c38565b3480156105ee57600080fd5b5061025b6004803603604081101561060557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610c70565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106d25780601f106106a7576101008083540402835291602001916106d2565b820191906000526020600020905b8154815290600101906020018083116106b557829003601f168201915b5050505050905090565b60006106f06106e9610cf2565b8484610cf6565b5060015b92915050565b60025490565b600061070d848484610e3d565b61074b843361074685604051806060016040528060288152602001611936602891396107398a33610c38565b919063ffffffff61101916565b610cf6565b5060019392505050565b60065470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16151590565b60055460ff1690565b60006106f0610799610cf2565b8461074685600160006107aa610cf2565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff6110ca16565b60006107f833611145565b61084d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806118ac602e913960400191505060405180910390fd5b610855610755565b156108c157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f7468697320746f6b656e20636f6e747261637420686173206578706972656400604482015290519081900360640190fd5b6106f08383611184565b60006108d5610755565b6108e157506000610994565b6108eb33836112c1565b6006546fffffffffffffffffffffffffffffffff161561099057600654600090610969906fffffffffffffffffffffffffffffffff700100000000000000000000000000000000820481169161095d9116610951876402540be40063ffffffff61141716565b9063ffffffff61141716565b9063ffffffff61148a16565b905061098e338260405180606001604052806022815260200161188a602291396114cc565b505b5060015b919050565b6006546fffffffffffffffffffffffffffffffff808216927001000000000000000000000000000000009092041690565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b60006109fd33611145565b610a52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806118ac602e913960400191505060405180910390fd5b610a5a610755565b1590508015610aa457610aa46040518060400160405280856fffffffffffffffffffffffffffffffff168152602001846fffffffffffffffffffffffffffffffff1681525061165d565b604080516fffffffffffffffffffffffffffffffff8086168252841660208201528215158183015290517fcdcd2e977c58a9c82d799c0986ab5c6fe48d43a9b96bbf60a654b46728c6f6679181900360600190a192915050565b60048054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106d25780601f106106a7576101008083540402835291602001916106d2565b6000610b88336109ca565b90506000610b95826108cb565b905080610ba157600091505b5090565b60006106f0610bb2610cf2565b84610746856040518060600160405280602581526020016119c86025913960016000610bdc610cf2565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61101916565b60006106f0338484610e3d565b60006106f482611145565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6000610c7b33611145565b610cd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e8152602001806118ac602e913960400191505060405180910390fd5b610cd9836109ca565b821115610ce8575060006106f4565b6106f083836112c1565b3390565b73ffffffffffffffffffffffffffffffffffffffff8316610d62576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806119a46024913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216610dce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806118426022913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ea9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602581526020018061197f6025913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216610f15576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806117fd6023913960400191505060405180910390fd5b610f2083838361172f565b610f70816040518060600160405280602681526020016118646026913973ffffffffffffffffffffffffffffffffffffffff8616600090815260208190526040902054919063ffffffff61101916565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152602081905260408082209390935590841681522054610fb2908263ffffffff6110ca16565b73ffffffffffffffffffffffffffffffffffffffff8084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156110c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561108757818101518382015260200161106f565b50505050905090810190601f1680156110b45780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008282018381101561113e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b73ffffffffffffffffffffffffffffffffffffffff821661120657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6112126000838361172f565b600254611225908263ffffffff6110ca16565b60025573ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205461125e908263ffffffff6110ca16565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b73ffffffffffffffffffffffffffffffffffffffff821661132d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061195e6021913960400191505060405180910390fd5b6113398260008361172f565b611389816040518060600160405280602281526020016118206022913973ffffffffffffffffffffffffffffffffffffffff8516600090815260208190526040902054919063ffffffff61101916565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260409020556002546113c2908263ffffffff61173416565b60025560408051828152905160009173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600082611426575060006106f4565b8282028284828161143357fe5b041461113e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806119156021913960400191505060405180910390fd5b600061113e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611776565b6114d5826117f5565b819061153c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561108757818101518382015260200161106f565b5060405160009073ffffffffffffffffffffffffffffffffffffffff85169084908381818185875af1925050503d8060008114611595576040519150601f19603f3d011682016040523d82523d6000602084013e61159a565b606091505b505090508061160a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f7472616e7366657272696e67204574686572206661696c656400000000000000604482015290519081900360640190fd5b60408051848152905173ffffffffffffffffffffffffffffffffffffffff86169130917fdd4e7375a5084e0c4cc4e1bfc7ba67beb26a368120ea78d2e0948123910bbf7c9181900360200190a350505050565b60208101516fffffffffffffffffffffffffffffffff166116c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001806118da603b913960400191505060405180910390fd5b8051600680546020909301516fffffffffffffffffffffffffffffffff908116700100000000000000000000000000000000029281167fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941693909317909216179055565b505050565b600061113e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611019565b600081836117df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181815283516024840152835190928392604490910191908501908083836000831561108757818101518382015260200161106f565b5060008385816117eb57fe5b0495945050505050565b303110159056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636573797374656d206572726f723a20696e73756666696369656e742062616c616e63656f6e6c79206465706c6f79657220697320616c6c6f77656420746f2063616c6c20746869732066756e6374696f6e73797374656d206572726f723a207468652065786368616e67652072617465206d757374206265206e6f6e2d6e65676174697665206e756d626572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212204d7f6c98e7947c587cb2cacbbd60112ff671feabdd34e2fe6aaa8e4e36045e5964736f6c6343000606003373797374656d206572726f723a20746865204944206f66206f7261636c6520646174612073686f756c64206e6f74206265207a65726f73797374656d206572726f723a20696e73756666696369656e742045746865722062616c616e6365746865207820636f6f7264696e617465206f66206c65667420656e64206f6620746865206669727374207365676d656e74206973203063616e6e6f742065786368616e676520626f6e6473207769746820646966666572656e74206d617475726974696573746865206d61747572697479206f662074686520626f6e6473206d7573742062652073616d657468657265206973206e6f2070726963652064617461206166746572206d61747572697479676976656e20706f6c796c696e65206973206e6f742073696e676c652d76616c7565642066756e6374696f6e2e74686520746f74616c20707269636520617420616e792072617465427265616b506f696e74732073686f756c64206265207468652073616d652076616c7565206173207468652072617465676976656e20706f6c796c696e65206973206e6f7420636f6e74696e756f75732066756e6374696f6e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77416c6c2074686520657863657074696f6e426f6e6473206e65656420746f20626520696e636c7564656420696e20696e707574416c6c2074686520657863657074696f6e426f6e6473206e65656420746f20626520696e636c7564656420626f746820696e20696e70757420616e64206f757470757473797374656d206572726f723a20426f6e644d616b657227732062616c616e6365206973206c657373207468616e207061796d656e745472616e736665724554483a207472616e7366657220616d6f756e7420657863656564732062616c616e6365746865207920636f6f7264696e617465206f66206c65667420656e64206f6620746865206669727374207365676d656e742069732030746865206772616469656e74206f66206c617374206c696e65207365676d656e74206d757374206265206e6f6e2d6e65676174697665206e756d62657220657175616c20746f206f72206c657373207468616e20315369676e6564536166654d6174683a207375627472616374696f6e206f766572666c6f7773797374656d206572726f723a20726174652073686f756c64206265206e6f6e2d7a65726f2076616c756573797374656d206572726f723a20726174652073686f756c64206265206c657373207468616e20746865206d6178696d756d2076616c7565206f662075696e74363473797374656d206572726f723a20646964206e6f7420666f756e642061207365676d656e742077686f73652070726963652072616e676520696e636c756465205553442f4554482072617465a26469706673582212204278218a946c2ad66e5cf564df612117578f94a8b00397a2d9afe188b652056d64736f6c63430006060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000120a078fdc516a1a98bbecb9e961f8741ac7ac82000000000000000000000000ab37e1358b639fd877f015027bb62d3ddaa7557e0000000000000000000000000b06dada89d0df1c9162c97009af56509caeed720000000000000000000000000000000000000000000000000000000000000e10
-----Decoded View---------------
Arg [0] : oracleAddress (address): 0x120a078FdC516A1A98bbecb9e961F8741AC7ac82
Arg [1] : lienTokenAddress (address): 0xaB37e1358b639Fd877f015027Bb62d3ddAa7557E
Arg [2] : bondTokenNameAddress (address): 0x0B06dADA89d0dF1c9162C97009Af56509caEeD72
Arg [3] : maturityScale (uint256): 3600
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000120a078fdc516a1a98bbecb9e961f8741ac7ac82
Arg [1] : 000000000000000000000000ab37e1358b639fd877f015027bb62d3ddaa7557e
Arg [2] : 0000000000000000000000000b06dada89d0df1c9162c97009af56509caeed72
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000e10
Deployed Bytecode Sourcemap
49900:22674:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16086:52;;;16128:9;16086:52;;;;16121:4;;16101:10;;16086:52;;;;;;;;;49900:22674;;12:1:-1;9;2:12;64752:510:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;64752:510:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;64752:510:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66476:212;;5:9:-1;2:2;;;27:1;24;17:12;2:2;66476:212:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;66476:212:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;66476:212:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;66476:212:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;66476:212:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;66476:212:0;;-1:-1:-1;66476:212:0;;-1:-1:-1;;;;;66476:212:0:i;:::-;;;;;;;;;;;;;;;;61617:2405;;5:9:-1;2:2;;;27:1;24;17:12;2:2;61617:2405:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;61617:2405:0;;;;;;;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;61617:2405:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;61617:2405:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;61617:2405:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;61617:2405:0;;-1:-1:-1;61617:2405:0;;-1:-1:-1;;;;;61617:2405:0:i;:::-;;;;;;;;;;;;;;;;;;65335:428;;5:9:-1;2:2;;;27:1;24;17:12;2:2;65335:428:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;65335:428:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;65335:428:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66266:117;;5:9:-1;2:2;;;27:1;24;17:12;2:2;66266:117:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;66266:117:0;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;66266:117:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;66266:117:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;66266:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;66266:117:0;;-1:-1:-1;66266:117:0;;-1:-1:-1;;;;;66266:117:0:i;64278:387::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;64278:387:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;64278:387:0;;;;;;;:::i;:::-;;51886:2313;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51886:2313:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;51886:2313:0;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;51886:2313:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;51886:2313:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;51886:2313:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;51886:2313:0;;-1:-1:-1;51886:2313:0;;-1:-1:-1;;;;;51886:2313:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59163:994;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;59163:994:0;;:::i;50217:34::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50217:34:0;;;:::i;58431:496::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;58431:496:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;58431:496:0;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;58431:496:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;58431:496:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;58431:496:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;58431:496:0;;-1:-1:-1;;58431:496:0;;;-1:-1:-1;58431:496:0;;-1:-1:-1;;58431:496:0:i;65866:328::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;65866:328:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;65866:328:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;65866:328:0;;;;;;;;;;;;;;;;;;60280:940;;5:9:-1;2:2;;;27:1;24;17:12;2:2;60280:940:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;60280:940:0;;;;;;;:::i;64752:510::-;64865:24;64904:16;64935:23;64973:15;65016:24;;:::i;:::-;-1:-1:-1;;;65043:14:0;;;;-1:-1:-1;;65043:6:0;:14;;;;;;;;;65016:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64752:510::o;66476:212::-;66604:7;66663:8;66673:5;66646:33;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;66646:33:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;66646:33:0;;;66636:44;;;;;;66629:51;;66476:212;;;;;:::o;61617:2405::-;61820:4;61838:25;61865:21;61890:54;61917:16;61890:12;:54::i;:::-;61837:107;;;;61956:26;61984:22;62010:55;62037:17;62010:12;:55::i;:::-;61955:110;;;;62115:14;62098:13;:31;62076:128;;;;-1:-1:-1;;;62076:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62263:13;62237:23;:21;:23::i;:::-;:39;62215:121;;;;;-1:-1:-1;;;62215:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62347:9;;;62402:665;62426:8;:15;62422:1;:19;62402:665;;;62557:4;;-1:-1:-1;62581:9:0;62576:379;62600:14;:21;62596:1;:25;62576:379;;;62672:8;62681:1;62672:11;;;;;;;;;;;;;;62651:14;62666:1;62651:17;;;;;;;;;;;;;;:32;62647:293;;;62715:5;;-1:-1:-1;62899:21:0;:14;62918:1;62899:21;:18;:21;:::i;:::-;62882:38;;62647:293;62623:3;;62576:379;;;;62973:4;62969:87;;;62998:42;63008:8;63017:1;63008:11;;;;;;;;;;;;;;63021:10;63033:6;62998:9;:42::i;:::-;62443:3;;62402:665;;;;63126:14;63101;:21;:39;63079:140;;;;-1:-1:-1;;;63079:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63237:9;63232:446;63256:9;:16;63252:1;:20;63232:446;;;63301:4;;-1:-1:-1;63325:9:0;63320:241;63344:14;:21;63340:1;:25;63320:241;;;63416:9;63426:1;63416:12;;;;;;;;;;;;;;63395:14;63410:1;63395:17;;;;;;;;;;;;;;:33;63391:155;;;63460:5;;-1:-1:-1;63505:21:0;:14;63524:1;63505:21;:18;:21;:::i;:::-;63488:38;;63391:155;63367:3;;63320:241;;;;63579:4;63575:92;;;63604:47;63618:9;63628:1;63618:12;;;;;;;;;;;;;;63632:10;63644:6;63604:13;:47::i;:::-;63274:3;;63232:446;;;-1:-1:-1;63712:19:0;;63690:136;;;;-1:-1:-1;;;63690:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63844:146;;;;;;;;63941:17;;63910:16;;63885:10;;63844:146;;;;;;;;;;-1:-1:-1;64010:4:0;;61617:2405;-1:-1:-1;;;;;;;;;;61617:2405:0:o;65335:428::-;65466:30;65499:25;;;:16;:25;;;;;65577:15;;65436:12;;65499:25;65436:12;;65563:30;;;2:2:-1;;;;27:1;24;17:12;2:2;65563:30:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;65563:30:0;-1:-1:-1;65535:58:0;-1:-1:-1;65609:9:0;65604:114;65628:15;;65624:19;;65604:114;;;65679:27;65694:8;65703:1;65694:11;;;;;;;;;;;;;;;;;65679:27;;;;;;;;65694:11;;;;;;;65679:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:14;:27::i;:::-;65665:8;65674:1;65665:11;;;;;;;;;;;;;;;;;:41;65645:3;;65604:114;;;;65746:8;65735:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;65735:20:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;65735:20:0;;;65728:27;;;;65335:428;;;;:::o;66266:117::-;66359:16;;;;;;;;66266:117::o;64278:387::-;64398:17;64394:264;;64432:122;64483:11;64513:15;;;;;;;;;;;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;64513:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64513:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;64513:26:0;64432:32;:122::i;:::-;64394:264;;;64587:59;64620:11;64633:12;64587:32;:59::i;:::-;64278:387;;:::o;51886:2313::-;52015:7;52037;52059:6;52080:7;52148:23;:21;:23::i;:::-;52137:8;:34;52115:116;;;;;-1:-1:-1;;;52115:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52261:14;52250:8;:25;;;;;;:30;52242:68;;;;;-1:-1:-1;;;52242:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52323:14;52340:31;52355:8;52365:5;52340:14;:31::i;:::-;52652:1;52608:14;;;:6;:14;;;;;:31;;;52323:48;;-1:-1:-1;52600:54:0;52608:31;52600:54;52578:136;;;;;-1:-1:-1;;;52578:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52779:15;52797:22;52813:5;52797:15;:22::i;:::-;52834:25;;;;:16;:25;;;;;:32;52779:40;;-1:-1:-1;52830:333:0;;52888:25;52916:21;52931:5;52916:14;:21::i;:::-;52888:49;-1:-1:-1;52957:9:0;52952:142;52976:8;:15;52972:1;:19;52952:142;;;53017:25;;;;:16;:25;;;;;53065:11;;53048:29;;53065:8;;53074:1;;53065:11;;;;;;;;;;;;53048:16;:29::i;:::-;27:10:-1;;39:1;23:18;;;45:23;;-1:-1;53017:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52993:3;52952:142;;;;53110:41;53125:16;:25;53142:7;53125:25;;;;;;;;;;;53110:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:14;:41::i;:::-;52830:333;;53175:23;53236:25;;;:16;:25;;;;;;;;53201:71;;;;;;;;;;;;;;;;;;;53175:23;;53201:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:20;:71::i;:::-;53175:97;;53283:23;53309:71;53344:16;:25;53361:7;53344:25;;;;;;;;;;;53309:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:20;:71::i;:::-;53283:97;;53408:23;53446:22;53482;:39;;;53536:8;53559:16;53590;53482:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53482:135:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53482:135:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;53482:135:0;80:15:-1;;;97:9;76:31;65:43;;120:4;113:20;;;7:11;;4:2;;;31:1;28;21:12;4:2;53482:135:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;261:11;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;53482:135:0;;420:4:-1;411:14;;;;53482:135:0;;;;;411:14:-1;53482:135:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;53482:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;261:11;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;53482:135:0;;420:4:-1;411:14;;;;53482:135:0;;;;;411:14:-1;53482:135:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;53482:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53393:224;;;;53630:27;53660:40;53680:8;53690:9;53660:19;:40::i;:::-;53630:70;;53768:186;;;;;;;;53802:8;53768:186;;;;53843:17;53768:186;;;;;;53895:16;53768:186;;;;;;53935:7;53768:186;;;53751:6;:14;53758:6;53751:14;;;;;;;;;;;:203;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53997:6;53972:136;54026:17;54059:16;54090:7;53972:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54129:6;;;;-1:-1:-1;54165:16:0;;-1:-1:-1;54183:7:0;;-1:-1:-1;51886:2313:0;;-1:-1:-1;;;;;;51886:2313:0:o;59163:994::-;59276:7;59331:27;;;:14;:27;;;;;59473:18;;;;59331:27;;59447:23;:21;:23::i;:::-;:44;59425:126;;;;;-1:-1:-1;;;59425:126:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59564:11;59578:26;59599:4;59578:16;:9;59592:1;59578:16;:13;:16;:::i;:::-;:20;:26;:20;:26;:::i;:::-;59564:40;-1:-1:-1;59617:14:0;59634:30;59657:6;59634:18;:9;59564:40;59634:18;:13;:18;:::i;:30::-;59617:47;-1:-1:-1;59724:14:0;;59749:249;59826:14;;59809:31;;59749:249;;;59907:7;59915:14;59907:23;;;;;;;;;;;;;;;;59898:32;;59945:41;59959:6;59967:10;59979:6;59945:13;:41::i;:::-;59855:16;;59749:249;;;;60010:46;60031:18;60052:3;60010:12;:46::i;:::-;60074:49;;;;;;;;60104:10;;60091:11;;60074:49;;;;;;;;;-1:-1:-1;60143:6:0;59163:994;-1:-1:-1;;;;;59163:994:0:o;50217:34::-;;;;:::o;58431:496::-;58557:19;58594:35;58611:7;58620:8;58594:16;:35::i;:::-;-1:-1:-1;58705:15:0;;;;58749:22;;58705:15;;58749:22;:19;:22;:::i;:::-;58731:15;:40;58814:28;;;;;;;;;;;;;;;;;;-1:-1:-1;58784:27:0;;;:14;:27;;;;;;:58;;;;58814:28;;58784:27;;:58;;:27;;:58;;;:::i;:::-;-1:-1:-1;58784:58:0;;;;;;;;;;;58860:28;;58876:11;;58860:28;;;;;58431:496;;;;:::o;65866:328::-;65992:24;66018:16;66052:26;;:::i;:::-;66081:27;;;;:14;:27;;;;;;;;;66052:56;;;;;;;;;;;;;;;;;;;;;;66081:27;;66052:56;;66081:27;;66052:56;;66081:27;66052:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66052:56:0;;;-1:-1:-1;;66052:56:0;;;;;;;;;;;66129:17;;66168:18;;;66129:17;;66168:18;;-1:-1:-1;65866:328:0;-1:-1:-1;;;65866:328:0:o;60280:940::-;60397:4;60449:27;;;:14;:27;;;;;60591:18;;;;60449:27;;60565:23;:21;:23::i;:::-;:44;60543:126;;;;;-1:-1:-1;;;60543:126:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60680:14;;60705:247;60782:14;;60765:31;;60705:247;;;60863:7;60871:14;60863:23;;;;;;;;;;;;;;;;60854:32;;60901:39;60911:6;60919:10;60931:8;60901:9;:39::i;:::-;60811:16;;60705:247;;;-1:-1:-1;60964:140:0;60991:10;61016:20;:8;61029:6;61016:20;:12;:20;:::i;:::-;60964:140;;;;;;;;;;;;;;;;;:12;:140::i;:::-;61155:10;61142:11;61122:66;61167:20;:8;61180:6;61167:20;:12;:20;:::i;:::-;61122:66;;;;;;;;;;;;;;;-1:-1:-1;61208:4:0;;60280:940;-1:-1:-1;;;;;60280:940:0:o;15471:194::-;15605:3;;15471:194::o;914:181::-;972:7;1004:5;;;1028:6;;;;1020:46;;;;;-1:-1:-1;;;1020:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1086:1;914:181;-1:-1:-1;;;914:181:0:o;67352:449::-;67474:27;67504:14;;;:6;:14;;;;;:31;;;;;67568:40;67546:116;;;;;-1:-1:-1;;;67546:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;67695:17;:28;;;67724:7;67733:6;67695:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;67695:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67695:45:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;67695:45:0;67673:120;;;;;-1:-1:-1;;;67673:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;67352:449;;;;:::o;1370:136::-;1428:7;1455:43;1459:1;1462;1455:43;;;;;;;;;;;;;;;;;:3;:43::i;66897:447::-;67023:27;67053:14;;;:6;:14;;;;;:31;;;;;67117:40;67095:116;;;;;-1:-1:-1;;;67095:116:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;67244:17;:22;;;67267:7;67276:6;67244:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;67244:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67244:39:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;67244:39:0;67222:114;;;;;-1:-1:-1;;;67222:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;44505:461;44661:12;;:14;;44740;;;;;44814:13;;;;:15;;44882;;;44653:23;44874:24;44834:2;44806:30;;;;;;44681:12;44653:41;;;;;;44760:7;44732:36;;;;;;44925:15;;;;:24;;;;:33;;44505:461::o;67809:2546::-;67939:27;67969;;;:14;:27;;;;;68015:24;;68007:70;;;;;-1:-1:-1;;;68007:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;68137:9;:18;;;68110:23;:21;:23::i;:::-;:45;;68088:123;;;;;-1:-1:-1;;;68088:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;68316:21;68340:45;68352:9;:18;;;68372:12;68340:11;:45::i;:::-;68316:69;-1:-1:-1;68525:21:0;68549:24;68316:69;68567:5;68549:24;:17;:24;:::i;:::-;68525:48;-1:-1:-1;68606:18:0;68584:111;;;;-1:-1:-1;;;68584:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68744:5;68728:13;:21;68706:137;;;;-1:-1:-1;;;68706:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68861:9;68856:1492;68880:24;;68876:28;;68856:1492;;;68926:14;68943:9;:17;;68961:1;68943:20;;;;;;;;;;;;;;;;;;;;69008:14;;;:6;:14;;;;;;;:31;;;68943:20;;-1:-1:-1;69008:31:0;;69080:40;69054:128;;;;;-1:-1:-1;;;69054:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;69199:30;69249:14;;;:6;:14;;;;;;;;:40;;;;69232:58;;:16;:58;;;;;69341:100;;;;;;;;;;;;;;;;;69232:58;;69199:30;;;69341:100;;69232:58;;69199:30;;69341:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69412:13;69341:18;:100::i;:::-;69307:134;;;;69484:2;69458:140;;;;-1:-1:-1;;;69458:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69613:27;69643:8;69652:12;69643:22;;;;;;;;;;;;;;;;69705:40;;;;;;;;69643:22;;;;;;;69705:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69643:22;-1:-1:-1;69643:22:0;;69705:40;;69730:13;69705:8;:40::i;:::-;69680:65;;;;69817:9;69851:13;69837:2;69829:11;;:36;69817:48;;69882:19;69904:17;:29;;;:31;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;69904:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;69904:31:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;69904:31:0;69969:30;;;;;;;;;;;;;;;;;;;;;;69904:31;;-1:-1:-1;69950:16:0;;69969:24;;;;;;:30;;;;;69904:31;;69969:30;;;;;;;69950:16;69969:24;:30;;;2:2:-1;;;;27:1;24;17:12;2:2;69969:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;69969:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;69969:30:0;;-1:-1:-1;70016:321:0;;;;70052:15;70070:43;;;;;;:36;;;;:29;:11;70086:12;70070:29;:15;:29;:::i;:::-;:33;:36;:33;:36;:::i;:43::-;70052:61;;70132:189;70175:17;70216:7;70132:189;;;;;;;;;;;;;;;;;:12;:189::i;:::-;70016:321;;-1:-1:-1;;68906:3:0;;;;;-1:-1:-1;68856:1492:0;;-1:-1:-1;;;;;;;;68856:1492:0;;;67809:2546;;;;;:::o;45568:173::-;45662:16;45714:5;45703:30;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;45703:30:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;45703:30:0;;421:4:-1;412:14;;;;45703:30:0;;;;;412:14:-1;45703:30:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;45703:30:0;;;;;;;;;;;45696:37;;45568:173;;;:::o;45049:447::-;45138:18;;:::i;:::-;-1:-1:-1;45299:2:0;45367:121;;45253:7;45404:21;;;;;45201:12;45193:21;;;45367:121;;;45404:21;;;;45245:16;;;;45404:21;;;;;;45367:121;;45451:21;;;;;;;45292:9;;;;45451:21;;;;;;;-1:-1:-1;45451:21:0;;;;;;;-1:-1:-1;;45367:121:0;;45049:447::o;42022:2343::-;42125:15;;42159:16;42151:61;;;;;-1:-1:-1;;;42151:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42267:31;;:::i;:::-;42301:8;42310:1;42301:11;;;;;;;;;;;;;;;;;;42414:17;;:19;42301:11;;-1:-1:-1;42414:32:0;;;42392:136;;;;-1:-1:-1;;;42392:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42606:17;;:19;;;:32;;;42584:136;;;;-1:-1:-1;;;42584:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42774:30;;:::i;:::-;42807:8;42831:1;42816:12;:16;42807:26;;;;;;;;;;;;;;42774:59;;42920:24;42947:75;42993:11;:16;;;:18;;;42947:75;;42954:11;:17;;;:19;;;42947:27;;:31;;:75;;;;:::i;:::-;43108:16;;:18;43069:17;;;;:19;42920:102;;-1:-1:-1;43033:26:0;;43062:75;;;:27;;;;:75;;:31;:75;:::i;:::-;43033:104;;43191:1;43170:17;:22;;:66;;;;;43217:19;43196:17;:40;;43170:66;43148:201;;;;-1:-1:-1;;;43148:201:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43440:31;43458:12;43440:17;:31::i;:::-;43626:1;43609:749;43633:12;43629:1;:16;43609:749;;;43667:30;;:::i;:::-;43700:8;43713:1;43709;:5;43700:15;;;;;;;;;;;;;;43667:48;;43730:31;;:::i;:::-;43764:8;43773:1;43764:11;;;;;;;;;;;;;;43730:45;;43871:31;43889:12;43871:17;:31::i;:::-;44026:17;;:19;44003:17;;;;:19;:42;;;;;;;43977:149;;;;-1:-1:-1;;;43977:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44250:12;:17;;;:19;;;44227:42;;:11;:17;;;:19;;;:42;;;44201:145;;;;-1:-1:-1;;;44201:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43647:3:0;;43609:749;;;;42022:2343;;;;;;:::o;70562:529::-;70673:6;70697:23;70723:8;70732:1;70723:11;;;;;;;;;;;;;;:17;;;:19;;;70697:45;;70759:16;:21;;70779:1;70759:21;70755:62;;;70804:1;70797:8;;;;;70755:62;70834:9;70829:211;70853:8;:15;70849:1;:19;70829:211;;;70890:26;;:::i;:::-;70919:8;70928:1;70919:11;;;;;;;;;;;;;;70890:40;;70968:16;70949:35;;:7;:13;;;:15;;;:35;;;70945:84;;71012:1;71005:8;;;;;;;70945:84;-1:-1:-1;70870:3:0;;70829:211;;;-1:-1:-1;71066:16:0;70562:529;-1:-1:-1;;70562:529:0:o;71356:550::-;71467:6;71491:23;71517:8;71526:1;71517:11;;;;;;;;;;;;;;:17;;;:19;;;71491:45;;71553:16;:21;;71573:1;71553:21;71549:62;;;71598:1;71591:8;;;;;71549:62;71628:9;71623:232;71647:8;:15;71643:1;:19;71623:232;;;71684:26;;:::i;:::-;71713:8;71722:1;71713:11;;;;;;;;;;;;;;71684:40;;71784:7;:13;;;:15;;;71743:56;;:37;71763:16;71743:37;;:7;:13;;;:15;;;:19;;;;:37;;;;:::i;:::-;:56;71739:105;;71827:1;71820:8;;;;;;;71739:105;-1:-1:-1;71664:3:0;;71623:232;;66696:193;66820:9;66868:4;66874:6;66854:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;66854:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66854:27:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;66854:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;66847:34:0;66696:193;-1:-1:-1;;;66696:193:0:o;2244:471::-;2302:7;2547:6;2543:47;;-1:-1:-1;2577:1:0;2570:8;;2543:47;2614:5;;;2618:1;2614;:5;:1;2638:5;;;;;:10;2630:56;;;;-1:-1:-1;;;2630:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3183:132;3241:7;3268:39;3272:1;3275;3268:39;;;;;;;;;;;;;;;;;:3;:39::i;16875:222::-;16960:129;16987:9;17011:6;16960:129;;;;;;;;;;;;;;;;;:12;:129::i;54207:3901::-;55112:24;;55151:403;55175:7;:14;55171:1;:18;55151:403;;;55211:21;55235:6;:18;55242:7;55250:1;55242:10;;;;;;;;;;;;;;55235:18;;;;;;;;;;;55211:42;;55311:8;55294:4;:13;;;:25;55268:125;;;;-1:-1:-1;;;55268:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55458:12;;;;55408:30;55441;;;:16;:30;;;;;55526:15;;55505:37;;:16;;:37;:20;:37;:::i;:::-;55486:56;-1:-1:-1;;;55191:3:0;;55151:403;;;-1:-1:-1;55566:27:0;55608:31;55655:16;55642:30;;;2:2:-1;;;;27:1;24;17:12;2:2;55642:30:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;55642:30:0;-1:-1:-1;55608:64:0;-1:-1:-1;55688:9:0;55683:791;55707:7;:14;55703:1;:18;55683:791;;;55743:21;55767:6;:18;55774:7;55782:1;55774:10;;;;;;;;;;;;;;55767:18;;;;;;;;;;;55743:42;;55800:30;55833:16;:30;55850:4;:12;;;55833:30;;;;;;;;;;;55800:63;;55883:9;55895:1;55883:13;;55878:585;55902:15;;55898:19;;55878:585;;;55943:17;55963:8;55972:1;55963:11;;;;;;;;;;;;;;;:17;:11;;;;;:17;:19;;;;-1:-1:-1;55963:11:0;56037:222;56061:19;56057:1;:23;56037:222;;;56136:10;56114:32;;:15;56130:1;56114:18;;;;;;;;;;;;;;:32;;;56110:130;;;56180:4;56175:9;;56211:5;;56110:130;56082:3;;56037:222;;;;56283:2;56279:59;;;56310:8;;;;56279:59;56397:10;56358:15;56374:19;56358:36;;;;;;;;:49;;;;:36;;;;;;;;;;;:49;-1:-1:-1;;56426:21:0;;;;;55878:585;55919:3;;55878:585;;;-1:-1:-1;;;55723:3:0;;55683:791;;;-1:-1:-1;56491:9:0;56486:1615;56510:15;:22;56506:1;:26;56486:1615;;;56554:11;56568:15;56584:1;56568:18;;;;;;;;;;;;;;;;;;;-1:-1:-1;56601:23:0;56669:1;56601:23;56685:848;56709:7;:14;56705:1;:18;56685:848;;;56749:21;56773:6;:18;56780:7;56788:1;56780:10;;;;;;;;;;;;;;56773:18;;;;;;;;;;;56749:42;;56810:30;56843:16;:30;56860:4;:12;;;56843:30;;;;;;;;;;;56810:63;;56893:20;56915:7;56926:95;56967:8;56926:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56998:4;56926:18;:95::i;:::-;56892:129;;;;57050:2;57042:40;;;;;-1:-1:-1;;;57042:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;57104:9;57115:8;57127:38;57136:8;57145:12;57136:22;;;;;;;;;;;;;;;;;57127:38;;;;;;;;57136:22;;;;;;;57127:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57160:4;57127:8;:38::i;:::-;57103:62;;;;57190:1;:6;;57195:1;57190:6;57186:332;;57337:98;57390:22;:15;:22;;;;:19;:22;:::i;:::-;57337;:15;:22;;;;:19;:22;:::i;:::-;:26;:98;:26;:98;:::i;:::-;57319:116;-1:-1:-1;57476:22:0;:15;:22;;;;:19;:22;:::i;:::-;57458:40;;57186:332;-1:-1:-1;;56725:3:0;;;;;-1:-1:-1;56685:848:0;;-1:-1:-1;;;56685:848:0;;-1:-1:-1;57953:25:0;:15;:25;;;;:19;:25;:::i;:::-;57934:15;:44;57908:181;;;;-1:-1:-1;;;57908:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56534:3:0;;56486:1615;;16477:390;16632:29;16654:6;16632:21;:29::i;:::-;16663:12;16624:52;;;;;-1:-1:-1;;;16624:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;16624:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16706:33:0;;16688:12;;16706:14;;;;16728:6;;16688:12;16706:33;16688:12;16706:33;16728:6;16706:14;:33;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;16687:52:0;;;16758:7;16750:45;;;;;-1:-1:-1;;;16750:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16811:48;;;;;;;;;;;;16834:4;;16811:48;;;;;;;;;16477:390;;;;:::o;1801:192::-;1887:7;1923:12;1915:6;;;;1907:29;;;;-1:-1:-1;;;1907:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;1907:29:0;-1:-1:-1;;;1959:5:0;;;1801:192::o;47917:855::-;48009:21;48067:15;;:26;;;;;;;;48009:21;;48067:15;;;:24;;:26;;;;;;;;;;;;;;48009:21;48067:15;:26;;;2:2:-1;;;;27:1;24;17:12;2:2;48067:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48067:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;48067:26:0;;-1:-1:-1;48126:13:0;48104:117;;;;-1:-1:-1;;;48104:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48242:11;48234:52;;;;;-1:-1:-1;;;48234:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48310:6;48331:17;;;48327:63;;;-1:-1:-1;48370:8:0;48327:63;48459:9;48424:15;;;;;;;;;;;:28;;;48453:2;48424:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48424:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48424:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;48424:32:0;:44;48402:131;;;;-1:-1:-1;;;48402:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48546:4;;48561:152;48568:7;;48561:152;;48632:9;48596:15;;;;;;;;;;;:28;;;48625:2;48596:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;48596:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48596:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;48596:32:0;:45;48592:91;;48662:5;;48592:91;48697:4;;48561:152;;;48732:15;;;:32;;;;;;:15;48757:6;;48732:32;;;;;;:15;;;;;:24;;:32;;;;;;;;;;;;;;;;;:15;:32;;;2:2:-1;;;;27:1;24;17:12;2:2;48732:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48732:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;48732:32:0;;47917:855;-1:-1:-1;;;;;47917:855:0:o;72224:347::-;72383:15;;72343:9;72409:155;72416:5;;72409:155;;72438:3;;;;;;;;72482:1;72460:23;;:8;72469:1;72460:11;;;;;;;;;;;;;;:16;;;:18;;;:23;;;72456:97;;-1:-1:-1;72509:4:0;72532:5;;72456:97;72409:155;;;72224:347;;;;;:::o;40861:746::-;41038:9;;:11;;41080;;;;;41122:10;;;;:12;;41165;;;40964:17;;;;41031:19;;;;;41073;;;41115:20;;;;41158;41199:7;;;41191:44;;;;;-1:-1:-1;;;41191:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41269:7;;;;-1:-1:-1;41453:6:0;;;41437;;;41436:13;;41453:6;;;41452:13;;41436:29;41425:8;41486:6;;;41478:30;;;;;-1:-1:-1;;;41478:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41531:6;41527:1;:10;41519:47;;;;;-1:-1:-1;;;41519:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41597:1;40861:746;;-1:-1:-1;40861:746:0;;-1:-1:-1;;;;;;40861:746:0:o;6789:218::-;6845:6;6875:5;;;6900:6;;;;;;:16;;;6915:1;6910;:6;;6900:16;6899:38;;;;6926:1;6922;:5;:14;;;;;6935:1;6931;:5;6922:14;6891:87;;;;-1:-1:-1;;;6891:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41715:207;41807:12;;:14;41844:13;;;;:15;41878:7;;;;;;;;41870:44;;;;;-1:-1:-1;;;41870:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41715:207;;;:::o;3803:345::-;3889:7;3991:12;3984:5;3976:28;;;;-1:-1:-1;;;3976:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;3976:28:0;;4015:9;4031:1;4027;:5;;;;;;;3803:345;-1:-1:-1;;;;;3803:345:0:o;16154:214::-;16307:4;16340:20;-1:-1:-1;16330:30:0;;16154:214::o;49900:22674::-;;;;;;;;;-1:-1:-1;49900:22674:0;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49900:22674:0;;;-1:-1:-1;49900:22674:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;49900:22674:0;;;;;;;;:::o
Swarm Source
ipfs://4278218a946c2ad66e5cf564df612117578f94a8b00397a2d9afe188b652056d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,467.58 | 0.00008236 | $0.285607 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.