Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
315297637 | 40 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
ImpermaxV3Collateral
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan.io on 2025-03-13 */ // File: contracts\CStorage.sol pragma solidity =0.5.16; pragma experimental ABIEncoderV2; contract CStorage { address public underlying; address public factory; address public borrowable0; address public borrowable1; uint public safetyMarginSqrt = 1.58113883e18; //safetyMargin: 250% uint public liquidationIncentive = 1.02e18; //2% uint public liquidationFee = 0.02e18; //2% mapping(uint => uint) public blockOfLastRestructureOrLiquidation; function liquidationPenalty() public view returns (uint) { return liquidationIncentive + liquidationFee; } } // File: contracts\libraries\SafeMath.sol pragma solidity =0.5.16; // From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/Math.sol // Subject to the MIT license. /** * @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 addition of two unsigned integers, reverting with custom message on overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, errorMessage); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot underflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction underflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot underflow. */ 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 multiplication of two unsigned integers, reverting on overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b, string memory errorMessage) 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, errorMessage); 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: contracts\interfaces\IERC721.sol pragma solidity >=0.5.0; interface IERC721 { event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); function name() external view returns (string memory); function symbol() external view returns (string memory); function balanceOf(address owner) external view returns (uint256 balance); function ownerOf(uint256 tokenId) external view returns (address owner); function getApproved(uint256 tokenId) external view returns (address operator); function isApprovedForAll(address owner, address operator) external view returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function nonces(uint256 tokenId) external view returns (uint256); function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; function safeTransferFrom(address from, address to, uint256 tokenId) external; function transferFrom(address from, address to, uint256 tokenId) external; function approve(address to, uint256 tokenId) external; function setApprovalForAll(address operator, bool approved) external; function permit(address spender, uint tokenId, uint deadline, uint8 v, bytes32 r, bytes32 s) external; } // File: contracts\interfaces\IERC721Receiver.sol pragma solidity >=0.5.0; interface IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: contracts\ImpermaxERC721.sol pragma solidity =0.5.16; contract ImpermaxERC721 is IERC721 { using SafeMath for uint; string public name; string public symbol; mapping(address => uint) public balanceOf; mapping(uint256 => address) internal _ownerOf; mapping(uint256 => address) public getApproved; mapping(address => mapping(address => bool)) public isApprovedForAll; bytes32 public DOMAIN_SEPARATOR; mapping(uint256 => uint) public nonces; constructor() public {} function _setName(string memory _name, string memory _symbol) internal { name = _name; symbol = _symbol; uint chainId; assembly { chainId := chainid } DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(_name)), keccak256(bytes("1")), chainId, address(this) ) ); } function _isAuthorized(address owner, address operator, uint256 tokenId) internal view returns (bool) { return operator != address(0) && (owner == operator || isApprovedForAll[owner][operator] || getApproved[tokenId] == operator); } function _checkAuthorized(address owner, address operator, uint256 tokenId) internal view { require(_isAuthorized(owner, operator, tokenId), "ImpermaxERC721: UNAUTHORIZED"); } function _update(address to, uint256 tokenId, address auth) internal returns (address from) { from = _ownerOf[tokenId]; if (auth != address(0)) _checkAuthorized(from, auth, tokenId); if (from != address(0)) { _approve(address(0), tokenId, address(0)); balanceOf[from] -= 1; } if (to != address(0)) { balanceOf[to] += 1; } _ownerOf[tokenId] = to; emit Transfer(from, to, tokenId); } function _mint(address to, uint256 tokenId) internal { require(to != address(0), "ImpermaxERC721: INVALID_RECEIVER"); address previousOwner = _update(to, tokenId, address(0)); require(previousOwner == address(0), "ImpermaxERC721: INVALID_SENDER"); } function _safeMint(address to, uint256 tokenId) internal { _safeMint(to, tokenId, ""); } function _safeMint(address to, uint256 tokenId, bytes memory data) internal { _mint(to, tokenId); _checkOnERC721Received(address(0), to, tokenId, data); } function _burn(uint256 tokenId) internal { address previousOwner = _update(address(0), tokenId, address(0)); require(previousOwner != address(0), "ImpermaxERC721: NONEXISTENT_TOKEN"); } function _transfer(address from, address to, uint256 tokenId, address auth) internal { require(to != address(0), "ImpermaxERC721: INVALID_RECEIVER"); address previousOwner = _update(to, tokenId, auth); require(previousOwner != address(0), "ImpermaxERC721: NONEXISTENT_TOKEN"); require(previousOwner == from, "ImpermaxERC721: INCORRECT_OWNER"); } function _safeTransfer(address from, address to, uint256 tokenId, address auth) internal { _safeTransfer(from, to, tokenId, "", auth); } function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data, address auth) internal { _transfer(from, to, tokenId, auth); _checkOnERC721Received(from, to, tokenId, data); } function _approve(address to, uint256 tokenId, address auth) internal { address owner = _requireOwned(tokenId); require(auth == address(0) || auth == owner || isApprovedForAll[owner][auth], "ImpermaxERC721: INVALID_APPROVER"); getApproved[tokenId] = to; emit Approval(owner, to, tokenId); } function _setApprovalForAll(address owner, address operator, bool approved) internal { require(operator != address(0), "ImpermaxERC721: INVALID_OPERATOR"); isApprovedForAll[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } function _requireOwned(uint256 tokenId) internal view returns (address) { address owner = _ownerOf[tokenId]; require(owner != address(0), "ImpermaxERC721: NONEXISTENT_TOKEN"); return owner; } function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) internal { if (isContract(to)) { bytes4 retval = IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, data); require(retval == bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")), "ImpermaxERC721: INVALID_RECEIVER"); } } function ownerOf(uint256 tokenId) external view returns (address) { return _requireOwned(tokenId); } function approve(address to, uint256 tokenId) external { _approve(to, tokenId, msg.sender); } function setApprovalForAll(address operator, bool approved) external { _setApprovalForAll(msg.sender, operator, approved); } function transferFrom(address from, address to, uint256 tokenId) external { _transfer(from, to, tokenId, msg.sender); } function safeTransferFrom(address from, address to, uint256 tokenId) external { _safeTransfer(from, to, tokenId, msg.sender); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external { _safeTransfer(from, to, tokenId, data, msg.sender); } function _checkSignature(address spender, uint tokenId, uint deadline, uint8 v, bytes32 r, bytes32 s, bytes32 typehash) internal { require(deadline >= block.timestamp, "ImpermaxERC721: EXPIRED"); bytes32 digest = keccak256( abi.encodePacked( '\x19\x01', DOMAIN_SEPARATOR, keccak256(abi.encode(typehash, spender, tokenId, nonces[tokenId]++, deadline)) ) ); address owner = _requireOwned(tokenId); address recoveredAddress = ecrecover(digest, v, r, s); require(recoveredAddress == owner, "ImpermaxERC721: INVALID_SIGNATURE"); } // keccak256("Permit(address spender,uint256 tokenId,uint256 nonce,uint256 deadline)"); bytes32 public constant PERMIT_TYPEHASH = 0x49ecf333e5b8c95c40fdafc95c1ad136e8914a8fb55e9dc8bb01eaa83a2df9ad; function permit(address spender, uint tokenId, uint deadline, uint8 v, bytes32 r, bytes32 s) external { _checkSignature(spender, tokenId, deadline, v, r, s, PERMIT_TYPEHASH); _approve(spender, tokenId, address(0)); } /* Utilities */ function isContract(address _addr) private view returns (bool){ uint32 size; assembly { size := extcodesize(_addr) } return (size > 0); } } // File: contracts\interfaces\IFactory.sol pragma solidity >=0.5.0; interface IFactory { event LendingPoolInitialized(address indexed nftlp, address indexed token0, address indexed token1, address collateral, address borrowable0, address borrowable1, uint lendingPoolId); event NewPendingAdmin(address oldPendingAdmin, address newPendingAdmin); event NewAdmin(address oldAdmin, address newAdmin); event NewReservesPendingAdmin(address oldReservesPendingAdmin, address newReservesPendingAdmin); event NewReservesAdmin(address oldReservesAdmin, address newReservesAdmin); event NewReservesManager(address oldReservesManager, address newReservesManager); function admin() external view returns (address); function pendingAdmin() external view returns (address); function reservesAdmin() external view returns (address); function reservesPendingAdmin() external view returns (address); function reservesManager() external view returns (address); function getLendingPool(address nftlp) external view returns ( bool initialized, uint24 lendingPoolId, address collateral, address borrowable0, address borrowable1 ); function allLendingPools(uint) external view returns (address nftlp); function allLendingPoolsLength() external view returns (uint); function bDeployer() external view returns (address); function cDeployer() external view returns (address); function createCollateral(address nftlp) external returns (address collateral); function createBorrowable0(address nftlp) external returns (address borrowable0); function createBorrowable1(address nftlp) external returns (address borrowable1); function initializeLendingPool(address nftlp) external; function _setPendingAdmin(address newPendingAdmin) external; function _acceptAdmin() external; function _setReservesPendingAdmin(address newPendingAdmin) external; function _acceptReservesAdmin() external; function _setReservesManager(address newReservesManager) external; } // File: contracts\CSetter.sol pragma solidity =0.5.16; contract CSetter is ImpermaxERC721, CStorage { uint public constant SAFETY_MARGIN_SQRT_MIN = 1.00e18; //safetyMargin: 100% uint public constant SAFETY_MARGIN_SQRT_MAX = 1.58113884e18; //safetyMargin: 250% uint public constant LIQUIDATION_INCENTIVE_MIN = 1.00e18; //100% uint public constant LIQUIDATION_INCENTIVE_MAX = 1.05e18; //105% uint public constant LIQUIDATION_FEE_MAX = 0.08e18; //8% event NewSafetyMargin(uint newSafetyMarginSqrt); event NewLiquidationIncentive(uint newLiquidationIncentive); event NewLiquidationFee(uint newLiquidationFee); // called once by the factory function _setFactory() external { require(factory == address(0), "ImpermaxV3Collateral: FACTORY_ALREADY_SET"); factory = msg.sender; } function _initialize ( string calldata _name, string calldata _symbol, address _underlying, address _borrowable0, address _borrowable1 ) external { require(msg.sender == factory, "ImpermaxV3Collateral: UNAUTHORIZED"); // sufficient check _setName(_name, _symbol); underlying = _underlying; borrowable0 = _borrowable0; borrowable1 = _borrowable1; } function _setSafetyMarginSqrt(uint newSafetyMarginSqrt) external nonReentrant { _checkSetting(newSafetyMarginSqrt, SAFETY_MARGIN_SQRT_MIN, SAFETY_MARGIN_SQRT_MAX); safetyMarginSqrt = newSafetyMarginSqrt; emit NewSafetyMargin(newSafetyMarginSqrt); } function _setLiquidationIncentive(uint newLiquidationIncentive) external nonReentrant { _checkSetting(newLiquidationIncentive, LIQUIDATION_INCENTIVE_MIN, LIQUIDATION_INCENTIVE_MAX); liquidationIncentive = newLiquidationIncentive; emit NewLiquidationIncentive(newLiquidationIncentive); } function _setLiquidationFee(uint newLiquidationFee) external nonReentrant { _checkSetting(newLiquidationFee, 0, LIQUIDATION_FEE_MAX); liquidationFee = newLiquidationFee; emit NewLiquidationFee(newLiquidationFee); } function _checkSetting(uint parameter, uint min, uint max) internal view { _checkAdmin(); require(parameter >= min, "ImpermaxV3Collateral: INVALID_SETTING"); require(parameter <= max, "ImpermaxV3Collateral: INVALID_SETTING"); } function _checkAdmin() internal view { require(msg.sender == IFactory(factory).admin(), "ImpermaxV3Collateral: UNAUTHORIZED"); } /*** Utilities ***/ // prevents a contract from calling itself, directly or indirectly. bool internal _notEntered = true; modifier nonReentrant() { require(_notEntered, "ImpermaxV3Collateral: REENTERED"); _notEntered = false; _; _notEntered = true; } } // File: contracts\interfaces\IBorrowable.sol pragma solidity >=0.5.0; interface IBorrowable { /*** Impermax ERC20 ***/ event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; /*** Pool Token ***/ event Mint(address indexed sender, address indexed minter, uint mintAmount, uint mintTokens); event Redeem(address indexed sender, address indexed redeemer, uint redeemAmount, uint redeemTokens); event Sync(uint totalBalance); function underlying() external view returns (address); function factory() external view returns (address); function totalBalance() external view returns (uint); function MINIMUM_LIQUIDITY() external pure returns (uint); function exchangeRate() external returns (uint); function mint(address minter) external returns (uint mintTokens); function redeem(address redeemer) external returns (uint redeemAmount); function skim(address to) external; function sync() external; function _setFactory() external; /*** Borrowable ***/ event BorrowApproval(address indexed owner, address indexed spender, uint value); event Borrow(address indexed sender, uint256 indexed tokenId, address indexed receiver, uint borrowAmount, uint repayAmount, uint accountBorrowsPrior, uint accountBorrows, uint totalBorrows); event Liquidate(address indexed sender, uint256 indexed tokenId, address indexed liquidator, uint seizeTokenId, uint repayAmount, uint accountBorrowsPrior, uint accountBorrows, uint totalBorrows); event RestructureDebt(uint256 indexed tokenId, uint reduceToRatio, uint repayAmount, uint accountBorrowsPrior, uint accountBorrows, uint totalBorrows); function collateral() external view returns (address); function reserveFactor() external view returns (uint); function exchangeRateLast() external view returns (uint); function borrowIndex() external view returns (uint); function totalBorrows() external view returns (uint); function borrowAllowance(address owner, address spender) external view returns (uint); function borrowBalance(uint tokenId) external view returns (uint); function currentBorrowBalance(uint tokenId) external returns (uint); function BORROW_PERMIT_TYPEHASH() external pure returns (bytes32); function borrowApprove(address spender, uint256 value) external returns (bool); function borrowPermit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; function borrow(uint256 tokenId, address receiver, uint borrowAmount, bytes calldata data) external; function liquidate(uint256 tokenId, uint repayAmount, address liquidator, bytes calldata data) external returns (uint seizeTokenId); function restructureDebt(uint256 tokenId, uint256 reduceToRatio) external; /*** Borrowable Interest Rate Model ***/ event AccrueInterest(uint interestAccumulated, uint borrowIndex, uint totalBorrows); event CalculateKink(uint kinkRate); event CalculateBorrowRate(uint borrowRate); function KINK_BORROW_RATE_MAX() external pure returns (uint); function KINK_BORROW_RATE_MIN() external pure returns (uint); function KINK_MULTIPLIER() external pure returns (uint); function borrowRate() external view returns (uint); function kinkBorrowRate() external view returns (uint); function kinkUtilizationRate() external view returns (uint); function adjustSpeed() external view returns (uint); function rateUpdateTimestamp() external view returns (uint32); function accrualTimestamp() external view returns (uint32); function accrueInterest() external; /*** Borrowable Setter ***/ event NewReserveFactor(uint newReserveFactor); event NewKinkUtilizationRate(uint newKinkUtilizationRate); event NewAdjustSpeed(uint newAdjustSpeed); event NewDebtCeiling(uint newDebtCeiling); function RESERVE_FACTOR_MAX() external pure returns (uint); function KINK_UR_MIN() external pure returns (uint); function KINK_UR_MAX() external pure returns (uint); function ADJUST_SPEED_MIN() external pure returns (uint); function ADJUST_SPEED_MAX() external pure returns (uint); function _initialize ( string calldata _name, string calldata _symbol, address _underlying, address _collateral ) external; function _setReserveFactor(uint newReserveFactor) external; function _setKinkUtilizationRate(uint newKinkUtilizationRate) external; function _setAdjustSpeed(uint newAdjustSpeed) external; } // File: contracts\interfaces\ICollateral.sol pragma solidity >=0.5.0; interface ICollateral { /* ImpermaxERC721 */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); function name() external view returns (string memory); function symbol() external view returns (string memory); function balanceOf(address owner) external view returns (uint256 balance); function ownerOf(uint256 tokenId) external view returns (address owner); function getApproved(uint256 tokenId) external view returns (address operator); function isApprovedForAll(address owner, address operator) external view returns (bool); function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; function safeTransferFrom(address from, address to, uint256 tokenId) external; function transferFrom(address from, address to, uint256 tokenId) external; function approve(address to, uint256 tokenId) external; function setApprovalForAll(address operator, bool approved) external; function permit(address spender, uint tokenId, uint deadline, uint8 v, bytes32 r, bytes32 s) external; /* Collateral */ event Mint(address indexed to, uint tokenId); event Redeem(address indexed to, uint tokenId, uint percentage, uint redeemTokenId); event Seize(address indexed to, uint tokenId, uint percentage, uint redeemTokenId); event RestructureBadDebt(uint tokenId, uint postLiquidationCollateralRatio); function underlying() external view returns (address); function factory() external view returns (address); function borrowable0() external view returns (address); function borrowable1() external view returns (address); function safetyMarginSqrt() external view returns (uint); function liquidationIncentive() external view returns (uint); function liquidationFee() external view returns (uint); function liquidationPenalty() external view returns (uint); function mint(address to, uint256 tokenId) external; function redeem(address to, uint256 tokenId, uint256 percentage, bytes calldata data) external returns (uint redeemTokenId); function redeem(address to, uint256 tokenId, uint256 percentage) external returns (uint redeemTokenId); function isLiquidatable(uint tokenId) external returns (bool); function isUnderwater(uint tokenId) external returns (bool); function canBorrow(uint tokenId, address borrowable, uint accountBorrows) external returns (bool); function restructureBadDebt(uint tokenId) external; function seize(uint tokenId, uint repayAmount, address liquidator, bytes calldata data) external returns (uint seizeTokenId); /* CSetter */ event NewSafetyMargin(uint newSafetyMarginSqrt); event NewLiquidationIncentive(uint newLiquidationIncentive); event NewLiquidationFee(uint newLiquidationFee); function SAFETY_MARGIN_SQRT_MIN() external pure returns (uint); function SAFETY_MARGIN_SQRT_MAX() external pure returns (uint); function LIQUIDATION_INCENTIVE_MIN() external pure returns (uint); function LIQUIDATION_INCENTIVE_MAX() external pure returns (uint); function LIQUIDATION_FEE_MAX() external pure returns (uint); function _setFactory() external; function _initialize ( string calldata _name, string calldata _symbol, address _underlying, address _borrowable0, address _borrowable1 ) external; function _setSafetyMarginSqrt(uint newSafetyMarginSqrt) external; function _setLiquidationIncentive(uint newLiquidationIncentive) external; function _setLiquidationFee(uint newLiquidationFee) external; } // File: contracts\interfaces\IImpermaxCallee.sol pragma solidity >=0.5.0; interface IImpermaxCallee { function impermaxV3Borrow(address sender, uint256 tokenId, uint borrowAmount, bytes calldata data) external; function impermaxV3Redeem(address sender, uint256 tokenId, uint256 redeemTokenId, bytes calldata data) external; } // File: contracts\interfaces\INFTLP.sol pragma solidity >=0.5.0; interface INFTLP { struct RealXY { uint256 realX; uint256 realY; } struct RealXYs { RealXY lowestPrice; RealXY currentPrice; RealXY highestPrice; } // ERC-721 function ownerOf(uint256 _tokenId) external view returns (address); function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; function safeTransferFrom(address from, address to, uint256 tokenId) external; function transferFrom(address from, address to, uint256 tokenId) external; // Global state function token0() external view returns (address); function token1() external view returns (address); // Position state function getPositionData(uint256 _tokenId, uint256 _safetyMarginSqrt) external returns ( uint256 priceSqrtX96, RealXYs memory realXYs ); // Interactions function split(uint256 tokenId, uint256 percentage) external returns (uint256 newTokenId); function join(uint256 tokenId, uint256 tokenToJoin) external; } // File: contracts\libraries\CollateralMath.sol pragma solidity =0.5.16; library CollateralMath { using SafeMath for uint; uint constant Q64 = 2**64; uint constant Q96 = 2**96; uint constant Q192 = 2**192; enum Price {LOWEST, CURRENT, HIGHEST} struct PositionObject { INFTLP.RealXYs realXYs; uint priceSqrtX96; uint debtX; uint debtY; uint liquidationPenalty; uint safetyMarginSqrt; } function newPosition( INFTLP.RealXYs memory realXYs, uint priceSqrtX96, uint debtX, uint debtY, uint liquidationPenalty, uint safetyMarginSqrt ) internal pure returns (PositionObject memory) { return PositionObject({ realXYs: realXYs, priceSqrtX96: priceSqrtX96, debtX: debtX, debtY: debtY, liquidationPenalty: liquidationPenalty, safetyMarginSqrt: safetyMarginSqrt }); } function safeInt256(uint256 n) internal pure returns (int256) { require(n < 2**255, "Impermax: SAFE_INT"); return int256(n); } // price function getRelativePriceX(uint priceSqrtX96) internal pure returns (uint) { return priceSqrtX96; } // 1 / price function getRelativePriceY(uint priceSqrtX96) internal pure returns (uint) { return Q192.div(priceSqrtX96); } // amountX * priceX + amountY * priceY function getValue(PositionObject memory positionObject, Price price, uint amountX, uint amountY) internal pure returns (uint) { uint priceSqrtX96 = positionObject.priceSqrtX96; if (price == Price.LOWEST) priceSqrtX96 = priceSqrtX96.mul(1e18).div(positionObject.safetyMarginSqrt); if (price == Price.HIGHEST) priceSqrtX96 = priceSqrtX96.mul(positionObject.safetyMarginSqrt).div(1e18); uint relativePriceX = getRelativePriceX(priceSqrtX96); uint relativePriceY = getRelativePriceY(priceSqrtX96); return amountX.mul(relativePriceX).div(Q64).add(amountY.mul(relativePriceY).div(Q64)); } // realX * priceX + realY * priceY function getCollateralValue(PositionObject memory positionObject, Price price) internal pure returns (uint) { INFTLP.RealXY memory realXY = positionObject.realXYs.currentPrice; if (price == Price.LOWEST) realXY = positionObject.realXYs.lowestPrice; if (price == Price.HIGHEST) realXY = positionObject.realXYs.highestPrice; return getValue(positionObject, price, realXY.realX, realXY.realY); } // debtX * priceX + realY * debtY function getDebtValue(PositionObject memory positionObject, Price price) internal pure returns (uint) { return getValue(positionObject, price, positionObject.debtX, positionObject.debtY); } // collateralValue - debtValue * liquidationPenalty function getLiquidityPostLiquidation(PositionObject memory positionObject, Price price) internal pure returns (int) { uint collateralNeeded = getDebtValue(positionObject, price).mul(positionObject.liquidationPenalty).div(1e18); uint collateralValue = getCollateralValue(positionObject, price); return safeInt256(collateralValue) - safeInt256(collateralNeeded); } // collateralValue / (debtValue * liquidationPenalty) function getPostLiquidationCollateralRatio(PositionObject memory positionObject) internal pure returns (uint) { uint collateralNeeded = getDebtValue(positionObject, Price.CURRENT).mul(positionObject.liquidationPenalty).div(1e18); uint collateralValue = getCollateralValue(positionObject, Price.CURRENT); return collateralValue.mul(1e18).div(collateralNeeded, "ImpermaxV3Collateral: NO_DEBT"); } function isLiquidatable(PositionObject memory positionObject) internal pure returns (bool) { int a = getLiquidityPostLiquidation(positionObject, Price.LOWEST); int b = getLiquidityPostLiquidation(positionObject, Price.HIGHEST); return a < 0 || b < 0; } function isUnderwater(PositionObject memory positionObject) internal pure returns (bool) { int liquidity = getLiquidityPostLiquidation(positionObject, Price.CURRENT); return liquidity < 0; } } // File: contracts\ImpermaxV3Collateral.sol pragma solidity =0.5.16; contract ImpermaxV3Collateral is ICollateral, CSetter { using CollateralMath for CollateralMath.PositionObject; uint256 internal constant Q192 = 2**192; constructor() public {} /*** Collateralization Model ***/ function _getPositionObjectAmounts(uint tokenId, uint debtX, uint debtY) internal returns (CollateralMath.PositionObject memory positionObject) { if (debtX == uint(-1)) debtX = IBorrowable(borrowable0).currentBorrowBalance(tokenId); if (debtY == uint(-1)) debtY = IBorrowable(borrowable1).currentBorrowBalance(tokenId); (uint priceSqrtX96, INFTLP.RealXYs memory realXYs) = INFTLP(underlying).getPositionData(tokenId, safetyMarginSqrt); require(priceSqrtX96 > 100 && priceSqrtX96 < Q192 / 100, "ImpermaxV3Collateral: PRICE_CALCULATION_ERROR"); positionObject = CollateralMath.newPosition(realXYs, priceSqrtX96, debtX, debtY, liquidationPenalty(), safetyMarginSqrt); } function _getPositionObject(uint tokenId) internal returns (CollateralMath.PositionObject memory positionObject) { return _getPositionObjectAmounts(tokenId, uint(-1), uint(-1)); } /*** ERC721 Wrapper ***/ function mint(address to, uint256 tokenId) external nonReentrant { require(_ownerOf[tokenId] == address(0), "ImpermaxV3Collateral: NFT_ALREADY_MINTED"); require(INFTLP(underlying).ownerOf(tokenId) == address(this), "ImpermaxV3Collateral: NFT_NOT_RECEIVED"); _mint(to, tokenId); emit Mint(to, tokenId); } function redeem(address to, uint256 tokenId, uint256 percentage, bytes memory data) public nonReentrant returns (uint256 redeemTokenId) { require(percentage <= 1e18, "ImpermaxV3Collateral: PERCENTAGE_ABOVE_100"); _checkAuthorized(_requireOwned(tokenId), msg.sender, tokenId); _approve(address(0), tokenId, address(0)); // reset approval // optimistically redeem if (percentage == 1e18) { redeemTokenId = tokenId; _burn(tokenId); INFTLP(underlying).safeTransferFrom(address(this), to, redeemTokenId); if (data.length > 0) IImpermaxCallee(to).impermaxV3Redeem(msg.sender, tokenId, redeemTokenId, data); // finally check that the position is not left underwater require(IBorrowable(borrowable0).borrowBalance(tokenId) == 0, "ImpermaxV3Collateral: INSUFFICIENT_LIQUIDITY"); require(IBorrowable(borrowable1).borrowBalance(tokenId) == 0, "ImpermaxV3Collateral: INSUFFICIENT_LIQUIDITY"); } else { redeemTokenId = INFTLP(underlying).split(tokenId, percentage); INFTLP(underlying).safeTransferFrom(address(this), to, redeemTokenId); if (data.length > 0) IImpermaxCallee(to).impermaxV3Redeem(msg.sender, tokenId, redeemTokenId, data); // finally check that the position is not left underwater require(!isLiquidatable(tokenId), "ImpermaxV3Collateral: INSUFFICIENT_LIQUIDITY"); } emit Redeem(to, tokenId, percentage, redeemTokenId); } function redeem(address to, uint256 tokenId, uint256 percentage) external returns (uint256 redeemTokenId) { return redeem(to, tokenId, percentage, ""); } /*** Collateral ***/ function isLiquidatable(uint tokenId) public returns (bool) { CollateralMath.PositionObject memory positionObject = _getPositionObject(tokenId); return positionObject.isLiquidatable(); } function isUnderwater(uint tokenId) public returns (bool) { CollateralMath.PositionObject memory positionObject = _getPositionObject(tokenId); return positionObject.isUnderwater(); } function canBorrow(uint tokenId, address borrowable, uint accountBorrows) public returns (bool) { address _borrowable0 = borrowable0; address _borrowable1 = borrowable1; require(borrowable == _borrowable0 || borrowable == _borrowable1, "ImpermaxV3Collateral: INVALID_BORROWABLE"); require(INFTLP(underlying).ownerOf(tokenId) == address(this), "ImpermaxV3Collateral: INVALID_NFTLP_ID"); uint debtX = borrowable == _borrowable0 ? accountBorrows : uint(-1); uint debtY = borrowable == _borrowable1 ? accountBorrows : uint(-1); CollateralMath.PositionObject memory positionObject = _getPositionObjectAmounts(tokenId, debtX, debtY); return !positionObject.isLiquidatable(); } function restructureBadDebt(uint tokenId) external nonReentrant { CollateralMath.PositionObject memory positionObject = _getPositionObject(tokenId); uint postLiquidationCollateralRatio = positionObject.getPostLiquidationCollateralRatio(); require(postLiquidationCollateralRatio < 1e18, "ImpermaxV3Collateral: NOT_UNDERWATER"); IBorrowable(borrowable0).restructureDebt(tokenId, postLiquidationCollateralRatio); IBorrowable(borrowable1).restructureDebt(tokenId, postLiquidationCollateralRatio); blockOfLastRestructureOrLiquidation[tokenId] = block.number; emit RestructureBadDebt(tokenId, postLiquidationCollateralRatio); } // this function must be called from borrowable0 or borrowable1 function seize(uint tokenId, uint repayAmount, address liquidator, bytes calldata data) external nonReentrant returns (uint seizeTokenId) { require(msg.sender == borrowable0 || msg.sender == borrowable1, "ImpermaxV3Collateral: UNAUTHORIZED"); uint repayToCollateralRatio; { CollateralMath.PositionObject memory positionObject = _getPositionObject(tokenId); if (blockOfLastRestructureOrLiquidation[tokenId] != block.number) { require(positionObject.isLiquidatable(), "ImpermaxV3Collateral: INSUFFICIENT_SHORTFALL"); require(!positionObject.isUnderwater(), "ImpermaxV3Collateral: CANNOT_LIQUIDATE_UNDERWATER_POSITION"); blockOfLastRestructureOrLiquidation[tokenId] = block.number; } uint collateralValue = positionObject.getCollateralValue(CollateralMath.Price.CURRENT); uint repayValue = msg.sender == borrowable0 ? positionObject.getValue(CollateralMath.Price.CURRENT, repayAmount, 0) : positionObject.getValue(CollateralMath.Price.CURRENT, 0, repayAmount); repayToCollateralRatio = repayValue.mul(1e18).div(collateralValue); require(repayToCollateralRatio.mul(liquidationPenalty()) <= 1e36, "ImpermaxV3Collateral: UNEXPECTED_RATIO"); } uint seizePercentage = repayToCollateralRatio.mul(liquidationIncentive).div(1e18); seizeTokenId = INFTLP(underlying).split(tokenId, seizePercentage); address reservesManager = IFactory(factory).reservesManager(); if (liquidationFee > 0) { uint feePercentage = repayToCollateralRatio.mul(liquidationFee).div(uint(1e18).sub(seizePercentage)); uint feeTokenId = INFTLP(underlying).split(tokenId, feePercentage); _mint(reservesManager, feeTokenId); // _safeMint would be unsafe emit Seize(reservesManager, tokenId, feePercentage, feeTokenId); } INFTLP(underlying).safeTransferFrom(address(this), liquidator, seizeTokenId, data); emit Seize(liquidator, tokenId, seizePercentage, seizeTokenId); } function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external pure returns (bytes4 returnValue) { operator; from; tokenId; data; return bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")); } } // File: contracts\interfaces\ICDeployer.sol pragma solidity >=0.5.0; interface ICDeployer { function deployCollateral(address nftlp) external returns (address collateral); } // File: contracts\CDeployer.sol pragma solidity =0.5.16; /* * This contract is used by the Factory to deploy Collateral(s) * The bytecode would be too long to fit in the Factory */ contract CDeployer is ICDeployer { constructor () public {} function deployCollateral(address nftlp) external returns (address collateral) { bytes memory bytecode = type(ImpermaxV3Collateral).creationCode; bytes32 salt = keccak256(abi.encodePacked(msg.sender, nftlp)); assembly { collateral := create2(0, add(bytecode, 32), mload(bytecode), salt) } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newLiquidationFee","type":"uint256"}],"name":"NewLiquidationFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newLiquidationIncentive","type":"uint256"}],"name":"NewLiquidationIncentive","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newSafetyMarginSqrt","type":"uint256"}],"name":"NewSafetyMargin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"percentage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"redeemTokenId","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"postLiquidationCollateralRatio","type":"uint256"}],"name":"RestructureBadDebt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"percentage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"redeemTokenId","type":"uint256"}],"name":"Seize","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LIQUIDATION_FEE_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LIQUIDATION_INCENTIVE_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LIQUIDATION_INCENTIVE_MIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SAFETY_MARGIN_SQRT_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SAFETY_MARGIN_SQRT_MIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_underlying","type":"address"},{"internalType":"address","name":"_borrowable0","type":"address"},{"internalType":"address","name":"_borrowable1","type":"address"}],"name":"_initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"_setFactory","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"newLiquidationFee","type":"uint256"}],"name":"_setLiquidationFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"newLiquidationIncentive","type":"uint256"}],"name":"_setLiquidationIncentive","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"newSafetyMarginSqrt","type":"uint256"}],"name":"_setSafetyMarginSqrt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"blockOfLastRestructureOrLiquidation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"borrowable0","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"borrowable1","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"borrowable","type":"address"},{"internalType":"uint256","name":"accountBorrows","type":"uint256"}],"name":"canBorrow","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isLiquidatable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isUnderwater","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"liquidationFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"liquidationIncentive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"liquidationPenalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"returnValue","type":"bytes4"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"redeemTokenId","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"redeemTokenId","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"restructureBadDebt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"safetyMarginSqrt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"repayAmount","type":"uint256"},{"internalType":"address","name":"liquidator","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"seize","outputs":[{"internalType":"uint256","name":"seizeTokenId","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"underlying","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526715f155637eba0c00600c55670e27c49886e60000600d5566470de4df820000600e556010805460ff1916600117905534801561004057600080fd5b50614d09806100506000396000f3fe608060405234801561001057600080fd5b50600436106102e95760003560e01c80634a5d316c11610191578063a36a3630116100e3578063bc9bd12a11610097578063d490e7e011610071578063d490e7e01461057a578063daf8881814610582578063e985e9c51461058a576102e9565b8063bc9bd12a14610341578063c45a01551461055f578063c548e3c514610567576102e9565b8063b26a970d116100c8578063b26a970d14610526578063b88d4fde14610539578063bb6ff3861461054c576102e9565b8063a36a363014610516578063afc8276c1461051e576102e9565b806370e18df6116101455780638c765e941161011f5780638c765e94146104f357806395d89b41146104fb578063a22cb46514610503576102e9565b806370e18df6146104ba5780637ac2ff7b146104cd5780637fd3ac4f146104e0576102e9565b80636352211e116101765780636352211e1461048c5780636f307dc31461049f57806370a08231146104a7576102e9565b80634a5d316c146104715780634fd42e1714610479576102e9565b806323f5589a1161024a57806333fabfd1116101fe5780633cf3e664116101d85780633cf3e6641461043857806340c10f191461044b57806342842e0e1461045e576102e9565b806333fabfd114610420578063356c571f146104285780633644e51514610430576102e9565b80632b83cccd1161022f5780632b83cccd146103fd5780632fa5ae1b1461041057806330adf81f14610418576102e9565b806323f5589a146103e257806327a0d11a146103ea576102e9565b8063141a468c116102a15780631ef63a79116102865780631ef63a791461039c578063211a4443146103af57806323b872dd146103cf576102e9565b8063141a468c14610369578063150b7a021461037c576102e9565b8063095ea7b3116102d2578063095ea7b31461032c5780630fb60fef146103415780630fc7a96414610356576102e9565b806306fdde03146102ee578063081812fc1461030c575b600080fd5b6102f661059d565b6040516103039190614950565b60405180910390f35b61031f61031a366004613c35565b610649565b604051610303919061479c565b61033f61033a366004613a08565b610671565b005b610349610680565b604051610303919061487b565b610349610364366004613c35565b61068c565b610349610377366004613c35565b61069e565b61038f61038a36600461395a565b6106b0565b6040516103039190614942565b61033f6103aa366004613c35565b6106d2565b6103c26103bd366004613c35565b6107be565b604051610303919061486d565b61033f6103dd36600461390d565b6107e3565b6103496107f4565b6103c26103f8366004613c71565b6107ff565b61034961040b366004613a38565b610a71565b61031f610a96565b610349610ab2565b610349610ad6565b610349610ae2565b610349610ae8565b610349610446366004613a6a565b610aee565b61033f610459366004613a08565b611143565b61033f61046c36600461390d565b61137d565b61033f611389565b61033f610487366004613c35565b611405565b61031f61049a366004613c35565b6114b9565b61031f6114ca565b6103496104b5366004613897565b6114e6565b61033f6104c8366004613c35565b6114f8565b61033f6104db366004613ae3565b61174c565b6103496104ee366004613cc2565b61178f565b610349611df1565b6102f6611df7565b61033f6105113660046139d8565b611e6f565b610349611e7a565b610349611e80565b6103c2610534366004613c35565b611e8c565b61033f61054736600461395a565b611eaa565b61033f61055a366004613c35565b611ef5565b61031f611fa9565b61033f610575366004613b88565b611fc5565b6103496120f1565b61031f6120fd565b6103c26105983660046138d3565b612119565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156106415780601f1061061657610100808354040283529160200191610641565b820191906000526020600020905b81548152906001019060200180831161062457829003601f168201915b505050505081565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b61067c828233612139565b5050565b670de0b6b3a764000081565b600f6020526000908152604090205481565b60076020526000908152604090205481565b60006040516106be90614755565b604051809103902090505b95945050505050565b60105460ff16610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a31565b60405180910390fd5b601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905561075381600067011c37937e080000612289565b600e8190556040517f21e5451a492a87031e8324e7e1e2ba821fdec0c40972393c9f74dd38bd88a6af9061078890839061487b565b60405180910390a150601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006107c86135f5565b6107d183612305565b90506107dc81612338565b9392505050565b6107ef8383833361236b565b505050565b600e54600d54015b90565b600a54600b5460009173ffffffffffffffffffffffffffffffffffffffff90811691811690851682148061085e57508073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b610894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614971565b6008546040517f6352211e000000000000000000000000000000000000000000000000000000008152309173ffffffffffffffffffffffffffffffffffffffff1690636352211e906108ea908a9060040161487b565b60206040518083038186803b15801561090257600080fd5b505afa158015610916573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061093a91908101906138b5565b73ffffffffffffffffffffffffffffffffffffffff1614610987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614ad1565b60008273ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146109e2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6109e4565b845b905060008273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614610a41577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610a43565b855b9050610a4d6135f5565b610a58898484612479565b9050610a6381612338565b159998505050505050505050565b6000610a8e84848460405180602001604052806000815250610aee565b949350505050565b600a5473ffffffffffffffffffffffffffffffffffffffff1681565b7f49ecf333e5b8c95c40fdafc95c1ad136e8914a8fb55e9dc8bb01eaa83a2df9ad81565b67011c37937e08000081565b600c5481565b60065481565b60105460009060ff16610b2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a31565b601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055670de0b6b3a7640000831115610b97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a81565b610baa610ba38561275f565b33866127bb565b610bb76000856000612139565b82670de0b6b3a76400001415610eb2575082610bd2816127fc565b6008546040517f42842e0e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906342842e0e90610c2c903090899086906004016147ff565b600060405180830381600087803b158015610c4657600080fd5b505af1158015610c5a573d6000803e3d6000fd5b50505050600082511115610cf3576040517f803aaa2600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063803aaa2690610cc09033908890869088906004016147e4565b600060405180830381600087803b158015610cda57600080fd5b505af1158015610cee573d6000803e3d6000fd5b505050505b600a546040517fb388f73900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063b388f73990610d4990879060040161487b565b60206040518083038186803b158015610d6157600080fd5b505afa158015610d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d999190810190613c53565b15610dd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a51565b600b546040517fb388f73900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063b388f73990610e2690879060040161487b565b60206040518083038186803b158015610e3e57600080fd5b505afa158015610e52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e769190810190613c53565b15610ead576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a51565b6110be565b6008546040517f4b19becc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690634b19becc90610f0a9087908790600401614b11565b602060405180830381600087803b158015610f2457600080fd5b505af1158015610f38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f5c9190810190613c53565b6008546040517f42842e0e00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff16906342842e0e90610fb7903090899086906004016147ff565b600060405180830381600087803b158015610fd157600080fd5b505af1158015610fe5573d6000803e3d6000fd5b5050505060008251111561107e576040517f803aaa2600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063803aaa269061104b9033908890869088906004016147e4565b600060405180830381600087803b15801561106557600080fd5b505af1158015611079573d6000803e3d6000fd5b505050505b611087846107be565b156110be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a51565b8473ffffffffffffffffffffffffffffffffffffffff167fbd5034ffbd47e4e72a94baa2cdb74c6fad73cb3bcdc13036b72ec8306f5a764685858460405161110893929190614b2c565b60405180910390a2601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055949350505050565b60105460ff1661117f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a31565b601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615611203576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e906149b1565b6008546040517f6352211e000000000000000000000000000000000000000000000000000000008152309173ffffffffffffffffffffffffffffffffffffffff1690636352211e9061125990859060040161487b565b60206040518083038186803b15801561127157600080fd5b505afa158015611285573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112a991908101906138b5565b73ffffffffffffffffffffffffffffffffffffffff16146112f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614ae1565b611300828261285a565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051611346919061487b565b60405180910390a25050601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6107ef83838333612905565b60095473ffffffffffffffffffffffffffffffffffffffff16156113d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e906149d1565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055565b60105460ff16611441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a31565b601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905561148481670de0b6b3a7640000670e92596fd6290000612289565b600d8190556040517f8a9bb9067f9ecb13a322b548e6df3dd1bd10a54698834dac43ed8f0e765bf94d9061078890839061487b565b60006114c48261275f565b92915050565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b60026020526000908152604090205481565b60105460ff16611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a31565b601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556115646135f5565b61156d82612305565b9050600061157a82612927565b9050670de0b6b3a764000081106115bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614981565b600a546040517f386a657900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063386a6579906116159086908590600401614b11565b600060405180830381600087803b15801561162f57600080fd5b505af1158015611643573d6000803e3d6000fd5b5050600b546040517f386a657900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116925063386a6579915061169f9086908590600401614b11565b600060405180830381600087803b1580156116b957600080fd5b505af11580156116cd573d6000803e3d6000fd5b5050506000848152600f602052604090819020439055517f1324511d80168adc8f8d005b6c1fe6e0e2e34adfd74c23172638665e83b412e791506117149085908490614b11565b60405180910390a15050601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550565b61177b8686868686867f49ecf333e5b8c95c40fdafc95c1ad136e8914a8fb55e9dc8bb01eaa83a2df9ad6129c8565b61178786866000612139565b505050505050565b60105460009060ff166117ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a31565b601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600a5473ffffffffffffffffffffffffffffffffffffffff163314806118335750600b5473ffffffffffffffffffffffffffffffffffffffff1633145b611869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a71565b60006118736135f5565b61187c88612305565b6000898152600f602052604090205490915043146119255761189d81612338565b6118d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614ac1565b6118dc81612b46565b15611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a01565b6000888152600f602052604090204390555b600061193882600163ffffffff612b5e16565b600a5490915060009073ffffffffffffffffffffffffffffffffffffffff1633146119765761197183600160008c63ffffffff612bb416565b61198a565b61198a8360018b600063ffffffff612bb416565b90506119b4826119a883670de0b6b3a764000063ffffffff612c9c16565b9063ffffffff612cf016565b93506ec097ce7bc90715b34b9f10000000006119de6119d16107f4565b869063ffffffff612c9c16565b1115611a16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a21565b5050506000611a3c670de0b6b3a76400006119a8600d5485612c9c90919063ffffffff16565b6008546040517f4b19becc00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff1690634b19becc90611a95908b908590600401614b11565b602060405180830381600087803b158015611aaf57600080fd5b505af1158015611ac3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ae79190810190613c53565b92506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663345ef9416040518163ffffffff1660e01b815260040160206040518083038186803b158015611b5357600080fd5b505afa158015611b67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611b8b91908101906138b5565b600e5490915015611cd8576000611bc7611bb3670de0b6b3a76400008563ffffffff612d3216565b600e546119a890879063ffffffff612c9c16565b6008546040517f4b19becc00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff90911690634b19becc90611c25908e908690600401614b11565b602060405180830381600087803b158015611c3f57600080fd5b505af1158015611c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c779190810190613c53565b9050611c83838261285a565b8273ffffffffffffffffffffffffffffffffffffffff167fd412e382eff84c5ef4560b9a1933b493201a2414b1b81f08024dec0197d1a5788c8484604051611ccd93929190614b2c565b60405180910390a250505b6008546040517fb88d4fde00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063b88d4fde90611d369030908b9089908c908c90600401614827565b600060405180830381600087803b158015611d5057600080fd5b505af1158015611d64573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff167fd412e382eff84c5ef4560b9a1933b493201a2414b1b81f08024dec0197d1a5788a8487604051611db293929190614b2c565b60405180910390a25050601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555095945050505050565b600d5481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156106415780601f1061061657610100808354040283529160200191610641565b61067c338383612d74565b600e5481565b670e92596fd629000081565b6000611e966135f5565b611e9f83612305565b90506107dc81612b46565b611eee85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250339250612e5d915050565b5050505050565b60105460ff16611f31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a31565b601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055611f7481670de0b6b3a76400006715f15565d2c5f000612289565b600c8190556040517fdff9a61839be6f6ce5ea77311cc351786a39a9f337c507ff35e7b358fd39c0439061078890839061487b565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b60095473ffffffffffffffffffffffffffffffffffffffff163314612016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a71565b61208987878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b018190048102820181019092528981529250899150889081908401838280828437600092019190915250612e7592505050565b6008805473ffffffffffffffffffffffffffffffffffffffff9485167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600a805493851693821693909317909255600b805491909316911617905550505050565b6715f15565d2c5f00081565b600b5473ffffffffffffffffffffffffffffffffffffffff1681565b600560209081526000928352604080842090915290825290205460ff1681565b60006121448361275f565b905073ffffffffffffffffffffffffffffffffffffffff8216158061219457508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806121d1575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209386168352929052205460ff165b612207576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614b01565b60008381526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691821790925591518693918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b612291612f63565b818310156122cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e906149e1565b808311156107ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e906149e1565b61230d6135f5565b6114c4827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80612479565b600080612346836000613069565b90506000612355846002613069565b90506000821280610a8e57506000139392505050565b73ffffffffffffffffffffffffffffffffffffffff83166123b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e906149a1565b60006123c58484846130b6565b905073ffffffffffffffffffffffffffffffffffffffff8116612414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a91565b8473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611eee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614af1565b6124816135f5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83141561255457600a546040517f380e2a8b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063380e2a8b906124ff90879060040161487b565b602060405180830381600087803b15801561251957600080fd5b505af115801561252d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125519190810190613c53565b92505b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561262757600b546040517f380e2a8b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063380e2a8b906125d290879060040161487b565b602060405180830381600087803b1580156125ec57600080fd5b505af1158015612600573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126249190810190613c53565b91505b6000612631613631565b600854600c546040517f2f6d345700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921691632f6d34579161268b918a9190600401614b11565b60e060405180830381600087803b1580156126a557600080fd5b505af11580156126b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126dd9190810190613c92565b91509150606482118015612708575077028f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c2882105b61273e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a61565b6127558183878761274d6107f4565b600c54613231565b9695505050505050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16806114c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a91565b6127c6838383613268565b6107ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a11565b600061280b60008360006130b6565b905073ffffffffffffffffffffffffffffffffffffffff811661067c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a91565b73ffffffffffffffffffffffffffffffffffffffff82166128a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e906149a1565b60006128b5838360006130b6565b905073ffffffffffffffffffffffffffffffffffffffff8116156107ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614aa1565b6129218484846040518060200160405280600081525085612e5d565b50505050565b600080612955670de0b6b3a76400006119a8856080015161294987600161332c565b9063ffffffff612c9c16565b90506000612964846001612b5e565b9050610a8e826040518060400160405280601d81526020017f496d7065726d61785633436f6c6c61746572616c3a204e4f5f444542540000008152506129bb670de0b6b3a764000085612c9c90919063ffffffff16565b919063ffffffff61334216565b42851015612a02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e906149c1565b60065460008781526007602090815260408083208054600181019091559051929392612a369286928d928d928d9101614889565b60405160208183030381529060405280519060200120604051602001612a5d929190614760565b6040516020818303038152906040528051906020012090506000612a808861275f565b9050600060018388888860405160008152602001604052604051612aa7949392919061490d565b6020604051602081039080840390855afa158015612ac9573d6000803e3d6000fd5b5050506020604051035190508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612b3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e906149f1565b50505050505050505050565b600080612b54836001613069565b6000139392505050565b6000612b68613663565b508251602001516000836002811115612b7d57fe5b1415612b8857508251515b6002836002811115612b9657fe5b1415612ba457508251604001515b610a8e8484836000015184602001515b602084015160009081856002811115612bc957fe5b1415612bf35760a0860151612bf0906119a883670de0b6b3a764000063ffffffff612c9c16565b90505b6002856002811115612c0157fe5b1415612c2d57612c2a670de0b6b3a76400006119a88860a0015184612c9c90919063ffffffff16565b90505b6000612c38826107fc565b90506000612c4583613393565b9050612c90612c67680100000000000000006119a8888563ffffffff612c9c16565b612c84680100000000000000006119a88a8763ffffffff612c9c16565b9063ffffffff6133be16565b98975050505050505050565b600082612cab575060006114c4565b82820282848281612cb857fe5b04146107dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a41565b60006107dc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613342565b60006107dc83836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f77008152506133fd565b73ffffffffffffffffffffffffffffffffffffffff8216612dc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614961565b73ffffffffffffffffffffffffffffffffffffffff8381166000818152600560209081526040808320948716808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190612e5090859061486d565b60405180910390a3505050565b612e698585858461236b565b611eee85858585613443565b8151612e8890600090602085019061367d565b508051612e9c90600190602084019061367d565b506040514690612eab90614791565b6040805191829003822085516020808801919091208484018452600185527f3100000000000000000000000000000000000000000000000000000000000000948201949094529151612f259391927fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc69186913091016148cb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120600655505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b815260040160206040518083038186803b158015612fcb57600080fd5b505afa158015612fdf573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061300391908101906138b5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a71565b565b60008061308a670de0b6b3a76400006119a88660800151612949888861332c565b905060006130988585612b5e565b90506130a38261358a565b6130ac8261358a565b0395945050505050565b60008281526003602052604090205473ffffffffffffffffffffffffffffffffffffffff908116908216156130f0576130f08183856127bb565b73ffffffffffffffffffffffffffffffffffffffff811615613165576131196000846000612139565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190555b73ffffffffffffffffffffffffffffffffffffffff8416156131ae5773ffffffffffffffffffffffffffffffffffffffff84166000908152600260205260409020805460010190555b60008381526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691821790925591518693918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a49392505050565b6132396135f5565b506040805160c0810182529687526020870195909552938501929092526060840152608083015260a082015290565b600073ffffffffffffffffffffffffffffffffffffffff831615801590610a8e57508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806132f6575073ffffffffffffffffffffffffffffffffffffffff80851660009081526005602090815260408083209387168352929052205460ff165b80610a8e57505060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff918216911614919050565b60006107dc838385604001518660600151612bb4565b6000818361337d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e9190614950565b50600083858161338957fe5b0495945050505050565b60006114c478010000000000000000000000000000000000000000000000008363ffffffff612cf016565b6000828201838110156107dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614991565b6000818484111561343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e9190614950565b505050900390565b61344c836135e9565b15612921576040517f150b7a0200000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff85169063150b7a02906134ac9033908990889088906004016147aa565b602060405180830381600087803b1580156134c657600080fd5b505af11580156134da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506134fe9190810190613b6a565b905060405161350c90614755565b60405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611eee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e906149a1565b60007f800000000000000000000000000000000000000000000000000000000000000082106135e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614ab1565b5090565b3b63ffffffff16151590565b6040518060c00160405280613608613631565b815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060600160405280613644613663565b8152602001613651613663565b815260200161365e613663565b905290565b604051806040016040528060008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106136be57805160ff19168380011785556136eb565b828001600101855582156136eb579182015b828111156136eb5782518255916020019190600101906136d0565b506135e5926107fc9250905b808211156135e557600081556001016136f7565b80356114c481614c8b565b80516114c481614c8b565b80356114c481614ca2565b80356114c481614cab565b80516114c481614cb4565b60008083601f84011261375457600080fd5b50813567ffffffffffffffff81111561376c57600080fd5b60208301915083600182028301111561378457600080fd5b9250929050565b600082601f83011261379c57600080fd5b81356137af6137aa82614b6e565b614b47565b915080825260208301602083018583830111156137cb57600080fd5b6137d6838284614c2b565b50505092915050565b6000604082840312156137f157600080fd5b6137fb6040614b47565b905060006138098484613881565b825250602061381a84848301613881565b60208301525092915050565b600060c0828403121561383857600080fd5b6138426060614b47565b9050600061385084846137df565b8252506040613861848483016137df565b6020830152506080613875848285016137df565b60408301525092915050565b80516114c481614cab565b80356114c481614cbd565b6000602082840312156138a957600080fd5b6000610a8e848461370b565b6000602082840312156138c757600080fd5b6000610a8e8484613716565b600080604083850312156138e657600080fd5b60006138f2858561370b565b92505060206139038582860161370b565b9150509250929050565b60008060006060848603121561392257600080fd5b600061392e868661370b565b935050602061393f8682870161370b565b92505060406139508682870161372c565b9150509250925092565b60008060008060006080868803121561397257600080fd5b600061397e888861370b565b955050602061398f8882890161370b565b94505060406139a08882890161372c565b935050606086013567ffffffffffffffff8111156139bd57600080fd5b6139c988828901613742565b92509250509295509295909350565b600080604083850312156139eb57600080fd5b60006139f7858561370b565b925050602061390385828601613721565b60008060408385031215613a1b57600080fd5b6000613a27858561370b565b92505060206139038582860161372c565b600080600060608486031215613a4d57600080fd5b6000613a59868661370b565b935050602061393f8682870161372c565b60008060008060808587031215613a8057600080fd5b6000613a8c878761370b565b9450506020613a9d8782880161372c565b9350506040613aae8782880161372c565b925050606085013567ffffffffffffffff811115613acb57600080fd5b613ad78782880161378b565b91505092959194509250565b60008060008060008060c08789031215613afc57600080fd5b6000613b08898961370b565b9650506020613b1989828a0161372c565b9550506040613b2a89828a0161372c565b9450506060613b3b89828a0161388c565b9350506080613b4c89828a0161372c565b92505060a0613b5d89828a0161372c565b9150509295509295509295565b600060208284031215613b7c57600080fd5b6000610a8e8484613737565b600080600080600080600060a0888a031215613ba357600080fd5b873567ffffffffffffffff811115613bba57600080fd5b613bc68a828b01613742565b9750975050602088013567ffffffffffffffff811115613be557600080fd5b613bf18a828b01613742565b95509550506040613c048a828b0161370b565b9350506060613c158a828b0161370b565b9250506080613c268a828b0161370b565b91505092959891949750929550565b600060208284031215613c4757600080fd5b6000610a8e848461372c565b600060208284031215613c6557600080fd5b6000610a8e8484613881565b600080600060608486031215613c8657600080fd5b600061392e868661372c565b60008060e08385031215613ca557600080fd5b6000613cb18585613881565b925050602061390385828601613826565b600080600080600060808688031215613cda57600080fd5b6000613ce6888861372c565b9550506020613cf78882890161372c565b94505060406139a08882890161370b565b613d1181614c1a565b82525050565b613d1181614bc6565b613d1181614bd1565b613d11816107fc565b613d11613d3e826107fc565b6107fc565b613d1181614bd6565b6000613d588385614bb8565b9350613d65838584614c2b565b613d6e83614c63565b9093019392505050565b6000613d8382614bb4565b613d8d8185614bb8565b9350613d9d818560208601614c37565b613d6e81614c63565b6000613db3602083614bb8565b7f496d7065726d61784552433732313a20494e56414c49445f4f50455241544f52815260200192915050565b6000613dec602883614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a20494e56414c49445f424f81527f52524f5741424c45000000000000000000000000000000000000000000000000602082015260400192915050565b6000613e4b602483614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a204e4f545f554e4445525781527f4154455200000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000613eaa602f83614bc1565b7f6f6e455243373231526563656976656428616464726573732c6164647265737381527f2c75696e743235362c62797465732900000000000000000000000000000000006020820152602f0192915050565b6000613f09600283614bc1565b7f1901000000000000000000000000000000000000000000000000000000000000815260020192915050565b6000613f42601b83614bb8565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000613f7b602083614bb8565b7f496d7065726d61784552433732313a20494e56414c49445f5245434549564552815260200192915050565b6000613fb4602883614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a204e46545f414c5245414481527f595f4d494e544544000000000000000000000000000000000000000000000000602082015260400192915050565b6000614013601783614bb8565b7f496d7065726d61784552433732313a2045585049524544000000000000000000815260200192915050565b600061404c602983614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a20464143544f52595f414c81527f52454144595f5345540000000000000000000000000000000000000000000000602082015260400192915050565b60006140ab602583614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a20494e56414c49445f534581527f5454494e47000000000000000000000000000000000000000000000000000000602082015260400192915050565b600061410a602183614bb8565b7f496d7065726d61784552433732313a20494e56414c49445f5349474e4154555281527f4500000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000614169603a83614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a2043414e4e4f545f4c495181527f5549444154455f554e44455257415445525f504f534954494f4e000000000000602082015260400192915050565b60006141c8601c83614bb8565b7f496d7065726d61784552433732313a20554e415554484f52495a454400000000815260200192915050565b6000614201602683614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a20554e455850454354454481527f5f524154494f0000000000000000000000000000000000000000000000000000602082015260400192915050565b6000614260601f83614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a205245454e544552454400815260200192915050565b6000614299605283614bc1565b7f454950373132446f6d61696e28737472696e67206e616d652c737472696e672081527f76657273696f6e2c75696e7432353620636861696e49642c616464726573732060208201527f766572696679696e67436f6e7472616374290000000000000000000000000000604082015260520192915050565b600061431e602183614bb8565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f81527f7700000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b600061437d602c83614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a20494e535546464943494581527f4e545f4c49515549444954590000000000000000000000000000000000000000602082015260400192915050565b60006143dc602d83614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a2050524943455f43414c4381527f554c4154494f4e5f4552524f5200000000000000000000000000000000000000602082015260400192915050565b600061443b602283614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a20554e415554484f52495a81527f4544000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b600061449a602a83614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a2050455243454e5441474581527f5f41424f56455f31303000000000000000000000000000000000000000000000602082015260400192915050565b60006144f9602183614bb8565b7f496d7065726d61784552433732313a204e4f4e4558495354454e545f544f4b4581527f4e00000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000614558601e83614bb8565b7f496d7065726d61784552433732313a20494e56414c49445f53454e4445520000815260200192915050565b6000614591601283614bb8565b7f496d7065726d61783a20534146455f494e540000000000000000000000000000815260200192915050565b60006145ca602c83614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a20494e535546464943494581527f4e545f53484f525446414c4c0000000000000000000000000000000000000000602082015260400192915050565b6000614629602683614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a20494e56414c49445f4e4681527f544c505f49440000000000000000000000000000000000000000000000000000602082015260400192915050565b6000614688602683614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a204e46545f4e4f545f524581527f4345495645440000000000000000000000000000000000000000000000000000602082015260400192915050565b60006146e7601f83614bb8565b7f496d7065726d61784552433732313a20494e434f52524543545f4f574e455200815260200192915050565b6000614720602083614bb8565b7f496d7065726d61784552433732313a20494e56414c49445f415050524f564552815260200192915050565b613d1181614c14565b60006114c482613e9d565b600061476b82613efc565b91506147778285613d32565b6020820191506147878284613d32565b5060200192915050565b60006114c48261428c565b602081016114c48284613d17565b608081016147b88287613d08565b6147c56020830186613d17565b6147d26040830185613d29565b81810360608301526127558184613d78565b608081016147f28287613d08565b6147c56020830186613d29565b6060810161480d8286613d17565b61481a6020830185613d17565b610a8e6040830184613d29565b608081016148358288613d17565b6148426020830187613d17565b61484f6040830186613d29565b8181036060830152614862818486613d4c565b979650505050505050565b602081016114c48284613d20565b602081016114c48284613d29565b60a081016148978288613d29565b6148a46020830187613d17565b6148b16040830186613d29565b6148be6060830185613d29565b6127556080830184613d29565b60a081016148d98288613d29565b6148e66020830187613d29565b6148f36040830186613d29565b6149006060830185613d29565b6127556080830184613d17565b6080810161491b8287613d29565b614928602083018661474c565b6149356040830185613d29565b6106c96060830184613d29565b602081016114c48284613d43565b602080825281016107dc8184613d78565b602080825281016114c481613da6565b602080825281016114c481613ddf565b602080825281016114c481613e3e565b602080825281016114c481613f35565b602080825281016114c481613f6e565b602080825281016114c481613fa7565b602080825281016114c481614006565b602080825281016114c48161403f565b602080825281016114c48161409e565b602080825281016114c4816140fd565b602080825281016114c48161415c565b602080825281016114c4816141bb565b602080825281016114c4816141f4565b602080825281016114c481614253565b602080825281016114c481614311565b602080825281016114c481614370565b602080825281016114c4816143cf565b602080825281016114c48161442e565b602080825281016114c48161448d565b602080825281016114c4816144ec565b602080825281016114c48161454b565b602080825281016114c481614584565b602080825281016114c4816145bd565b602080825281016114c48161461c565b602080825281016114c48161467b565b602080825281016114c4816146da565b602080825281016114c481614713565b60408101614b1f8285613d29565b6107dc6020830184613d29565b60608101614b3a8286613d29565b61481a6020830185613d29565b60405181810167ffffffffffffffff81118282101715614b6657600080fd5b604052919050565b600067ffffffffffffffff821115614b8557600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b90815260200190565b919050565b60006114c482614bfb565b151590565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b73ffffffffffffffffffffffffffffffffffffffff1690565b60ff1690565b60006114c48260006114c482614bc6565b82818337506000910152565b60005b83811015614c52578181015183820152602001614c3a565b838111156129215750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690565b614c9481614bc6565b8114614c9f57600080fd5b50565b614c9481614bd1565b614c94816107fc565b614c9481614bd6565b614c9481614c1456fea365627a7a72315820b3b7e6d5908bdfec198b2132c7b7eb768f20212af4d2adc0e19b288bee30c6d56c6578706572696d656e74616cf564736f6c63430005100040
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102e95760003560e01c80634a5d316c11610191578063a36a3630116100e3578063bc9bd12a11610097578063d490e7e011610071578063d490e7e01461057a578063daf8881814610582578063e985e9c51461058a576102e9565b8063bc9bd12a14610341578063c45a01551461055f578063c548e3c514610567576102e9565b8063b26a970d116100c8578063b26a970d14610526578063b88d4fde14610539578063bb6ff3861461054c576102e9565b8063a36a363014610516578063afc8276c1461051e576102e9565b806370e18df6116101455780638c765e941161011f5780638c765e94146104f357806395d89b41146104fb578063a22cb46514610503576102e9565b806370e18df6146104ba5780637ac2ff7b146104cd5780637fd3ac4f146104e0576102e9565b80636352211e116101765780636352211e1461048c5780636f307dc31461049f57806370a08231146104a7576102e9565b80634a5d316c146104715780634fd42e1714610479576102e9565b806323f5589a1161024a57806333fabfd1116101fe5780633cf3e664116101d85780633cf3e6641461043857806340c10f191461044b57806342842e0e1461045e576102e9565b806333fabfd114610420578063356c571f146104285780633644e51514610430576102e9565b80632b83cccd1161022f5780632b83cccd146103fd5780632fa5ae1b1461041057806330adf81f14610418576102e9565b806323f5589a146103e257806327a0d11a146103ea576102e9565b8063141a468c116102a15780631ef63a79116102865780631ef63a791461039c578063211a4443146103af57806323b872dd146103cf576102e9565b8063141a468c14610369578063150b7a021461037c576102e9565b8063095ea7b3116102d2578063095ea7b31461032c5780630fb60fef146103415780630fc7a96414610356576102e9565b806306fdde03146102ee578063081812fc1461030c575b600080fd5b6102f661059d565b6040516103039190614950565b60405180910390f35b61031f61031a366004613c35565b610649565b604051610303919061479c565b61033f61033a366004613a08565b610671565b005b610349610680565b604051610303919061487b565b610349610364366004613c35565b61068c565b610349610377366004613c35565b61069e565b61038f61038a36600461395a565b6106b0565b6040516103039190614942565b61033f6103aa366004613c35565b6106d2565b6103c26103bd366004613c35565b6107be565b604051610303919061486d565b61033f6103dd36600461390d565b6107e3565b6103496107f4565b6103c26103f8366004613c71565b6107ff565b61034961040b366004613a38565b610a71565b61031f610a96565b610349610ab2565b610349610ad6565b610349610ae2565b610349610ae8565b610349610446366004613a6a565b610aee565b61033f610459366004613a08565b611143565b61033f61046c36600461390d565b61137d565b61033f611389565b61033f610487366004613c35565b611405565b61031f61049a366004613c35565b6114b9565b61031f6114ca565b6103496104b5366004613897565b6114e6565b61033f6104c8366004613c35565b6114f8565b61033f6104db366004613ae3565b61174c565b6103496104ee366004613cc2565b61178f565b610349611df1565b6102f6611df7565b61033f6105113660046139d8565b611e6f565b610349611e7a565b610349611e80565b6103c2610534366004613c35565b611e8c565b61033f61054736600461395a565b611eaa565b61033f61055a366004613c35565b611ef5565b61031f611fa9565b61033f610575366004613b88565b611fc5565b6103496120f1565b61031f6120fd565b6103c26105983660046138d3565b612119565b6000805460408051602060026001851615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156106415780601f1061061657610100808354040283529160200191610641565b820191906000526020600020905b81548152906001019060200180831161062457829003601f168201915b505050505081565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b61067c828233612139565b5050565b670de0b6b3a764000081565b600f6020526000908152604090205481565b60076020526000908152604090205481565b60006040516106be90614755565b604051809103902090505b95945050505050565b60105460ff16610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a31565b60405180910390fd5b601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905561075381600067011c37937e080000612289565b600e8190556040517f21e5451a492a87031e8324e7e1e2ba821fdec0c40972393c9f74dd38bd88a6af9061078890839061487b565b60405180910390a150601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b60006107c86135f5565b6107d183612305565b90506107dc81612338565b9392505050565b6107ef8383833361236b565b505050565b600e54600d54015b90565b600a54600b5460009173ffffffffffffffffffffffffffffffffffffffff90811691811690851682148061085e57508073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b610894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614971565b6008546040517f6352211e000000000000000000000000000000000000000000000000000000008152309173ffffffffffffffffffffffffffffffffffffffff1690636352211e906108ea908a9060040161487b565b60206040518083038186803b15801561090257600080fd5b505afa158015610916573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061093a91908101906138b5565b73ffffffffffffffffffffffffffffffffffffffff1614610987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614ad1565b60008273ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146109e2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6109e4565b845b905060008273ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614610a41577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610a43565b855b9050610a4d6135f5565b610a58898484612479565b9050610a6381612338565b159998505050505050505050565b6000610a8e84848460405180602001604052806000815250610aee565b949350505050565b600a5473ffffffffffffffffffffffffffffffffffffffff1681565b7f49ecf333e5b8c95c40fdafc95c1ad136e8914a8fb55e9dc8bb01eaa83a2df9ad81565b67011c37937e08000081565b600c5481565b60065481565b60105460009060ff16610b2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a31565b601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055670de0b6b3a7640000831115610b97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a81565b610baa610ba38561275f565b33866127bb565b610bb76000856000612139565b82670de0b6b3a76400001415610eb2575082610bd2816127fc565b6008546040517f42842e0e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906342842e0e90610c2c903090899086906004016147ff565b600060405180830381600087803b158015610c4657600080fd5b505af1158015610c5a573d6000803e3d6000fd5b50505050600082511115610cf3576040517f803aaa2600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063803aaa2690610cc09033908890869088906004016147e4565b600060405180830381600087803b158015610cda57600080fd5b505af1158015610cee573d6000803e3d6000fd5b505050505b600a546040517fb388f73900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063b388f73990610d4990879060040161487b565b60206040518083038186803b158015610d6157600080fd5b505afa158015610d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d999190810190613c53565b15610dd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a51565b600b546040517fb388f73900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063b388f73990610e2690879060040161487b565b60206040518083038186803b158015610e3e57600080fd5b505afa158015610e52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e769190810190613c53565b15610ead576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a51565b6110be565b6008546040517f4b19becc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690634b19becc90610f0a9087908790600401614b11565b602060405180830381600087803b158015610f2457600080fd5b505af1158015610f38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f5c9190810190613c53565b6008546040517f42842e0e00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff16906342842e0e90610fb7903090899086906004016147ff565b600060405180830381600087803b158015610fd157600080fd5b505af1158015610fe5573d6000803e3d6000fd5b5050505060008251111561107e576040517f803aaa2600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86169063803aaa269061104b9033908890869088906004016147e4565b600060405180830381600087803b15801561106557600080fd5b505af1158015611079573d6000803e3d6000fd5b505050505b611087846107be565b156110be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a51565b8473ffffffffffffffffffffffffffffffffffffffff167fbd5034ffbd47e4e72a94baa2cdb74c6fad73cb3bcdc13036b72ec8306f5a764685858460405161110893929190614b2c565b60405180910390a2601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055949350505050565b60105460ff1661117f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a31565b601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1615611203576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e906149b1565b6008546040517f6352211e000000000000000000000000000000000000000000000000000000008152309173ffffffffffffffffffffffffffffffffffffffff1690636352211e9061125990859060040161487b565b60206040518083038186803b15801561127157600080fd5b505afa158015611285573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112a991908101906138b5565b73ffffffffffffffffffffffffffffffffffffffff16146112f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614ae1565b611300828261285a565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688582604051611346919061487b565b60405180910390a25050601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6107ef83838333612905565b60095473ffffffffffffffffffffffffffffffffffffffff16156113d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e906149d1565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055565b60105460ff16611441576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a31565b601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905561148481670de0b6b3a7640000670e92596fd6290000612289565b600d8190556040517f8a9bb9067f9ecb13a322b548e6df3dd1bd10a54698834dac43ed8f0e765bf94d9061078890839061487b565b60006114c48261275f565b92915050565b60085473ffffffffffffffffffffffffffffffffffffffff1681565b60026020526000908152604090205481565b60105460ff16611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a31565b601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556115646135f5565b61156d82612305565b9050600061157a82612927565b9050670de0b6b3a764000081106115bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614981565b600a546040517f386a657900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063386a6579906116159086908590600401614b11565b600060405180830381600087803b15801561162f57600080fd5b505af1158015611643573d6000803e3d6000fd5b5050600b546040517f386a657900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116925063386a6579915061169f9086908590600401614b11565b600060405180830381600087803b1580156116b957600080fd5b505af11580156116cd573d6000803e3d6000fd5b5050506000848152600f602052604090819020439055517f1324511d80168adc8f8d005b6c1fe6e0e2e34adfd74c23172638665e83b412e791506117149085908490614b11565b60405180910390a15050601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550565b61177b8686868686867f49ecf333e5b8c95c40fdafc95c1ad136e8914a8fb55e9dc8bb01eaa83a2df9ad6129c8565b61178786866000612139565b505050505050565b60105460009060ff166117ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a31565b601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600a5473ffffffffffffffffffffffffffffffffffffffff163314806118335750600b5473ffffffffffffffffffffffffffffffffffffffff1633145b611869576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a71565b60006118736135f5565b61187c88612305565b6000898152600f602052604090205490915043146119255761189d81612338565b6118d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614ac1565b6118dc81612b46565b15611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a01565b6000888152600f602052604090204390555b600061193882600163ffffffff612b5e16565b600a5490915060009073ffffffffffffffffffffffffffffffffffffffff1633146119765761197183600160008c63ffffffff612bb416565b61198a565b61198a8360018b600063ffffffff612bb416565b90506119b4826119a883670de0b6b3a764000063ffffffff612c9c16565b9063ffffffff612cf016565b93506ec097ce7bc90715b34b9f10000000006119de6119d16107f4565b869063ffffffff612c9c16565b1115611a16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a21565b5050506000611a3c670de0b6b3a76400006119a8600d5485612c9c90919063ffffffff16565b6008546040517f4b19becc00000000000000000000000000000000000000000000000000000000815291925073ffffffffffffffffffffffffffffffffffffffff1690634b19becc90611a95908b908590600401614b11565b602060405180830381600087803b158015611aaf57600080fd5b505af1158015611ac3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ae79190810190613c53565b92506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663345ef9416040518163ffffffff1660e01b815260040160206040518083038186803b158015611b5357600080fd5b505afa158015611b67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611b8b91908101906138b5565b600e5490915015611cd8576000611bc7611bb3670de0b6b3a76400008563ffffffff612d3216565b600e546119a890879063ffffffff612c9c16565b6008546040517f4b19becc00000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff90911690634b19becc90611c25908e908690600401614b11565b602060405180830381600087803b158015611c3f57600080fd5b505af1158015611c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c779190810190613c53565b9050611c83838261285a565b8273ffffffffffffffffffffffffffffffffffffffff167fd412e382eff84c5ef4560b9a1933b493201a2414b1b81f08024dec0197d1a5788c8484604051611ccd93929190614b2c565b60405180910390a250505b6008546040517fb88d4fde00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063b88d4fde90611d369030908b9089908c908c90600401614827565b600060405180830381600087803b158015611d5057600080fd5b505af1158015611d64573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff167fd412e382eff84c5ef4560b9a1933b493201a2414b1b81f08024dec0197d1a5788a8487604051611db293929190614b2c565b60405180910390a25050601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555095945050505050565b600d5481565b60018054604080516020600284861615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190941693909304601f810184900484028201840190925281815292918301828280156106415780601f1061061657610100808354040283529160200191610641565b61067c338383612d74565b600e5481565b670e92596fd629000081565b6000611e966135f5565b611e9f83612305565b90506107dc81612b46565b611eee85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250339250612e5d915050565b5050505050565b60105460ff16611f31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a31565b601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055611f7481670de0b6b3a76400006715f15565d2c5f000612289565b600c8190556040517fdff9a61839be6f6ce5ea77311cc351786a39a9f337c507ff35e7b358fd39c0439061078890839061487b565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b60095473ffffffffffffffffffffffffffffffffffffffff163314612016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a71565b61208987878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8b018190048102820181019092528981529250899150889081908401838280828437600092019190915250612e7592505050565b6008805473ffffffffffffffffffffffffffffffffffffffff9485167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155600a805493851693821693909317909255600b805491909316911617905550505050565b6715f15565d2c5f00081565b600b5473ffffffffffffffffffffffffffffffffffffffff1681565b600560209081526000928352604080842090915290825290205460ff1681565b60006121448361275f565b905073ffffffffffffffffffffffffffffffffffffffff8216158061219457508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806121d1575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209386168352929052205460ff165b612207576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614b01565b60008381526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691821790925591518693918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a450505050565b612291612f63565b818310156122cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e906149e1565b808311156107ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e906149e1565b61230d6135f5565b6114c4827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80612479565b600080612346836000613069565b90506000612355846002613069565b90506000821280610a8e57506000139392505050565b73ffffffffffffffffffffffffffffffffffffffff83166123b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e906149a1565b60006123c58484846130b6565b905073ffffffffffffffffffffffffffffffffffffffff8116612414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a91565b8473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611eee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614af1565b6124816135f5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83141561255457600a546040517f380e2a8b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063380e2a8b906124ff90879060040161487b565b602060405180830381600087803b15801561251957600080fd5b505af115801561252d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125519190810190613c53565b92505b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561262757600b546040517f380e2a8b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063380e2a8b906125d290879060040161487b565b602060405180830381600087803b1580156125ec57600080fd5b505af1158015612600573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126249190810190613c53565b91505b6000612631613631565b600854600c546040517f2f6d345700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921691632f6d34579161268b918a9190600401614b11565b60e060405180830381600087803b1580156126a557600080fd5b505af11580156126b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126dd9190810190613c92565b91509150606482118015612708575077028f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c2882105b61273e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a61565b6127558183878761274d6107f4565b600c54613231565b9695505050505050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16806114c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a91565b6127c6838383613268565b6107ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a11565b600061280b60008360006130b6565b905073ffffffffffffffffffffffffffffffffffffffff811661067c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a91565b73ffffffffffffffffffffffffffffffffffffffff82166128a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e906149a1565b60006128b5838360006130b6565b905073ffffffffffffffffffffffffffffffffffffffff8116156107ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614aa1565b6129218484846040518060200160405280600081525085612e5d565b50505050565b600080612955670de0b6b3a76400006119a8856080015161294987600161332c565b9063ffffffff612c9c16565b90506000612964846001612b5e565b9050610a8e826040518060400160405280601d81526020017f496d7065726d61785633436f6c6c61746572616c3a204e4f5f444542540000008152506129bb670de0b6b3a764000085612c9c90919063ffffffff16565b919063ffffffff61334216565b42851015612a02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e906149c1565b60065460008781526007602090815260408083208054600181019091559051929392612a369286928d928d928d9101614889565b60405160208183030381529060405280519060200120604051602001612a5d929190614760565b6040516020818303038152906040528051906020012090506000612a808861275f565b9050600060018388888860405160008152602001604052604051612aa7949392919061490d565b6020604051602081039080840390855afa158015612ac9573d6000803e3d6000fd5b5050506020604051035190508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612b3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e906149f1565b50505050505050505050565b600080612b54836001613069565b6000139392505050565b6000612b68613663565b508251602001516000836002811115612b7d57fe5b1415612b8857508251515b6002836002811115612b9657fe5b1415612ba457508251604001515b610a8e8484836000015184602001515b602084015160009081856002811115612bc957fe5b1415612bf35760a0860151612bf0906119a883670de0b6b3a764000063ffffffff612c9c16565b90505b6002856002811115612c0157fe5b1415612c2d57612c2a670de0b6b3a76400006119a88860a0015184612c9c90919063ffffffff16565b90505b6000612c38826107fc565b90506000612c4583613393565b9050612c90612c67680100000000000000006119a8888563ffffffff612c9c16565b612c84680100000000000000006119a88a8763ffffffff612c9c16565b9063ffffffff6133be16565b98975050505050505050565b600082612cab575060006114c4565b82820282848281612cb857fe5b04146107dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a41565b60006107dc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613342565b60006107dc83836040518060400160405280601f81526020017f536166654d6174683a207375627472616374696f6e20756e646572666c6f77008152506133fd565b73ffffffffffffffffffffffffffffffffffffffff8216612dc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614961565b73ffffffffffffffffffffffffffffffffffffffff8381166000818152600560209081526040808320948716808452949091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190612e5090859061486d565b60405180910390a3505050565b612e698585858461236b565b611eee85858585613443565b8151612e8890600090602085019061367d565b508051612e9c90600190602084019061367d565b506040514690612eab90614791565b6040805191829003822085516020808801919091208484018452600185527f3100000000000000000000000000000000000000000000000000000000000000948201949094529151612f259391927fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc69186913091016148cb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120600655505050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f851a4406040518163ffffffff1660e01b815260040160206040518083038186803b158015612fcb57600080fd5b505afa158015612fdf573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061300391908101906138b5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614a71565b565b60008061308a670de0b6b3a76400006119a88660800151612949888861332c565b905060006130988585612b5e565b90506130a38261358a565b6130ac8261358a565b0395945050505050565b60008281526003602052604090205473ffffffffffffffffffffffffffffffffffffffff908116908216156130f0576130f08183856127bb565b73ffffffffffffffffffffffffffffffffffffffff811615613165576131196000846000612139565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190555b73ffffffffffffffffffffffffffffffffffffffff8416156131ae5773ffffffffffffffffffffffffffffffffffffffff84166000908152600260205260409020805460010190555b60008381526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88811691821790925591518693918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a49392505050565b6132396135f5565b506040805160c0810182529687526020870195909552938501929092526060840152608083015260a082015290565b600073ffffffffffffffffffffffffffffffffffffffff831615801590610a8e57508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806132f6575073ffffffffffffffffffffffffffffffffffffffff80851660009081526005602090815260408083209387168352929052205460ff165b80610a8e57505060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff918216911614919050565b60006107dc838385604001518660600151612bb4565b6000818361337d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e9190614950565b50600083858161338957fe5b0495945050505050565b60006114c478010000000000000000000000000000000000000000000000008363ffffffff612cf016565b6000828201838110156107dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614991565b6000818484111561343b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e9190614950565b505050900390565b61344c836135e9565b15612921576040517f150b7a0200000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff85169063150b7a02906134ac9033908990889088906004016147aa565b602060405180830381600087803b1580156134c657600080fd5b505af11580156134da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506134fe9190810190613b6a565b905060405161350c90614755565b60405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611eee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e906149a1565b60007f800000000000000000000000000000000000000000000000000000000000000082106135e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90614ab1565b5090565b3b63ffffffff16151590565b6040518060c00160405280613608613631565b815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040518060600160405280613644613663565b8152602001613651613663565b815260200161365e613663565b905290565b604051806040016040528060008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106136be57805160ff19168380011785556136eb565b828001600101855582156136eb579182015b828111156136eb5782518255916020019190600101906136d0565b506135e5926107fc9250905b808211156135e557600081556001016136f7565b80356114c481614c8b565b80516114c481614c8b565b80356114c481614ca2565b80356114c481614cab565b80516114c481614cb4565b60008083601f84011261375457600080fd5b50813567ffffffffffffffff81111561376c57600080fd5b60208301915083600182028301111561378457600080fd5b9250929050565b600082601f83011261379c57600080fd5b81356137af6137aa82614b6e565b614b47565b915080825260208301602083018583830111156137cb57600080fd5b6137d6838284614c2b565b50505092915050565b6000604082840312156137f157600080fd5b6137fb6040614b47565b905060006138098484613881565b825250602061381a84848301613881565b60208301525092915050565b600060c0828403121561383857600080fd5b6138426060614b47565b9050600061385084846137df565b8252506040613861848483016137df565b6020830152506080613875848285016137df565b60408301525092915050565b80516114c481614cab565b80356114c481614cbd565b6000602082840312156138a957600080fd5b6000610a8e848461370b565b6000602082840312156138c757600080fd5b6000610a8e8484613716565b600080604083850312156138e657600080fd5b60006138f2858561370b565b92505060206139038582860161370b565b9150509250929050565b60008060006060848603121561392257600080fd5b600061392e868661370b565b935050602061393f8682870161370b565b92505060406139508682870161372c565b9150509250925092565b60008060008060006080868803121561397257600080fd5b600061397e888861370b565b955050602061398f8882890161370b565b94505060406139a08882890161372c565b935050606086013567ffffffffffffffff8111156139bd57600080fd5b6139c988828901613742565b92509250509295509295909350565b600080604083850312156139eb57600080fd5b60006139f7858561370b565b925050602061390385828601613721565b60008060408385031215613a1b57600080fd5b6000613a27858561370b565b92505060206139038582860161372c565b600080600060608486031215613a4d57600080fd5b6000613a59868661370b565b935050602061393f8682870161372c565b60008060008060808587031215613a8057600080fd5b6000613a8c878761370b565b9450506020613a9d8782880161372c565b9350506040613aae8782880161372c565b925050606085013567ffffffffffffffff811115613acb57600080fd5b613ad78782880161378b565b91505092959194509250565b60008060008060008060c08789031215613afc57600080fd5b6000613b08898961370b565b9650506020613b1989828a0161372c565b9550506040613b2a89828a0161372c565b9450506060613b3b89828a0161388c565b9350506080613b4c89828a0161372c565b92505060a0613b5d89828a0161372c565b9150509295509295509295565b600060208284031215613b7c57600080fd5b6000610a8e8484613737565b600080600080600080600060a0888a031215613ba357600080fd5b873567ffffffffffffffff811115613bba57600080fd5b613bc68a828b01613742565b9750975050602088013567ffffffffffffffff811115613be557600080fd5b613bf18a828b01613742565b95509550506040613c048a828b0161370b565b9350506060613c158a828b0161370b565b9250506080613c268a828b0161370b565b91505092959891949750929550565b600060208284031215613c4757600080fd5b6000610a8e848461372c565b600060208284031215613c6557600080fd5b6000610a8e8484613881565b600080600060608486031215613c8657600080fd5b600061392e868661372c565b60008060e08385031215613ca557600080fd5b6000613cb18585613881565b925050602061390385828601613826565b600080600080600060808688031215613cda57600080fd5b6000613ce6888861372c565b9550506020613cf78882890161372c565b94505060406139a08882890161370b565b613d1181614c1a565b82525050565b613d1181614bc6565b613d1181614bd1565b613d11816107fc565b613d11613d3e826107fc565b6107fc565b613d1181614bd6565b6000613d588385614bb8565b9350613d65838584614c2b565b613d6e83614c63565b9093019392505050565b6000613d8382614bb4565b613d8d8185614bb8565b9350613d9d818560208601614c37565b613d6e81614c63565b6000613db3602083614bb8565b7f496d7065726d61784552433732313a20494e56414c49445f4f50455241544f52815260200192915050565b6000613dec602883614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a20494e56414c49445f424f81527f52524f5741424c45000000000000000000000000000000000000000000000000602082015260400192915050565b6000613e4b602483614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a204e4f545f554e4445525781527f4154455200000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000613eaa602f83614bc1565b7f6f6e455243373231526563656976656428616464726573732c6164647265737381527f2c75696e743235362c62797465732900000000000000000000000000000000006020820152602f0192915050565b6000613f09600283614bc1565b7f1901000000000000000000000000000000000000000000000000000000000000815260020192915050565b6000613f42601b83614bb8565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815260200192915050565b6000613f7b602083614bb8565b7f496d7065726d61784552433732313a20494e56414c49445f5245434549564552815260200192915050565b6000613fb4602883614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a204e46545f414c5245414481527f595f4d494e544544000000000000000000000000000000000000000000000000602082015260400192915050565b6000614013601783614bb8565b7f496d7065726d61784552433732313a2045585049524544000000000000000000815260200192915050565b600061404c602983614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a20464143544f52595f414c81527f52454144595f5345540000000000000000000000000000000000000000000000602082015260400192915050565b60006140ab602583614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a20494e56414c49445f534581527f5454494e47000000000000000000000000000000000000000000000000000000602082015260400192915050565b600061410a602183614bb8565b7f496d7065726d61784552433732313a20494e56414c49445f5349474e4154555281527f4500000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000614169603a83614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a2043414e4e4f545f4c495181527f5549444154455f554e44455257415445525f504f534954494f4e000000000000602082015260400192915050565b60006141c8601c83614bb8565b7f496d7065726d61784552433732313a20554e415554484f52495a454400000000815260200192915050565b6000614201602683614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a20554e455850454354454481527f5f524154494f0000000000000000000000000000000000000000000000000000602082015260400192915050565b6000614260601f83614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a205245454e544552454400815260200192915050565b6000614299605283614bc1565b7f454950373132446f6d61696e28737472696e67206e616d652c737472696e672081527f76657273696f6e2c75696e7432353620636861696e49642c616464726573732060208201527f766572696679696e67436f6e7472616374290000000000000000000000000000604082015260520192915050565b600061431e602183614bb8565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f81527f7700000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b600061437d602c83614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a20494e535546464943494581527f4e545f4c49515549444954590000000000000000000000000000000000000000602082015260400192915050565b60006143dc602d83614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a2050524943455f43414c4381527f554c4154494f4e5f4552524f5200000000000000000000000000000000000000602082015260400192915050565b600061443b602283614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a20554e415554484f52495a81527f4544000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b600061449a602a83614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a2050455243454e5441474581527f5f41424f56455f31303000000000000000000000000000000000000000000000602082015260400192915050565b60006144f9602183614bb8565b7f496d7065726d61784552433732313a204e4f4e4558495354454e545f544f4b4581527f4e00000000000000000000000000000000000000000000000000000000000000602082015260400192915050565b6000614558601e83614bb8565b7f496d7065726d61784552433732313a20494e56414c49445f53454e4445520000815260200192915050565b6000614591601283614bb8565b7f496d7065726d61783a20534146455f494e540000000000000000000000000000815260200192915050565b60006145ca602c83614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a20494e535546464943494581527f4e545f53484f525446414c4c0000000000000000000000000000000000000000602082015260400192915050565b6000614629602683614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a20494e56414c49445f4e4681527f544c505f49440000000000000000000000000000000000000000000000000000602082015260400192915050565b6000614688602683614bb8565b7f496d7065726d61785633436f6c6c61746572616c3a204e46545f4e4f545f524581527f4345495645440000000000000000000000000000000000000000000000000000602082015260400192915050565b60006146e7601f83614bb8565b7f496d7065726d61784552433732313a20494e434f52524543545f4f574e455200815260200192915050565b6000614720602083614bb8565b7f496d7065726d61784552433732313a20494e56414c49445f415050524f564552815260200192915050565b613d1181614c14565b60006114c482613e9d565b600061476b82613efc565b91506147778285613d32565b6020820191506147878284613d32565b5060200192915050565b60006114c48261428c565b602081016114c48284613d17565b608081016147b88287613d08565b6147c56020830186613d17565b6147d26040830185613d29565b81810360608301526127558184613d78565b608081016147f28287613d08565b6147c56020830186613d29565b6060810161480d8286613d17565b61481a6020830185613d17565b610a8e6040830184613d29565b608081016148358288613d17565b6148426020830187613d17565b61484f6040830186613d29565b8181036060830152614862818486613d4c565b979650505050505050565b602081016114c48284613d20565b602081016114c48284613d29565b60a081016148978288613d29565b6148a46020830187613d17565b6148b16040830186613d29565b6148be6060830185613d29565b6127556080830184613d29565b60a081016148d98288613d29565b6148e66020830187613d29565b6148f36040830186613d29565b6149006060830185613d29565b6127556080830184613d17565b6080810161491b8287613d29565b614928602083018661474c565b6149356040830185613d29565b6106c96060830184613d29565b602081016114c48284613d43565b602080825281016107dc8184613d78565b602080825281016114c481613da6565b602080825281016114c481613ddf565b602080825281016114c481613e3e565b602080825281016114c481613f35565b602080825281016114c481613f6e565b602080825281016114c481613fa7565b602080825281016114c481614006565b602080825281016114c48161403f565b602080825281016114c48161409e565b602080825281016114c4816140fd565b602080825281016114c48161415c565b602080825281016114c4816141bb565b602080825281016114c4816141f4565b602080825281016114c481614253565b602080825281016114c481614311565b602080825281016114c481614370565b602080825281016114c4816143cf565b602080825281016114c48161442e565b602080825281016114c48161448d565b602080825281016114c4816144ec565b602080825281016114c48161454b565b602080825281016114c481614584565b602080825281016114c4816145bd565b602080825281016114c48161461c565b602080825281016114c48161467b565b602080825281016114c4816146da565b602080825281016114c481614713565b60408101614b1f8285613d29565b6107dc6020830184613d29565b60608101614b3a8286613d29565b61481a6020830185613d29565b60405181810167ffffffffffffffff81118282101715614b6657600080fd5b604052919050565b600067ffffffffffffffff821115614b8557600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b90815260200190565b919050565b60006114c482614bfb565b151590565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b73ffffffffffffffffffffffffffffffffffffffff1690565b60ff1690565b60006114c48260006114c482614bc6565b82818337506000910152565b60005b83811015614c52578181015183820152602001614c3a565b838111156129215750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690565b614c9481614bc6565b8114614c9f57600080fd5b50565b614c9481614bd1565b614c94816107fc565b614c9481614bd6565b614c9481614c1456fea365627a7a72315820b3b7e6d5908bdfec198b2132c7b7eb768f20212af4d2adc0e19b288bee30c6d56c6578706572696d656e74616cf564736f6c63430005100040
Deployed Bytecode Sourcemap
34739:7148:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34739:7148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9097:18;;;:::i;:::-;;;;;;;;;;;;;;;;9240:46;;;;;;;;;:::i;:::-;;;;;;;;13472:98;;;;;;;;;:::i;:::-;;17467:53;;;:::i;:::-;;;;;;;;400:64;;;;;;;;;:::i;9400:38::-;;;;;;;;;:::i;41626:258::-;;;;;;;;;:::i;:::-;;;;;;;;19126:225;;;;;;;;;:::i;37827:194::-;;;;;;;;;:::i;:::-;;;;;;;;13711:124;;;;;;;;;:::i;472:111::-;;;:::i;38223:704::-;;;;;;;;;:::i;37637:158::-;;;;;;;;;:::i;175:26::-;;;:::i;14807:108::-;;;:::i;17763:50::-;;;:::i;235:44::-;;;:::i;9365:31::-;;;:::i;36218:1416::-;;;;;;;;;:::i;35896:317::-;;;;;;;;;:::i;13840:132::-;;;;;;;;;:::i;18024:142::-;;;:::i;18824:297::-;;;;;;;;;:::i;13361:105::-;;;;;;;;;:::i;120:25::-;;;:::i;9146:41::-;;;;;;;;;:::i;38933:652::-;;;;;;;;;:::i;14919:224::-;;;;;;;;;:::i;39657:1963::-;;;;;;;;;:::i;304:42::-;;;:::i;9119:20::-;;;:::i;13576:129::-;;;;;;;;;:::i;355:36::-;;;:::i;17696:56::-;;;:::i;38027:190::-;;;;;;;;;:::i;13978:159::-;;;;;;;;;:::i;18560:259::-;;;;;;;;;:::i;149:22::-;;;:::i;18172:383::-;;;;;;;;;:::i;17545:59::-;;;:::i;205:26::-;;;:::i;9290:68::-;;;;;;;;;:::i;9097:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9240:46::-;;;;;;;;;;;;;;;:::o;13472:98::-;13532:33;13541:2;13545:7;13554:10;13532:8;:33::i;:::-;13472:98;;:::o;17467:53::-;17513:7;17467:53;:::o;400:64::-;;;;;;;;;;;;;:::o;9400:38::-;;;;;;;;;;;;;:::o;41626:258::-;41745:18;41818:60;;;;;;;;;;;;;;41804:75;;41626:258;;;;;;;;:::o;19126:225::-;19908:11;;;;19900:55;;;;;;;;;;;;;;;;;;;;;;19960:11;:19;;;;;;19205:56;19219:17;19974:5;17806:7;19205:13;:56::i;:::-;19266:14;:34;;;19310:36;;;;;;19283:17;;19310:36;;;;;;;;;;-1:-1:-1;19990:11:0;:18;;;;20004:4;19990:18;;;19126:225::o;37827:194::-;37881:4;37892:51;;:::i;:::-;37946:27;37965:7;37946:18;:27::i;:::-;37892:81;;37985:31;:14;:29;:31::i;:::-;37978:38;37827:194;-1:-1:-1;;;37827:194:0:o;13711:124::-;13790:40;13800:4;13806:2;13810:7;13819:10;13790:9;:40::i;:::-;13711:124;;;:::o;472:111::-;564:14;;541:20;;:37;472:111;;:::o;38223:704::-;38347:11;;38386;;38313:4;;38347:11;;;;;38386;;;38410:26;;;;;:56;;;38454:12;38440:26;;:10;:26;;;38410:56;38402:109;;;;;;;;;;;;;;38531:10;;38524:35;;;;;38571:4;;38524:52;38531:10;;38524:26;;:35;;38551:7;;38524:35;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38524:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38524:35:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;38524:35:0;;;;;;;;;:52;;;38516:103;;;;;;;;;;;;;;38628:10;38655:12;38641:26;;:10;:26;;;:54;;38692:2;38641:54;;;38670:14;38641:54;38628:67;;38700:10;38727:12;38713:26;;:10;:26;;;:54;;38764:2;38713:54;;;38742:14;38713:54;38700:67;;38776:51;;:::i;:::-;38830:48;38856:7;38865:5;38872;38830:25;:48::i;:::-;38776:102;;38891:31;:14;:29;:31::i;:::-;38890:32;;38223:704;-1:-1:-1;;;;;;;;;38223:704:0:o;37637:158::-;37720:21;37755:35;37762:2;37766:7;37775:10;37755:35;;;;;;;;;;;;:6;:35::i;:::-;37748:42;37637:158;-1:-1:-1;;;;37637:158:0:o;175:26::-;;;;;;:::o;14807:108::-;14849:66;14807:108;:::o;17763:50::-;17806:7;17763:50;:::o;235:44::-;;;;:::o;9365:31::-;;;;:::o;36218:1416::-;19908:11;;36331:21;;19908:11;;19900:55;;;;;;;;;;;;;;19960:11;:19;;;;;;36381:4;36367:18;;;36359:73;;;;;;;;;;;;;;36437:61;36454:22;36468:7;36454:13;:22::i;:::-;36478:10;36490:7;36437:16;:61::i;:::-;36503:41;36520:1;36524:7;36541:1;36503:8;:41::i;:::-;36605:10;36619:4;36605:18;36601:969;;;-1:-1:-1;36647:7:0;36660:14;36647:7;36660:5;:14::i;:::-;36687:10;;36680:69;;;;;36687:10;;;;;36680:35;;:69;;36724:4;;36731:2;;36735:13;;36680:69;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36680:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36680:69:0;;;;36773:1;36759:4;:11;:15;36755:99;;;36776:78;;;;;:36;;;;;;:78;;36813:10;;36825:7;;36834:13;;36849:4;;36776:78;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36776:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36776:78:0;;;;36755:99;36947:11;;36935:47;;;;;36947:11;;;;;36935:38;;:47;;36974:7;;36935:47;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36935:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36935:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;36935:47:0;;;;;;;;;:52;36927:109;;;;;;;;;;;;;;37062:11;;37050:47;;;;;37062:11;;;;;37050:38;;:47;;37089:7;;37050:47;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37050:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37050:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;37050:47:0;;;;;;;;;:52;37042:109;;;;;;;;;;;;;;36601:969;;;37192:10;;37185:45;;;;;37192:10;;;;;37185:24;;:45;;37210:7;;37219:10;;37185:45;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37185:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37185:45:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;37185:45:0;;;;;;;;;37243:10;;37236:69;;;;;37169:61;;-1:-1:-1;37243:10:0;;;37236:35;;:69;;37280:4;;37287:2;;37169:61;;37236:69;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37236:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37236:69:0;;;;37329:1;37315:4;:11;:15;37311:99;;;37332:78;;;;;:36;;;;;;:78;;37369:10;;37381:7;;37390:13;;37405:4;;37332:78;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37332:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37332:78:0;;;;37311:99;37492:23;37507:7;37492:14;:23::i;:::-;37491:24;37483:81;;;;;;;;;;;;;;37590:2;37583:46;;;37594:7;37603:10;37615:13;37583:46;;;;;;;;;;;;;;;;;19990:11;:18;;;;20004:4;19990:18;;;36218:1416;;-1:-1:-1;;;;36218:1416:0:o;35896:317::-;19908:11;;;;19900:55;;;;;;;;;;;;;;19960:11;:19;;;;;;19974:5;35974:17;;;:8;:17;;;;;;:31;:17;:31;35966:84;;;;;;;;;;;;;;36070:10;;36063:35;;;;;36110:4;;36063:52;36070:10;;36063:26;;:35;;36090:7;;36063:35;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36063:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36063:35:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;36063:35:0;;;;;;;;;:52;;;36055:103;;;;;;;;;;;;;;36163:18;36169:2;36173:7;36163:5;:18::i;:::-;36196:2;36191:17;;;36200:7;36191:17;;;;;;;;;;;;;;;-1:-1:-1;;19990:11:0;:18;;;;20004:4;19990:18;;;35896:317::o;13840:132::-;13923:44;13937:4;13943:2;13947:7;13956:10;13923:13;:44::i;18024:142::-;18069:7;;:21;:7;:21;18061:75;;;;;;;;;;;;;;18141:7;:20;;;;18151:10;18141:20;;;18024:142::o;18824:297::-;19908:11;;;;19900:55;;;;;;;;;;;;;;19960:11;:19;;;;;;18915:92;18929:23;17678:7;17745;18915:13;:92::i;:::-;19012:20;:46;;;19068:48;;;;;;19035:23;;19068:48;;13361:105;13418:7;13439:22;13453:7;13439:13;:22::i;:::-;13432:29;13361:105;-1:-1:-1;;13361:105:0:o;120:25::-;;;;;;:::o;9146:41::-;;;;;;;;;;;;;:::o;38933:652::-;19908:11;;;;19900:55;;;;;;;;;;;;;;19960:11;:19;;;;;;39002:51;;:::i;:::-;39056:27;39075:7;39056:18;:27::i;:::-;39002:81;;39088:35;39126:50;:14;:48;:50::i;:::-;39088:88;;39222:4;39189:30;:37;39181:86;;;;;;;;;;;;;;39284:11;;39272:81;;;;;39284:11;;;;;39272:40;;:81;;39313:7;;39322:30;;39272:81;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39272:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;39370:11:0;;39358:81;;;;;39370:11;;;;;-1:-1:-1;39358:40:0;;-1:-1:-1;39358:81:0;;39399:7;;39408:30;;39358:81;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39358:81:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;39448:44:0;;;;:35;:44;;;;;;;39495:12;39448:59;;39521;;;-1:-1:-1;39521:59:0;;39484:7;;39549:30;;39521:59;;;;;;;;;;-1:-1:-1;;19990:11:0;:18;;;;20004:4;19990:18;;;-1:-1:-1;38933:652:0:o;14919:224::-;15026:69;15042:7;15051;15060:8;15070:1;15073;15076;14849:66;15026:15;:69::i;:::-;15100:38;15109:7;15118;15135:1;15100:8;:38::i;:::-;14919:224;;;;;;:::o;39657:1963::-;19908:11;;39776:17;;19908:11;;19900:55;;;;;;;;;;;;;;19960:11;:19;;;;;;39822:11;;;;39808:10;:25;;:54;;-1:-1:-1;39851:11:0;;;;39837:10;:25;39808:54;39800:101;;;;;;;;;;;;;;39910:27;39948:51;;:::i;:::-;40002:27;40021:7;40002:18;:27::i;:::-;40044:44;;;;:35;:44;;;;;;39948:81;;-1:-1:-1;40092:12:0;40044:60;40040:342;;40121:31;:14;:29;:31::i;:::-;40113:88;;;;;;;;;;;;;;40217:29;:14;:27;:29::i;:::-;40216:30;40208:101;;;;;;;;;;;;;;40316:44;;;;:35;:44;;;;;40363:12;40316:59;;40040:342;40392:20;40415:63;:14;40449:28;40415:63;:33;:63;:::i;:::-;40516:11;;40392:86;;-1:-1:-1;40484:15:0;;40516:11;;40502:10;:25;:179;;40612:69;:14;40636:28;40666:1;40669:11;40612:69;:23;:69;:::i;:::-;40502:179;;;40535:69;:14;40559:28;40589:11;40602:1;40535:69;:23;:69;:::i;:::-;40484:197;-1:-1:-1;40717:41:0;40742:15;40717:20;40484:197;40732:4;40717:20;:14;:20;:::i;:::-;:24;:41;:24;:41;:::i;:::-;40692:66;;40824:4;40772:48;40799:20;:18;:20::i;:::-;40772:22;;:48;:26;:48;:::i;:::-;:56;;40764:107;;;;;;;;;;;;;;19984:1;;;40885:20;40908:58;40961:4;40908:48;40935:20;;40908:22;:26;;:48;;;;:::i;:58::-;40993:10;;40986:50;;;;;40885:81;;-1:-1:-1;40993:10:0;;;40986:24;;:50;;41011:7;;40885:81;;40986:50;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40986:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40986:50:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40986:50:0;;;;;;;;;40971:65;;41043:23;41078:7;;;;;;;;;;;41069:33;;;:35;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41069:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41069:35:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;41069:35:0;;;;;;;;;41115:14;;41043:61;;-1:-1:-1;41115:18:0;41111:347;;41141:18;41162:79;41209:31;41214:4;41224:15;41209:31;:14;:31;:::i;:::-;41189:14;;41162:42;;:22;;:42;:26;:42;:::i;:79::-;41273:10;;41266:48;;;;;41141:100;;-1:-1:-1;41248:15:0;;41273:10;;;;;41266:24;;:48;;41291:7;;41141:100;;41266:48;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41266:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41266:48:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;41266:48:0;;;;;;;;;41248:66;;41320:34;41326:15;41343:10;41320:5;:34::i;:::-;41400:15;41394:58;;;41417:7;41426:13;41441:10;41394:58;;;;;;;;;;;;;;;;;41111:347;;;41473:10;;41466:82;;;;;41473:10;;;;;41466:35;;:82;;41510:4;;41517:10;;41529:12;;41543:4;;;;41466:82;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41466:82:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41466:82:0;;;;41564:10;41558:57;;;41576:7;41585:15;41602:12;41558:57;;;;;;;;;;;;;;;;;-1:-1:-1;;19990:11:0;:18;;;;20004:4;19990:18;;;-1:-1:-1;39657:1963:0;;-1:-1:-1;;;;;39657:1963:0:o;304:42::-;;;;:::o;9119:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13576:129;13650:50;13669:10;13681:8;13691;13650:18;:50::i;355:36::-;;;;:::o;17696:56::-;17745:7;17696:56;:::o;38027:190::-;38079:4;38090:51;;:::i;:::-;38144:27;38163:7;38144:18;:27::i;:::-;38090:81;;38183:29;:14;:27;:29::i;13978:159::-;14082:50;14096:4;14102:2;14106:7;14115:4;;14082:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;14121:10:0;;-1:-1:-1;14082:13:0;;-1:-1:-1;;14082:50:0:i;:::-;13978:159;;;;;:::o;18560:259::-;19908:11;;;;19900:55;;;;;;;;;;;;;;19960:11;:19;;;;;;18643:82;18657:19;17513:7;17591:13;18643;:82::i;:::-;18730:16;:38;;;18778:36;;;;;;18749:19;;18778:36;;149:22;;;;;;:::o;18172:383::-;18364:7;;;;18350:10;:21;18342:68;;;;;;;;;;;;;;18435:24;18444:5;;18435:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;18435:24:0;;;;137:4:-1;18435:24:0;;;;;;;;;;;;;;;;;;-1:-1:-1;18451:7:0;;-1:-1:-1;18451:7:0;;;;18435:24;;18451:7;;;;18435:24;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;18435:8:0;;-1:-1:-1;;;18435:24:0:i;:::-;18464:10;:24;;;;;;;;;;;;;;18493:11;:26;;;;;;;;;;;;;;;18524:11;:26;;;;;;;;;;;-1:-1:-1;;;;18172:383:0:o;17545:59::-;17591:13;17545:59;:::o;205:26::-;;;;;;:::o;9290:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12212:304::-;12287:13;12303:22;12317:7;12303:13;:22::i;:::-;12287:38;-1:-1:-1;12338:18:0;;;;;:35;;;12368:5;12360:13;;:4;:13;;;12338:35;:68;;;-1:-1:-1;12377:23:0;;;;;;;;:16;:23;;;;;;;;:29;;;;;;;;;;;;12338:68;12330:113;;;;;;;;;;;;;;12448:20;;;;:11;:20;;;;;;:25;;;;;;;;;;;;;;12483:28;;12448:20;;12483:28;;;;;;;12212:304;;;;:::o;19357:238::-;19435:13;:11;:13::i;:::-;19474:3;19461:9;:16;;19453:66;;;;;;;;;;;;;;19545:3;19532:9;:16;;19524:66;;;;;;;;;;;;;35676:184;35736:51;;:::i;:::-;35801:54;35827:7;35841:2;35851;35801:25;:54::i;34178:263::-;34263:4;34274:5;34282:57;34310:14;34326:12;34282:27;:57::i;:::-;34274:65;;34344:5;34352:58;34380:14;34396:13;34352:27;:58::i;:::-;34344:66;;34426:1;34422;:5;:14;;;-1:-1:-1;34435:1:0;-1:-1:-1;34431:5:0;34415:21;-1:-1:-1;;;34178:263:0:o;11494:359::-;11592:16;;;11584:61;;;;;;;;;;;;;;11650:21;11674:26;11682:2;11686:7;11695:4;11674:7;:26::i;:::-;11650:50;-1:-1:-1;11713:27:0;;;11705:73;;;;;;;;;;;;;;11808:4;11791:21;;:13;:21;;;11783:65;;;;;;;;;;;;;34974:696;35065:51;;:::i;:::-;35141:2;35127:5;:17;35123:85;;;35166:11;;35154:54;;;;;35166:11;;;;;35154:45;;:54;;35200:7;;35154:54;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35154:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35154:54:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;35154:54:0;;;;;;;;;35146:62;;35123:85;35231:2;35217:5;:17;35213:85;;;35256:11;;35244:54;;;;;35256:11;;;;;35244:45;;:54;;35290:7;;35244:54;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35244:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35244:54:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;35244:54:0;;;;;;;;;35236:62;;35213:85;35308:17;35327:29;;:::i;:::-;35372:10;;35409:16;;35365:61;;;;;35372:10;;;;;35365:34;;:61;;35400:7;;35409:16;35365:61;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35365:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35365:61:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;35365:61:0;;;;;;;;;35307:119;;;;35454:3;35439:12;:18;:47;;;;-1:-1:-1;35476:10:0;35461:25;;35439:47;35431:105;;;;;;;;;;;;;;35562:103;35589:7;35598:12;35612:5;35619;35626:20;:18;:20::i;:::-;35648:16;;35562:26;:103::i;:::-;35545:120;34974:696;-1:-1:-1;;;;;;34974:696:0:o;12789:202::-;12852:7;12882:17;;;:8;:17;;;;;;;;12912:19;12904:65;;;;;;;;;;;;;10152:180;10255:39;10269:5;10276:8;10286:7;10255:13;:39::i;:::-;10247:80;;;;;;;;;;;;;11295:193;11341:21;11365:40;11381:1;11385:7;11402:1;11365:7;:40::i;:::-;11341:64;-1:-1:-1;11418:27:0;;;11410:73;;;;;;;;;;;;;10768:260;10834:16;;;10826:61;;;;;;;;;;;;;;10892:21;10916:32;10924:2;10928:7;10945:1;10916:7;:32::i;:::-;10892:56;-1:-1:-1;10961:27:0;;;;10953:70;;;;;;;;;;;;;11859:141;11953:42;11967:4;11973:2;11977:7;11953:42;;;;;;;;;;;;11990:4;11953:13;:42::i;:::-;11859:141;;;;:::o;33767:405::-;33871:4;33882:21;33906:92;33993:4;33906:82;33954:14;:33;;;33906:43;33919:14;33935:13;33906:12;:43::i;:::-;:47;:82;:47;:82;:::i;:92::-;33882:116;;34003:20;34026:49;34045:14;34061:13;34026:18;:49::i;:::-;34003:72;;34087:80;34117:16;34087:80;;;;;;;;;;;;;;;;;:25;34107:4;34087:15;:19;;:25;;;;:::i;:::-;:29;:80;;:29;:80;:::i;14143:569::-;14297:15;14285:8;:27;;14277:63;;;;;;;;;;;;;;14417:16;;14345:14;14489:15;;;:6;:15;;;;;;;;:17;;;;;;;;14450:67;;14345:14;;14417:16;14450:67;;14461:8;;14471:7;;14480;;14508:8;;14450:67;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;14450:67:0;;;14440:78;;;;;;14377:147;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;14377:147:0;;;14362:167;;;;;;14345:184;;14534:13;14550:22;14564:7;14550:13;:22::i;:::-;14534:38;;14577:24;14604:26;14614:6;14622:1;14625;14628;14604:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14604:26:0;;;;;;;;14577:53;;14663:5;14643:25;;:16;:25;;;14635:71;;;;;;;;;;;;;;14143:569;;;;;;;;;;:::o;34447:198::-;34530:4;34541:13;34557:58;34585:14;34601:13;34557:27;:58::i;:::-;34639:1;-1:-1:-1;;34447:198:0;-1:-1:-1;;;34447:198:0:o;32630:406::-;32732:4;32743:27;;:::i;:::-;-1:-1:-1;32773:22:0;;:35;;;:22;32817:5;:21;;;;;;;;;32813:70;;;-1:-1:-1;32849:22:0;;:34;32813:70;32901:13;32892:5;:22;;;;;;;;;32888:72;;;-1:-1:-1;32925:22:0;;:35;;;32888:72;32972:59;32981:14;32997:5;33004:6;:12;;;33018:6;:12;;;31985:602;32136:27;;;;32105:4;;;32172:5;:21;;;;;;;;;32168:101;;;32237:31;;;;32210:59;;:22;:12;32227:4;32210:22;:16;:22;:::i;:59::-;32195:74;;32168:101;32287:13;32278:5;:22;;;;;;;;;32274:102;;;32317:59;32371:4;32317:49;32334:14;:31;;;32317:12;:16;;:49;;;;:::i;:59::-;32302:74;;32274:102;32381:19;32403:31;32421:12;32403:17;:31::i;:::-;32381:53;;32439:19;32461:31;32479:12;32461:17;:31::i;:::-;32439:53;-1:-1:-1;32504:78:0;32545:36;30818:5;32545:27;:7;32439:53;32545:27;:11;:27;:::i;:36::-;32504;30818:5;32504:27;:7;32516:14;32504:27;:11;:27;:::i;:36::-;:40;:78;:40;:78;:::i;:::-;32497:85;31985:602;-1:-1:-1;;;;;;;;31985:602:0:o;3375:471::-;3433:7;3678:6;3674:47;;-1:-1:-1;3708:1:0;3701:8;;3674:47;3745:5;;;3749:1;3745;:5;:1;3769:5;;;;;:10;3761:56;;;;;;;;;;;;;5033:132;5091:7;5118:39;5122:1;5125;5118:39;;;;;;;;;;;;;;;;;:3;:39::i;2514:137::-;2572:7;2599:44;2603:1;2606;2599:44;;;;;;;;;;;;;;;;;:3;:44::i;12521:262::-;12619:22;;;12611:67;;;;;;;;;;;;;;12683:23;;;;;;;;:16;:23;;;;;;;;:33;;;;;;;;;;;;;;:44;;;;;;;;;;12737:41;;;;;12683:44;;12737:41;;;;;;;;;;12521:262;;;:::o;12003:204::-;12116:34;12126:4;12132:2;12136:7;12145:4;12116:9;:34::i;:::-;12155:47;12178:4;12184:2;12188:7;12197:4;12155:22;:47::i;9473:431::-;9549:12;;;;:4;;:12;;;;;:::i;:::-;-1:-1:-1;9566:16:0;;;;:6;;:16;;;;;:::i;:::-;-1:-1:-1;9701:95:0;;9634:7;;9701:95;;;;;;;;;;;;;;9803:23;;;;;;;;;;9843:10;;;;;;;;;;;;;;;;9684:210;;;;9701:95;;9833:21;;9861:7;;9883:4;;9684:210;;;;;;;22:32:-1;26:21;;;22:32;6:49;;9684:210:0;;;9669:230;;49:4:-1;9669:230:0;;;;9650:16;:249;-1:-1:-1;;;9473:431:0:o;19601:133::-;19674:7;;;;;;;;;;;19665:23;;;:25;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19665:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19665:25:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19665:25:0;;;;;;;;;19651:39;;:10;:39;;;19643:86;;;;;;;;;;;;;;19601:133::o;33332:373::-;33443:3;33453:21;33477:84;33556:4;33477:74;33517:14;:33;;;33477:35;33490:14;33506:5;33477:12;:35::i;:84::-;33453:108;;33566:20;33589:41;33608:14;33624:5;33589:18;:41::i;:::-;33566:64;;33672:28;33683:16;33672:10;:28::i;:::-;33642:27;33653:15;33642:10;:27::i;:::-;:58;;33332:373;-1:-1:-1;;;;;33332:373:0:o;10337:425::-;10415:12;10441:17;;;:8;:17;;;;;;;;;;;10467:18;;;10463:61;;10487:37;10504:4;10510;10516:7;10487:16;:37::i;:::-;10535:18;;;;10531:103;;10561:41;10578:1;10582:7;10599:1;10561:8;:41::i;:::-;10608:15;;;;;;;:9;:15;;;;;:20;;;;;;10531:103;10644:16;;;;10640:52;;10668:13;;;;;;;:9;:13;;;;;:18;;10685:1;10668:18;;;10640:52;10698:17;;;;:8;:17;;;;;;:22;;;;;;;;;;;;;;10730:27;;10698:17;;10730:27;;;;;;;10337:425;;;;;:::o;31104:423::-;31292:21;;:::i;:::-;-1:-1:-1;31327:195:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31104:423::o;9910:237::-;10006:4;10024:22;;;;;;;:118;;;10060:8;10051:17;;:5;:17;;;:54;;;-1:-1:-1;10072:23:0;;;;;;;;:16;:23;;;;;;;;:33;;;;;;;;;;;;10051:54;:90;;;-1:-1:-1;;10109:20:0;;;;:11;:20;;;;;;:32;;;;:20;;:32;;9910:237;-1:-1:-1;9910:237:0:o;33078:194::-;33174:4;33192:75;33201:14;33217:5;33224:14;:20;;;33246:14;:20;;;33192:8;:75::i;5653:345::-;5739:7;5841:12;5834:5;5826:28;;;;;;;;;;;;;;;;5865:9;5881:1;5877;:5;;;;;;;5653:345;-1:-1:-1;;;;;5653:345:0:o;31824:114::-;31893:4;31911:22;30883:6;31920:12;31911:22;:8;:22;:::i;1621:181::-;1679:7;1711:5;;;1735:6;;;;1727:46;;;;;;;;;;;;;2940:192;3026:7;3062:12;3054:6;;;;3046:29;;;;;;;;;;;;;;;-1:-1:-1;;;3098:5:0;;;2940:192::o;12997:358::-;13109:14;13120:2;13109:10;:14::i;:::-;13105:246;;;13147:69;;;;;13131:13;;13147:36;;;;;;:69;;13184:10;;13196:4;;13202:7;;13211:4;;13147:69;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13147:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13147:69:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13147:69:0;;;;;;;;;13131:85;;13247:60;;;;;;;;;;;;;;13230:78;;;:6;:78;;;;13222:123;;;;;;;;;;;;;31536:149;31590:6;31621;31617:1;:10;31609:41;;;;;;;;;;;;;;-1:-1:-1;31675:1:0;31536:149::o;15167:155::-;15273:18;15308:8;;;;;15167:155::o;34739:7148::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34739:7148:0;;;;-1:-1:-1;34739:7148:0;;;;;;;;;;;;;;;5:130:-1;72:20;;97:33;72:20;97:33;;142:134;220:13;;238:33;220:13;238:33;;283:124;347:20;;372:30;347:20;372:30;;414:130;481:20;;506:33;481:20;506:33;;551:132;628:13;;646:32;628:13;646:32;;704:336;;;818:3;811:4;803:6;799:17;795:27;785:2;;836:1;833;826:12;785:2;-1:-1;856:20;;896:18;885:30;;882:2;;;928:1;925;918:12;882:2;962:4;954:6;950:17;938:29;;1013:3;1005:4;997:6;993:17;983:8;979:32;976:41;973:2;;;1030:1;1027;1020:12;973:2;778:262;;;;;;1049:440;;1150:3;1143:4;1135:6;1131:17;1127:27;1117:2;;1168:1;1165;1158:12;1117:2;1205:6;1192:20;1227:64;1242:48;1283:6;1242:48;;;1227:64;;;1218:73;;1311:6;1304:5;1297:21;1347:4;1339:6;1335:17;1380:4;1373:5;1369:16;1415:3;1406:6;1401:3;1397:16;1394:25;1391:2;;;1432:1;1429;1422:12;1391:2;1442:41;1476:6;1471:3;1466;1442:41;;;1110:379;;;;;;;;1884:497;;2004:4;1992:9;1987:3;1983:19;1979:30;1976:2;;;2022:1;2019;2012:12;1976:2;2040:20;2055:4;2040:20;;;2031:29;-1:-1;2111:1;2143:60;2199:3;2179:9;2143:60;;;2118:86;;-1:-1;2266:2;2299:60;2355:3;2331:22;;;2299:60;;;2292:4;2285:5;2281:16;2274:86;2225:146;1970:411;;;;;2416:739;;2541:4;2529:9;2524:3;2520:19;2516:30;2513:2;;;2559:1;2556;2549:12;2513:2;2577:20;2592:4;2577:20;;;2568:29;-1:-1;2654:1;2686:80;2762:3;2742:9;2686:80;;;2661:106;;-1:-1;2836:2;2869:80;2945:3;2921:22;;;2869:80;;;2862:4;2855:5;2851:16;2844:106;2788:173;3019:3;3053:80;3129:3;3120:6;3109:9;3105:22;3053:80;;;3046:4;3039:5;3035:16;3028:106;2971:174;2507:648;;;;;3299:134;3377:13;;3395:33;3377:13;3395:33;;3440:126;3505:20;;3530:31;3505:20;3530:31;;3573:241;;3677:2;3665:9;3656:7;3652:23;3648:32;3645:2;;;3693:1;3690;3683:12;3645:2;3728:1;3745:53;3790:7;3770:9;3745:53;;3821:263;;3936:2;3924:9;3915:7;3911:23;3907:32;3904:2;;;3952:1;3949;3942:12;3904:2;3987:1;4004:64;4060:7;4040:9;4004:64;;4091:366;;;4212:2;4200:9;4191:7;4187:23;4183:32;4180:2;;;4228:1;4225;4218:12;4180:2;4263:1;4280:53;4325:7;4305:9;4280:53;;;4270:63;;4242:97;4370:2;4388:53;4433:7;4424:6;4413:9;4409:22;4388:53;;;4378:63;;4349:98;4174:283;;;;;;4464:491;;;;4602:2;4590:9;4581:7;4577:23;4573:32;4570:2;;;4618:1;4615;4608:12;4570:2;4653:1;4670:53;4715:7;4695:9;4670:53;;;4660:63;;4632:97;4760:2;4778:53;4823:7;4814:6;4803:9;4799:22;4778:53;;;4768:63;;4739:98;4868:2;4886:53;4931:7;4922:6;4911:9;4907:22;4886:53;;;4876:63;;4847:98;4564:391;;;;;;4962:741;;;;;;5136:3;5124:9;5115:7;5111:23;5107:33;5104:2;;;5153:1;5150;5143:12;5104:2;5188:1;5205:53;5250:7;5230:9;5205:53;;;5195:63;;5167:97;5295:2;5313:53;5358:7;5349:6;5338:9;5334:22;5313:53;;;5303:63;;5274:98;5403:2;5421:53;5466:7;5457:6;5446:9;5442:22;5421:53;;;5411:63;;5382:98;5539:2;5528:9;5524:18;5511:32;5563:18;5555:6;5552:30;5549:2;;;5595:1;5592;5585:12;5549:2;5623:64;5679:7;5670:6;5659:9;5655:22;5623:64;;;5613:74;;;;5490:203;5098:605;;;;;;;;;5710:360;;;5828:2;5816:9;5807:7;5803:23;5799:32;5796:2;;;5844:1;5841;5834:12;5796:2;5879:1;5896:53;5941:7;5921:9;5896:53;;;5886:63;;5858:97;5986:2;6004:50;6046:7;6037:6;6026:9;6022:22;6004:50;;6077:366;;;6198:2;6186:9;6177:7;6173:23;6169:32;6166:2;;;6214:1;6211;6204:12;6166:2;6249:1;6266:53;6311:7;6291:9;6266:53;;;6256:63;;6228:97;6356:2;6374:53;6419:7;6410:6;6399:9;6395:22;6374:53;;6450:491;;;;6588:2;6576:9;6567:7;6563:23;6559:32;6556:2;;;6604:1;6601;6594:12;6556:2;6639:1;6656:53;6701:7;6681:9;6656:53;;;6646:63;;6618:97;6746:2;6764:53;6809:7;6800:6;6789:9;6785:22;6764:53;;6948:721;;;;;7112:3;7100:9;7091:7;7087:23;7083:33;7080:2;;;7129:1;7126;7119:12;7080:2;7164:1;7181:53;7226:7;7206:9;7181:53;;;7171:63;;7143:97;7271:2;7289:53;7334:7;7325:6;7314:9;7310:22;7289:53;;;7279:63;;7250:98;7379:2;7397:53;7442:7;7433:6;7422:9;7418:22;7397:53;;;7387:63;;7358:98;7515:2;7504:9;7500:18;7487:32;7539:18;7531:6;7528:30;7525:2;;;7571:1;7568;7561:12;7525:2;7591:62;7645:7;7636:6;7625:9;7621:22;7591:62;;;7581:72;;7466:193;7074:595;;;;;;;;7676:865;;;;;;;7863:3;7851:9;7842:7;7838:23;7834:33;7831:2;;;7880:1;7877;7870:12;7831:2;7915:1;7932:53;7977:7;7957:9;7932:53;;;7922:63;;7894:97;8022:2;8040:53;8085:7;8076:6;8065:9;8061:22;8040:53;;;8030:63;;8001:98;8130:2;8148:53;8193:7;8184:6;8173:9;8169:22;8148:53;;;8138:63;;8109:98;8238:2;8256:51;8299:7;8290:6;8279:9;8275:22;8256:51;;;8246:61;;8217:96;8344:3;8363:53;8408:7;8399:6;8388:9;8384:22;8363:53;;;8353:63;;8323:99;8453:3;8472:53;8517:7;8508:6;8497:9;8493:22;8472:53;;;8462:63;;8432:99;7825:716;;;;;;;;;8548:261;;8662:2;8650:9;8641:7;8637:23;8633:32;8630:2;;;8678:1;8675;8668:12;8630:2;8713:1;8730:63;8785:7;8765:9;8730:63;;8816:995;;;;;;;;9028:3;9016:9;9007:7;9003:23;8999:33;8996:2;;;9045:1;9042;9035:12;8996:2;9080:31;;9131:18;9120:30;;9117:2;;;9163:1;9160;9153:12;9117:2;9191:65;9248:7;9239:6;9228:9;9224:22;9191:65;;;9181:75;;;;9059:203;9321:2;9310:9;9306:18;9293:32;9345:18;9337:6;9334:30;9331:2;;;9377:1;9374;9367:12;9331:2;9405:65;9462:7;9453:6;9442:9;9438:22;9405:65;;;9395:75;;;;9272:204;9507:2;9525:53;9570:7;9561:6;9550:9;9546:22;9525:53;;;9515:63;;9486:98;9615:2;9633:53;9678:7;9669:6;9658:9;9654:22;9633:53;;;9623:63;;9594:98;9723:3;9742:53;9787:7;9778:6;9767:9;9763:22;9742:53;;;9732:63;;9702:99;8990:821;;;;;;;;;;;9818:241;;9922:2;9910:9;9901:7;9897:23;9893:32;9890:2;;;9938:1;9935;9928:12;9890:2;9973:1;9990:53;10035:7;10015:9;9990:53;;10066:263;;10181:2;10169:9;10160:7;10156:23;10152:32;10149:2;;;10197:1;10194;10187:12;10149:2;10232:1;10249:64;10305:7;10285:9;10249:64;;10336:491;;;;10474:2;10462:9;10453:7;10449:23;10445:32;10442:2;;;10490:1;10487;10480:12;10442:2;10525:1;10542:53;10587:7;10567:9;10542:53;;10834:450;;;10991:3;10979:9;10970:7;10966:23;10962:33;10959:2;;;11008:1;11005;10998:12;10959:2;11043:1;11060:64;11116:7;11096:9;11060:64;;;11050:74;;11022:108;11161:2;11179:89;11260:7;11251:6;11240:9;11236:22;11179:89;;11291:741;;;;;;11465:3;11453:9;11444:7;11440:23;11436:33;11433:2;;;11482:1;11479;11472:12;11433:2;11517:1;11534:53;11579:7;11559:9;11534:53;;;11524:63;;11496:97;11624:2;11642:53;11687:7;11678:6;11667:9;11663:22;11642:53;;;11632:63;;11603:98;11732:2;11750:53;11795:7;11786:6;11775:9;11771:22;11750:53;;12039:142;12130:45;12169:5;12130:45;;;12125:3;12118:58;12112:69;;;12188:113;12271:24;12289:5;12271:24;;12308:104;12385:21;12400:5;12385:21;;12419:113;12502:24;12520:5;12502:24;;12539:152;12640:45;12660:24;12678:5;12660:24;;;12640:45;;12698:110;12779:23;12796:5;12779:23;;12838:297;;12952:70;13015:6;13010:3;12952:70;;;12945:77;;13034:43;13070:6;13065:3;13058:5;13034:43;;;13099:29;13121:6;13099:29;;;13090:39;;;;12938:197;-1:-1;;;12938:197;13143:343;;13253:38;13285:5;13253:38;;;13303:70;13366:6;13361:3;13303:70;;;13296:77;;13378:52;13423:6;13418:3;13411:4;13404:5;13400:16;13378:52;;;13451:29;13473:6;13451:29;;14194:332;;14354:67;14418:2;14413:3;14354:67;;;14454:34;14434:55;;14517:2;14508:12;;14340:186;-1:-1;;14340:186;14535:377;;14695:67;14759:2;14754:3;14695:67;;;14795:34;14775:55;;14864:10;14859:2;14850:12;;14843:32;14903:2;14894:12;;14681:231;-1:-1;;14681:231;14921:373;;15081:67;15145:2;15140:3;15081:67;;;15181:34;15161:55;;15250:6;15245:2;15236:12;;15229:28;15285:2;15276:12;;15067:227;-1:-1;;15067:227;15303:420;;15481:85;15563:2;15558:3;15481:85;;;15599:34;15579:55;;15668:17;15663:2;15654:12;;15647:39;15714:2;15705:12;;15467:256;-1:-1;;15467:256;15732:398;;15910:84;15992:1;15987:3;15910:84;;;16027:66;16007:87;;16122:1;16113:11;;15896:234;-1:-1;;15896:234;16139:327;;16299:67;16363:2;16358:3;16299:67;;;16399:29;16379:50;;16457:2;16448:12;;16285:181;-1:-1;;16285:181;16475:332;;16635:67;16699:2;16694:3;16635:67;;;16735:34;16715:55;;16798:2;16789:12;;16621:186;-1:-1;;16621:186;16816:377;;16976:67;17040:2;17035:3;16976:67;;;17076:34;17056:55;;17145:10;17140:2;17131:12;;17124:32;17184:2;17175:12;;16962:231;-1:-1;;16962:231;17202:323;;17362:67;17426:2;17421:3;17362:67;;;17462:25;17442:46;;17516:2;17507:12;;17348:177;-1:-1;;17348:177;17534:378;;17694:67;17758:2;17753:3;17694:67;;;17794:34;17774:55;;17863:11;17858:2;17849:12;;17842:33;17903:2;17894:12;;17680:232;-1:-1;;17680:232;17921:374;;18081:67;18145:2;18140:3;18081:67;;;18181:34;18161:55;;18250:7;18245:2;18236:12;;18229:29;18286:2;18277:12;;18067:228;-1:-1;;18067:228;18304:370;;18464:67;18528:2;18523:3;18464:67;;;18564:34;18544:55;;18633:3;18628:2;18619:12;;18612:25;18665:2;18656:12;;18450:224;-1:-1;;18450:224;18683:395;;18843:67;18907:2;18902:3;18843:67;;;18943:34;18923:55;;19012:28;19007:2;18998:12;;18991:50;19069:2;19060:12;;18829:249;-1:-1;;18829:249;19087:328;;19247:67;19311:2;19306:3;19247:67;;;19347:30;19327:51;;19406:2;19397:12;;19233:182;-1:-1;;19233:182;19424:375;;19584:67;19648:2;19643:3;19584:67;;;19684:34;19664:55;;19753:8;19748:2;19739:12;;19732:30;19790:2;19781:12;;19570:229;-1:-1;;19570:229;19808:331;;19968:67;20032:2;20027:3;19968:67;;;20068:33;20048:54;;20130:2;20121:12;;19954:185;-1:-1;;19954:185;20148:492;;20326:85;20408:2;20403:3;20326:85;;;20444:34;20424:55;;20513:34;20508:2;20499:12;;20492:56;20582:20;20577:2;20568:12;;20561:42;20631:2;20622:12;;20312:328;-1:-1;;20312:328;20649:370;;20809:67;20873:2;20868:3;20809:67;;;20909:34;20889:55;;20978:3;20973:2;20964:12;;20957:25;21010:2;21001:12;;20795:224;-1:-1;;20795:224;21028:381;;21188:67;21252:2;21247:3;21188:67;;;21288:34;21268:55;;21357:14;21352:2;21343:12;;21336:36;21400:2;21391:12;;21174:235;-1:-1;;21174:235;21418:382;;21578:67;21642:2;21637:3;21578:67;;;21678:34;21658:55;;21747:15;21742:2;21733:12;;21726:37;21791:2;21782:12;;21564:236;-1:-1;;21564:236;21809:371;;21969:67;22033:2;22028:3;21969:67;;;22069:34;22049:55;;22138:4;22133:2;22124:12;;22117:26;22171:2;22162:12;;21955:225;-1:-1;;21955:225;22189:379;;22349:67;22413:2;22408:3;22349:67;;;22449:34;22429:55;;22518:12;22513:2;22504:12;;22497:34;22559:2;22550:12;;22335:233;-1:-1;;22335:233;22577:370;;22737:67;22801:2;22796:3;22737:67;;;22837:34;22817:55;;22906:3;22901:2;22892:12;;22885:25;22938:2;22929:12;;22723:224;-1:-1;;22723:224;22956:330;;23116:67;23180:2;23175:3;23116:67;;;23216:32;23196:53;;23277:2;23268:12;;23102:184;-1:-1;;23102:184;23295:318;;23455:67;23519:2;23514:3;23455:67;;;23555:20;23535:41;;23604:2;23595:12;;23441:172;-1:-1;;23441:172;23622:381;;23782:67;23846:2;23841:3;23782:67;;;23882:34;23862:55;;23951:14;23946:2;23937:12;;23930:36;23994:2;23985:12;;23768:235;-1:-1;;23768:235;24012:375;;24172:67;24236:2;24231:3;24172:67;;;24272:34;24252:55;;24341:8;24336:2;24327:12;;24320:30;24378:2;24369:12;;24158:229;-1:-1;;24158:229;24396:375;;24556:67;24620:2;24615:3;24556:67;;;24656:34;24636:55;;24725:8;24720:2;24711:12;;24704:30;24762:2;24753:12;;24542:229;-1:-1;;24542:229;24780:331;;24940:67;25004:2;24999:3;24940:67;;;25040:33;25020:54;;25102:2;25093:12;;24926:185;-1:-1;;24926:185;25120:332;;25280:67;25344:2;25339:3;25280:67;;;25380:34;25360:55;;25443:2;25434:12;;25266:186;-1:-1;;25266:186;25580:107;25659:22;25675:5;25659:22;;25694:372;;25893:148;26037:3;25893:148;;26073:650;;26328:148;26472:3;26328:148;;;26321:155;;26487:75;26558:3;26549:6;26487:75;;;26584:2;26579:3;26575:12;26568:19;;26598:75;26669:3;26660:6;26598:75;;;-1:-1;26695:2;26686:12;;26309:414;-1:-1;;26309:414;26730:372;;26929:148;27073:3;26929:148;;27109:213;27227:2;27212:18;;27241:71;27216:9;27285:6;27241:71;;27329:647;27557:3;27542:19;;27572:79;27546:9;27624:6;27572:79;;;27662:72;27730:2;27719:9;27715:18;27706:6;27662:72;;;27745;27813:2;27802:9;27798:18;27789:6;27745:72;;;27865:9;27859:4;27855:20;27850:2;27839:9;27835:18;27828:48;27890:76;27961:4;27952:6;27890:76;;27983:647;28211:3;28196:19;;28226:79;28200:9;28278:6;28226:79;;;28316:72;28384:2;28373:9;28369:18;28360:6;28316:72;;28637:435;28811:2;28796:18;;28825:71;28800:9;28869:6;28825:71;;;28907:72;28975:2;28964:9;28960:18;28951:6;28907:72;;;28990;29058:2;29047:9;29043:18;29034:6;28990:72;;29079:651;29309:3;29294:19;;29324:71;29298:9;29368:6;29324:71;;;29406:72;29474:2;29463:9;29459:18;29450:6;29406:72;;;29489;29557:2;29546:9;29542:18;29533:6;29489:72;;;29609:9;29603:4;29599:20;29594:2;29583:9;29579:18;29572:48;29634:86;29715:4;29706:6;29698;29634:86;;;29626:94;29280:450;-1:-1;;;;;;;29280:450;29737:201;29849:2;29834:18;;29863:65;29838:9;29901:6;29863:65;;29945:213;30063:2;30048:18;;30077:71;30052:9;30121:6;30077:71;;30165:659;30395:3;30380:19;;30410:71;30384:9;30454:6;30410:71;;;30492:72;30560:2;30549:9;30545:18;30536:6;30492:72;;;30575;30643:2;30632:9;30628:18;30619:6;30575:72;;;30658;30726:2;30715:9;30711:18;30702:6;30658:72;;;30741:73;30809:3;30798:9;30794:19;30785:6;30741:73;;30831:659;31061:3;31046:19;;31076:71;31050:9;31120:6;31076:71;;;31158:72;31226:2;31215:9;31211:18;31202:6;31158:72;;;31241;31309:2;31298:9;31294:18;31285:6;31241:72;;;31324;31392:2;31381:9;31377:18;31368:6;31324:72;;;31407:73;31475:3;31464:9;31460:19;31451:6;31407:73;;31497:539;31695:3;31680:19;;31710:71;31684:9;31754:6;31710:71;;;31792:68;31856:2;31845:9;31841:18;31832:6;31792:68;;;31871:72;31939:2;31928:9;31924:18;31915:6;31871:72;;;31954;32022:2;32011:9;32007:18;31998:6;31954:72;;32043:209;32159:2;32144:18;;32173:69;32148:9;32215:6;32173:69;;32259:293;32393:2;32407:47;;;32378:18;;32468:74;32378:18;32528:6;32468:74;;32867:407;33058:2;33072:47;;;33043:18;;33133:131;33043:18;33133:131;;33281:407;33472:2;33486:47;;;33457:18;;33547:131;33457:18;33547:131;;33695:407;33886:2;33900:47;;;33871:18;;33961:131;33871:18;33961:131;;34109:407;34300:2;34314:47;;;34285:18;;34375:131;34285:18;34375:131;;34523:407;34714:2;34728:47;;;34699:18;;34789:131;34699:18;34789:131;;34937:407;35128:2;35142:47;;;35113:18;;35203:131;35113:18;35203:131;;35351:407;35542:2;35556:47;;;35527:18;;35617:131;35527:18;35617:131;;35765:407;35956:2;35970:47;;;35941:18;;36031:131;35941:18;36031:131;;36179:407;36370:2;36384:47;;;36355:18;;36445:131;36355:18;36445:131;;36593:407;36784:2;36798:47;;;36769:18;;36859:131;36769:18;36859:131;;37007:407;37198:2;37212:47;;;37183:18;;37273:131;37183:18;37273:131;;37421:407;37612:2;37626:47;;;37597:18;;37687:131;37597:18;37687:131;;37835:407;38026:2;38040:47;;;38011:18;;38101:131;38011:18;38101:131;;38249:407;38440:2;38454:47;;;38425:18;;38515:131;38425:18;38515:131;;38663:407;38854:2;38868:47;;;38839:18;;38929:131;38839:18;38929:131;;39077:407;39268:2;39282:47;;;39253:18;;39343:131;39253:18;39343:131;;39491:407;39682:2;39696:47;;;39667:18;;39757:131;39667:18;39757:131;;39905:407;40096:2;40110:47;;;40081:18;;40171:131;40081:18;40171:131;;40319:407;40510:2;40524:47;;;40495:18;;40585:131;40495:18;40585:131;;40733:407;40924:2;40938:47;;;40909:18;;40999:131;40909:18;40999:131;;41147:407;41338:2;41352:47;;;41323:18;;41413:131;41323:18;41413:131;;41561:407;41752:2;41766:47;;;41737:18;;41827:131;41737:18;41827:131;;41975:407;42166:2;42180:47;;;42151:18;;42241:131;42151:18;42241:131;;42389:407;42580:2;42594:47;;;42565:18;;42655:131;42565:18;42655:131;;42803:407;42994:2;43008:47;;;42979:18;;43069:131;42979:18;43069:131;;43217:407;43408:2;43422:47;;;43393:18;;43483:131;43393:18;43483:131;;43631:407;43822:2;43836:47;;;43807:18;;43897:131;43807:18;43897:131;;44265:324;44411:2;44396:18;;44425:71;44400:9;44469:6;44425:71;;;44507:72;44575:2;44564:9;44560:18;44551:6;44507:72;;44596:435;44770:2;44755:18;;44784:71;44759:9;44828:6;44784:71;;;44866:72;44934:2;44923:9;44919:18;44910:6;44866:72;;45038:256;45100:2;45094:9;45126:17;;;45201:18;45186:34;;45222:22;;;45183:62;45180:2;;;45258:1;45255;45248:12;45180:2;45274;45267:22;45078:216;;-1:-1;45078:216;45301:321;;45444:18;45436:6;45433:30;45430:2;;;45476:1;45473;45466:12;45430:2;-1:-1;45607:4;45543;45520:17;;;;45539:9;45516:33;45597:15;;45367:255;45629:121;45716:12;;45687:63;46012:162;46114:19;;;46163:4;46154:14;;46107:67;46355:145;46491:3;46469:31;-1:-1;46469:31;46508:91;;46570:24;46588:5;46570:24;;46606:85;46672:13;46665:21;;46648:43;46777:144;46849:66;46838:78;;46821:100;46928:121;47001:42;46990:54;;46973:76;47135:81;47206:4;47195:16;;47178:38;47223:129;;47310:37;47341:5;47359:121;47438:37;47469:5;47438:37;;47603:145;47684:6;47679:3;47674;47661:30;-1:-1;47740:1;47722:16;;47715:27;47654:94;47757:268;47822:1;47829:101;47843:6;47840:1;47837:13;47829:101;;;47910:11;;;47904:18;47891:11;;;47884:39;47865:2;47858:10;47829:101;;;47945:6;47942:1;47939:13;47936:2;;;-1:-1;;48010:1;47992:16;;47985:27;47806:219;48114:97;48202:2;48182:14;48198:7;48178:28;;48162:49;48219:117;48288:24;48306:5;48288:24;;;48281:5;48278:35;48268:2;;48327:1;48324;48317:12;48268:2;48262:74;;48343:111;48409:21;48424:5;48409:21;;48461:117;48530:24;48548:5;48530:24;;48585:115;48653:23;48670:5;48653:23;;48831:113;48898:22;48914:5;48898:22;
Swarm Source
bzzr://b3b7e6d5908bdfec198b2132c7b7eb768f20212af4d2adc0e19b288bee30c6d5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.