More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 940 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Redeem | 9411097 | 21 mins ago | IN | 0 S | 0.00732462 | ||||
Redeem | 9401543 | 1 hr ago | IN | 0 S | 0.00549582 | ||||
Redeem | 9401275 | 1 hr ago | IN | 0 S | 0.00148412 | ||||
Redeem | 9394470 | 2 hrs ago | IN | 0 S | 0.00732462 | ||||
Redeem | 9394040 | 2 hrs ago | IN | 0 S | 0.00148412 | ||||
Redeem | 9392175 | 2 hrs ago | IN | 0 S | 0.00148412 | ||||
Redeem | 9391594 | 2 hrs ago | IN | 0 S | 0.00268482 | ||||
Redeem | 9391590 | 2 hrs ago | IN | 0 S | 0.00268482 | ||||
Redeem | 9391520 | 2 hrs ago | IN | 0 S | 0.00383526 | ||||
Redeem | 9391394 | 2 hrs ago | IN | 0 S | 0.00268482 | ||||
Redeem | 9391391 | 2 hrs ago | IN | 0 S | 0.00268482 | ||||
Redeem | 9391388 | 2 hrs ago | IN | 0 S | 0.00268482 | ||||
Redeem | 9391384 | 2 hrs ago | IN | 0 S | 0.00268482 | ||||
Redeem | 9391381 | 2 hrs ago | IN | 0 S | 0.00268482 | ||||
Redeem | 9391377 | 2 hrs ago | IN | 0 S | 0.00268482 | ||||
Redeem | 9391375 | 2 hrs ago | IN | 0 S | 0.00268482 | ||||
Redeem | 9391372 | 2 hrs ago | IN | 0 S | 0.00268482 | ||||
Redeem | 9391370 | 2 hrs ago | IN | 0 S | 0.00268482 | ||||
Redeem | 9391367 | 2 hrs ago | IN | 0 S | 0.00268482 | ||||
Redeem | 9391364 | 2 hrs ago | IN | 0 S | 0.00268482 | ||||
Redeem | 9391360 | 2 hrs ago | IN | 0 S | 0.00268482 | ||||
Redeem | 9391359 | 2 hrs ago | IN | 0 S | 0.00268482 | ||||
Redeem | 9391142 | 2 hrs ago | IN | 0 S | 0.00268482 | ||||
Redeem | 9391126 | 2 hrs ago | IN | 0 S | 0.00268482 | ||||
Redeem | 9391109 | 2 hrs ago | IN | 0 S | 0.00454333 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
BondDepository
Compiler Version
v0.8.27+commit.40a35a09
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-02-17 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } pragma solidity ^0.8.20; /** * @dev Interface of the ERC-165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[ERC]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } pragma solidity ^0.8.20; /** * @title IERC1363 * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363]. * * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction. */ interface IERC1363 is IERC20, IERC165 { /* * Note: the ERC-165 identifier for this interface is 0xb0202a11. * 0xb0202a11 === * bytes4(keccak256('transferAndCall(address,uint256)')) ^ * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^ * bytes4(keccak256('approveAndCall(address,uint256)')) ^ * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) */ /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @param data Additional data with no specified format, sent in call to `spender`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool); } pragma solidity ^0.8.20; /** * @title SafeERC20 * @dev Wrappers around ERC-20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { /** * @dev An operation with an ERC-20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. * * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function * only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being * set here. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { safeTransfer(token, to, value); } else if (!token.transferAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferFromAndCallRelaxed( IERC1363 token, address from, address to, uint256 value, bytes memory data ) internal { if (to.code.length == 0) { safeTransferFrom(token, from, to, value); } else if (!token.transferFromAndCall(from, to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}. * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall} * once without retrying, and relies on the returned value to be true. * * Reverts if the returned value is other than `true`. */ function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { forceApprove(token, to, value); } else if (!token.approveAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements. */ function _callOptionalReturn(IERC20 token, bytes memory data) private { uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) // bubble errors if iszero(success) { let ptr := mload(0x40) returndatacopy(ptr, 0, returndatasize()) revert(ptr, returndatasize()) } returnSize := returndatasize() returnValue := mload(0) } if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { bool success; uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) returnSize := returndatasize() returnValue := mload(0) } return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1); } } pragma solidity ^0.8.20; /** * @dev External interface of AccessControl declared to support ERC-165 detection. */ interface IAccessControl { /** * @dev The `account` is missing a role. */ error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); /** * @dev The caller of a function is not the expected one. * * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. */ error AccessControlBadConfirmation(); /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role). * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. */ function renounceRole(bytes32 role, address callerConfirmation) external; } pragma solidity ^0.8.20; /** * @dev External interface of AccessControlEnumerable declared to support ERC-165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } pragma solidity ^0.8.20; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } pragma solidity ^0.8.20; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ```solidity * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ```solidity * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address account => bool) hasRole; bytes32 adminRole; } mapping(bytes32 role => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with an {AccessControlUnauthorizedAccount} error including the required role. */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual returns (bool) { return _roles[role].hasRole[account]; } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` * is missing `role`. */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert AccessControlUnauthorizedAccount(account, role); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address callerConfirmation) public virtual { if (callerConfirmation != _msgSender()) { revert AccessControlBadConfirmation(); } _revokeRole(role, callerConfirmation); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual returns (bool) { if (!hasRole(role, account)) { _roles[role].hasRole[account] = true; emit RoleGranted(role, account, _msgSender()); return true; } else { return false; } } /** * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { if (hasRole(role, account)) { _roles[role].hasRole[account] = false; emit RoleRevoked(role, account, _msgSender()); return true; } else { return false; } } } // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.20; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position is the index of the value in the `values` array plus 1. // Position 0 is used to mean a value is not in the set. mapping(bytes32 value => uint256) _positions; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._positions[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We cache the value's position to prevent multiple reads from the same storage slot uint256 position = set._positions[value]; if (position != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 valueIndex = position - 1; uint256 lastIndex = set._values.length - 1; if (valueIndex != lastIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the lastValue to the index where the value to delete is set._values[valueIndex] = lastValue; // Update the tracked position of the lastValue (that was just moved) set._positions[lastValue] = position; } // Delete the slot where the moved value was stored set._values.pop(); // Delete the tracked position for the deleted slot delete set._positions[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._positions[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; assembly ("memory-safe") { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly ("memory-safe") { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly ("memory-safe") { result := store } return result; } } pragma solidity ^0.8.20; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 role => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual returns (uint256) { return _roleMembers[role].length(); } /** * @dev Return all accounts that have `role` * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function getRoleMembers(bytes32 role) public view virtual returns (address[] memory) { return _roleMembers[role].values(); } /** * @dev Overload {AccessControl-_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override returns (bool) { bool granted = super._grantRole(role, account); if (granted) { _roleMembers[role].add(account); } return granted; } /** * @dev Overload {AccessControl-_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override returns (bool) { bool revoked = super._revokeRole(role, account); if (revoked) { _roleMembers[role].remove(account); } return revoked; } } pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } pragma solidity ^0.8.20; /** * @dev Interface for the optional metadata functions from the ERC-20 standard. */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } //@author 0xPhant0m based on Ohm Bond Depository and Bond Protocol pragma solidity ^0.8.27; contract BondDepository is AccessControlEnumerable, ReentrancyGuard { using SafeERC20 for IERC20; bytes32 public constant AUCTIONEER_ROLE = keccak256("AUCTIONEER_ROLE"); bytes32 public constant TOKEN_WHITELISTER_ROLE = keccak256("TOKEN_WHITELISTER_ROLE"); bytes32 public constant EMERGENCY_ADMIN_ROLE = keccak256("EMERGENCY_ADMIN_ROLE"); bool public paused; event ContractPaused(address indexed by); event ContractUnpaused(address indexed by); event newBondCreated(uint256 indexed id, address indexed payoutToken, address indexed quoteToken, uint256 initialPrice ); event BondEnded(uint256 indexed id); event addedAuctioneer(address _auctioneer, address payoutToken); event removeAuctioneer(address auctioneer); event MarketTransferred( uint256 marketId, address owner, address newAuctioneer); event BondDeposited( address indexed user, uint256 indexed marketId, uint256 depositAmount, uint256 totalOwed, uint256 bondPrice ); event QuoteTokensWithdrawn( uint256 indexed marketId, address indexed auctioneer, uint256 amount, uint256 daoFee ); event FeeUpdated (uint256 oldFee, uint256 basePoints); event TokenUnwhitelisted( address _token); event TokenWhitelisted( address _token); event AdjustmentSet( uint256 indexed id, bool add, uint256 rate, uint256 target, uint256 buffer, uint256 lastBlock ); uint256 public marketCounter; address [] public _payoutTokens; Terms[] public terms; mapping(uint256 => Adjust) public adjustments; mapping (address => bool) _whitelistedAuctioneer; mapping (address => bool) _whitelistedToken; mapping(uint256 => address) public marketsToAuctioneers; mapping(address => uint256[]) public marketsForQuote; mapping(address => uint256[]) public marketsForPayout; mapping( address => Bond[]) public bondInfo; address public immutable mSig; uint256 public feeToDao; uint256 public constant MAX_FEE = 1000; // Info for creating new bonds struct Terms { address quoteToken; //token requested address payoutToken; //token to be redeemed uint256 amountToBond; //Amount of payout Tokens dedicated to this request uint256 totalDebt; uint256 controlVariable; // scaling variable for price uint256 minimumPrice; // vs principle value add 3 decimals of precision uint256 maxDebt; // 9 decimal debt ratio, max % total supply created as debt uint256 quoteTokensRaised; uint256 lastDecay; //block.timestamp of last decay (i.e last deposit) uint32 bondEnds; //Unix Timestamp of when the offer ends. uint32 vestingTerm; // How long each bond should vest for in seconds } struct Bond { address tokenBonded; //token to be distributed uint256 amountOwed; //amount of tokens owed to Bonder uint256 initialAmount; //initial amount of tokens owed to Bonder uint256 pricePaid; //price paid in PayoutToken uint256 marketId; //Which market does this belong uint32 startTime; // block timestamp uint32 endTime; //timestamp } struct Adjust { bool add; // addition or subtraction uint rate; // increment uint target; // BCV when adjustment finished uint buffer; // minimum length (in blocks) between adjustments uint lastBlock; // block when last adjustment made } //Strictly for front-end optimization struct BondMarketInfo { address quoteToken; address payoutToken; uint256 price; uint256 maxPayout; uint256 vestingTerm; uint256 amountToBond; address auctioneer; bool isLive; uint256 totalDebt; uint256 bondEnds; } constructor(address _mSig){ if (_mSig == address (0)) revert ("Invalid address"); mSig = _mSig; _grantRole(DEFAULT_ADMIN_ROLE, mSig); _grantRole(EMERGENCY_ADMIN_ROLE, mSig); _grantRole(TOKEN_WHITELISTER_ROLE, mSig); } /*================================= Auctioneer FUNCTIONS =================================*/ function newBond( address payoutToken_, IERC20 _quoteToken, uint256 [4] memory _terms, // [amountToBond, controlVariable, minimumPrice, maxDebt] uint32 [2] memory _vestingTerms // [bondEnds, vestingTerm] ) external onlyRole(AUCTIONEER_ROLE) whenNotPaused returns (uint256 marketID) { // Address validations require(payoutToken_ != address(0), "Invalid payout token"); require(address(_quoteToken) != address(0), "Invalid quote token"); require(address(_quoteToken) != payoutToken_, "Tokens must be different"); require(_whitelistedToken[payoutToken_], "Token not whitelisted"); require(!auctioneerHasMarketForQuote(msg.sender, address(_quoteToken)), "Already has market for quote token"); // Time validations require(_vestingTerms[0] > block.timestamp, "Bond end too early"); // Parameter validations require(_terms[0] > 0, "Amount must be > 0"); require(_terms[1] > 0, "Control variable must be > 0"); require(_terms[2] > 0, "Minimum price must be > 0"); require(_terms[3] > 0, "Max debt must be > 0"); uint256 secondsToConclusion = _vestingTerms[0] - block.timestamp; require(secondsToConclusion > 0, "Invalid vesting period"); // Calculate max payout with better precision uint8 payoutDecimals = IERC20Metadata(payoutToken_).decimals(); // Transfer payout tokens IERC20(payoutToken_).safeTransferFrom(msg.sender, address(this), _terms[0] * 10**payoutDecimals); // Create market terms.push(Terms({ quoteToken: address(_quoteToken), payoutToken: payoutToken_, amountToBond: _terms[0] * 10**payoutDecimals, controlVariable: _terms[1], minimumPrice: _terms[2], // Store minimumPrice without extra scaling maxDebt: _terms[3] * 10**payoutDecimals, quoteTokensRaised: 0, lastDecay: block.timestamp, bondEnds: _vestingTerms[0], vestingTerm: _vestingTerms[1], totalDebt: 0 })); // Market tracking uint256 marketId = marketCounter; marketsForPayout[payoutToken_].push(marketId); marketsForQuote[address(_quoteToken)].push(marketId); marketsToAuctioneers[marketId] = msg.sender; ++marketCounter; emit newBondCreated(marketId, payoutToken_, address(_quoteToken), _terms[1]); return marketId; } function closeBond(uint256 _id) external onlyRole(AUCTIONEER_ROLE) whenNotPaused { if (marketsToAuctioneers[_id] != msg.sender) revert ("Not your Bond"); terms[_id].bondEnds = uint32(block.timestamp); uint256 amountLeft = terms[_id].amountToBond - terms[_id].totalDebt; IERC20(terms[_id].payoutToken).safeTransfer(msg.sender, amountLeft); emit BondEnded(_id); } function withdrawQuoteTokens(uint256 _id) external onlyRole(AUCTIONEER_ROLE) whenNotPaused { require(marketsToAuctioneers[_id] == msg.sender, "Not market's auctioneer"); require(block.timestamp > terms[_id].bondEnds, "Bond not yet concluded"); address quoteToken = terms[_id].quoteToken; uint256 balance = terms[_id].quoteTokensRaised; uint256 daoFee = 0; if (feeToDao > 0) { daoFee = (balance * feeToDao) / 10000; balance -= daoFee; } IERC20(quoteToken).safeTransfer(msg.sender, balance); if (daoFee > 0) { IERC20(quoteToken).safeTransfer(mSig, daoFee); } emit QuoteTokensWithdrawn(_id, msg.sender, balance, daoFee); } function transferMarket(uint256 marketId, address newAuctioneer) external { require(marketsToAuctioneers[marketId] == msg.sender, "Not market owner"); require(hasRole(AUCTIONEER_ROLE, newAuctioneer), "Not auctioneer"); marketsToAuctioneers[marketId] = newAuctioneer; emit MarketTransferred(marketId, msg.sender, newAuctioneer); } function setAdjustment( uint256 _id, bool _add, uint256 _rate, uint256 _target, uint256 _buffer ) external onlyRole(AUCTIONEER_ROLE) whenNotPaused { require(marketsToAuctioneers[_id] == msg.sender, "Not market's auctioneer"); require(_target > 0, "Target cannot be zero"); require(_rate > 0, "Rate cannot be zero"); adjustments[_id] = Adjust({ add: _add, rate: _rate, target: _target, buffer: _buffer, lastBlock: uint32(block.timestamp) }); emit AdjustmentSet( _id, _add, _rate, _target, _buffer, block.timestamp ); } /*================================= User FUNCTIONS =================================*/ function deposit(uint256 _id, uint256 amount, address user) public nonReentrant { require(user != address(0), "Invalid user address"); require(_id < terms.length, "Invalid market ID"); Terms storage term = terms[_id]; require(block.timestamp <= term.bondEnds, "Bond has ended"); require(term.totalDebt < term.maxDebt, "Maximum bond capacity reached"); uint8 quoteDecimals = IERC20Metadata(address(term.quoteToken)).decimals(); uint256 minimumDeposit = calculateMinimumDeposit(quoteDecimals); require(amount >= minimumDeposit, "Deposit below minimum threshold"); _tune(_id); _decayDebt(_id); uint256 price = _marketPrice(_id); // For 6 decimal input -> 18 decimal output uint256 payout = (amount * 1e18) / (price / (10 ** (18 - quoteDecimals))); uint256 maxPayout = ((term.maxDebt - term.totalDebt) * 1800) / 10000; require(payout <= maxPayout, "Deposit exceeds maximum allowed"); require(term.totalDebt + payout <= term.maxDebt, "Exceeds maximum bond debt"); IERC20 quoteToken = IERC20(term.quoteToken); uint256 balanceBefore = quoteToken.balanceOf(address(this)); quoteToken.safeTransferFrom(msg.sender, address(this), amount); uint256 balanceAfter = quoteToken.balanceOf(address(this)); require(balanceAfter - balanceBefore == amount, "Incorrect transfer amount"); terms[_id].quoteTokensRaised += amount; terms[_id].totalDebt += payout; bondInfo[user].push(Bond({ tokenBonded: term.payoutToken, amountOwed: payout, initialAmount: payout, pricePaid: price, marketId: _id, startTime: uint32(block.timestamp), endTime: uint32(term.vestingTerm + block.timestamp) })); emit BondDeposited(user, _id, amount, payout, price); } function redeem(uint256 _id, address user) external nonReentrant returns (uint256 amountRedeemed) { uint256 length = bondInfo[user].length; uint256 totalRedeemed = 0; bool[] memory toDelete = new bool[](length); uint256 deleteCount = 0; // First loop: Handle all redemptions and mark bonds for deletion for (uint256 i = 0; i < length; i++) { Bond storage currentBond = bondInfo[user][i]; if (currentBond.marketId == _id) { uint256 amount = calculateLinearPayout(user, i); if (amount > 0) { bondInfo[user][i].amountOwed -= amount; totalRedeemed += amount; IERC20(terms[_id].payoutToken).safeTransfer(user, amount); // Mark for deletion if fully redeemed if (currentBond.amountOwed == 0) { toDelete[i] = true; deleteCount++; } } } } // Second loop: Only if we need to delete bonds if (deleteCount > 0) { // Create new array with remaining bonds Bond[] memory remainingBonds = new Bond[](length - deleteCount); uint256 newIndex = 0; // Copy only the bonds we want to keep for (uint256 i = 0; i < length; i++) { if (!toDelete[i]) { remainingBonds[newIndex] = bondInfo[user][i]; newIndex++; } } // Clear existing array delete bondInfo[user]; // Rebuild array with only unredeemed bonds for (uint256 i = 0; i < remainingBonds.length; i++) { bondInfo[user].push(remainingBonds[i]); } } return totalRedeemed; } /*================================= ADMIN FUNCTIONS =================================*/ function grantAuctioneerRole(address _auctioneer) external onlyRole(DEFAULT_ADMIN_ROLE) { // Additional validation require(_auctioneer != address(0), "Invalid auctioneer address"); require(!hasRole(AUCTIONEER_ROLE, _auctioneer), "Already an auctioneer"); _grantRole(AUCTIONEER_ROLE, _auctioneer); _whitelistedAuctioneer[_auctioneer] = true; emit RoleGranted(AUCTIONEER_ROLE, _auctioneer, msg.sender); } function revokeAuctioneerRole(address _auctioneer) external onlyRole(DEFAULT_ADMIN_ROLE) { _revokeRole(AUCTIONEER_ROLE, _auctioneer); _whitelistedAuctioneer[_auctioneer] = false; emit RoleRevoked(AUCTIONEER_ROLE, _auctioneer, msg.sender); } function whitelistToken(address _token) external onlyRole(TOKEN_WHITELISTER_ROLE) { require(_token != address(0), "Invalid token address"); require(!_whitelistedToken[_token], "Token already whitelisted"); // Additional token validation try IERC20Metadata(_token).decimals() returns (uint8) { _whitelistedToken[_token] = true; _payoutTokens.push(_token); } catch { revert("Invalid ERC20 token"); } } function unwhitelistToken(address _token) external onlyRole(TOKEN_WHITELISTER_ROLE) { require(_whitelistedToken[_token], "Token not whitelisted"); _whitelistedToken[_token] = false; emit TokenUnwhitelisted(_token); } function pauseContract() external onlyRole(EMERGENCY_ADMIN_ROLE) { paused = true; emit ContractPaused(msg.sender); } function unpauseContract() external onlyRole(EMERGENCY_ADMIN_ROLE) { paused = false; emit ContractUnpaused(msg.sender); } function setFeetoDao(uint32 basePoints) external onlyRole(DEFAULT_ADMIN_ROLE) { require(basePoints <= MAX_FEE, "Fee too high"); uint256 oldFee = feeToDao; feeToDao = basePoints; emit FeeUpdated(oldFee, basePoints); } /*================================= View Functions =================================*/ function getMarketsForQuote(address quoteToken) external view returns(uint256[] memory) { return marketsForQuote[quoteToken]; } function getMarketsForPayout(address payout) external view returns(uint256[] memory) { return marketsForPayout[payout]; } function getMarketsForUser(address user) external view returns(uint256[] memory) { uint256[] memory userMarkets = new uint256[](bondInfo[user].length); for (uint256 i = 0; i < bondInfo[user].length; i++) { userMarkets[i] = bondInfo[user][i].marketId; } return userMarkets; } function isLive(uint256 id_) public view returns (bool) { return block.timestamp <= terms[id_].bondEnds && terms[id_].totalDebt < terms[id_].maxDebt; } function currentMaxPayout(uint256 _id) public view returns (uint256) { Terms memory term = terms[_id]; uint256 remainingDebt = term.maxDebt - term.totalDebt; return (remainingDebt * 1800) / 10000; // 18% of remaining } function bondPrice(uint256 id_) public view returns(uint256) { return _trueBondPrice(id_); } function isAuctioneer(address account) external view returns (bool) { return hasRole(AUCTIONEER_ROLE, account); } function calculateLinearPayout(address user, uint256 _bondId) public view returns (uint256) { Bond memory bond = bondInfo[user][_bondId]; // Check if bond is active if (block.timestamp < bond.startTime) { return 0; } // Calculate total vesting duration uint256 vestingTerm = bond.endTime - bond.startTime; // Calculate time elapsed since bond start uint256 timeElapsed = block.timestamp > bond.endTime ? vestingTerm : block.timestamp - bond.startTime; // Calculate tokens per second based on initialAmount uint256 tokensPerSecond = bond.initialAmount / vestingTerm; // Calculate current claimable amount uint256 currentClaimable = tokensPerSecond * timeElapsed; // Ensure we don't claim more than what's still owed if (currentClaimable > bond.amountOwed) { currentClaimable = bond.amountOwed; } return currentClaimable; } function getBondMarketInfo(uint256 marketId) public view returns (BondMarketInfo memory) { Terms storage term = terms[marketId]; return BondMarketInfo({ quoteToken: term.quoteToken, payoutToken: term.payoutToken, price: _trueBondPrice(marketId), maxPayout: currentMaxPayout(marketId), vestingTerm: term.vestingTerm, amountToBond: term.amountToBond, auctioneer: marketsToAuctioneers[marketId], isLive: isLive(marketId), totalDebt: term.totalDebt, bondEnds: term.bondEnds }); } function getBondMarketInfoBatch(uint256[] calldata marketIds) external view returns (BondMarketInfo[] memory) { BondMarketInfo[] memory markets = new BondMarketInfo[](marketIds.length); for (uint256 i = 0; i < marketIds.length; i++) { markets[i] = getBondMarketInfo(marketIds[i]); } return markets; } function payoutFor(address user, uint256 _bondId) public view returns (uint256 amount) { return calculateLinearPayout(user, _bondId); } function isMature(address user, uint256 _bondId) public view returns (bool) { Bond memory bond = bondInfo[user][_bondId]; return block.timestamp >= bond.endTime; } /*================================= Internal Functions =================================*/ function _decayDebt(uint256 _id) internal { Terms storage term = terms[_id]; uint256 currentDebt = term.totalDebt; if (currentDebt == 0) return; uint256 timeSinceLastDecay = block.timestamp - term.lastDecay; if (timeSinceLastDecay == 0) return; uint256 decay = (currentDebt * timeSinceLastDecay) / (term.vestingTerm * 100); term.totalDebt = decay > currentDebt ? 0 : currentDebt - decay; term.lastDecay = uint32(block.timestamp); } function _tune(uint256 _id) internal{ if (block.timestamp > adjustments[_id].lastBlock + adjustments[_id].buffer) { Terms storage term = terms[_id]; if (adjustments[_id].add) { term.controlVariable += adjustments[_id].rate; if (term.controlVariable >= adjustments[_id].target) { term.controlVariable = adjustments[_id].target; } } else { term.controlVariable -= adjustments[_id].rate; if (term.controlVariable <= adjustments[_id].target) { term.controlVariable = adjustments[_id].target; } } adjustments[_id].lastBlock = uint32(block.timestamp); } } function _marketPrice(uint256 _id) internal view returns (uint256 price) { Terms memory term = terms[_id]; uint8 quoteDecimals = IERC20Metadata(address(term.quoteToken)).decimals(); uint256 currentCV = _currentControlVariable(_id); // For 6 decimals token, scalingFactor = 10^30 uint256 scalingFactor = 10 ** (18 + (18 - quoteDecimals)); // Start with a simple calculation using just CV and scaling price = currentCV * scalingFactor / 1e18; require(price > 0, "Price calculation failed"); return price; } function _trueBondPrice(uint256 _id) internal view returns(uint256 price){ price = _marketPrice(_id); } function _debtRatio(uint256 _id) internal view returns (uint256) { Terms memory term = terms[_id]; if (term.quoteTokensRaised == 0) { return 1e18; } uint8 quoteDecimals = IERC20Metadata(address(term.quoteToken)).decimals(); uint8 payoutDecimals = IERC20Metadata(address(term.payoutToken)).decimals(); int8 decimalAdjustment = int8(payoutDecimals) - int8(quoteDecimals); if (decimalAdjustment >= 0) { // If payoutToken has more decimals, scale up quoteTokensRaised uint256 adjustedQuote = term.quoteTokensRaised * (10 ** uint8(decimalAdjustment)); return (term.totalDebt * 1e18) / adjustedQuote; } else { // If quoteToken has more decimals, scale up totalDebt uint256 adjustedDebt = term.totalDebt * (10 ** uint8(-decimalAdjustment)); return (adjustedDebt * 1e18) / term.quoteTokensRaised; } } function _currentControlVariable(uint256 _id) internal view returns (uint256) { Terms memory term = terms[_id]; Adjust memory adjustment = adjustments[_id]; // Start with base control variable uint256 currentCV = term.controlVariable; // If there's no adjustment or CV is 0, return the base CV if (adjustment.rate == 0 || currentCV == 0) { return currentCV; } // Calculate adjustments only if there's an active adjustment uint256 blocksSince = block.timestamp - adjustment.lastBlock; uint256 adjustmentCount = blocksSince / adjustment.buffer; if (adjustmentCount > 0) { uint256 totalAdjustment = adjustment.rate * adjustmentCount; if (adjustment.add) { if (currentCV + totalAdjustment > adjustment.target) { currentCV = adjustment.target; } else { currentCV += totalAdjustment; } } else { if (totalAdjustment >= currentCV || currentCV - totalAdjustment < adjustment.target) { currentCV = adjustment.target; } else { currentCV -= totalAdjustment; } } } return currentCV; } // Helper function for minimum deposit calculation function calculateMinimumDeposit(uint8 decimals) internal pure returns (uint256) { // Ensures meaningful deposit across different token decimal configurations if (decimals > 2) { return 10 ** (decimals - 2); // 1% of smallest token unit } return 1; // Fallback for tokens with very few decimals } // Helper function for precise owed calculation function calculateTotalOwed(uint256 amount, uint256 price) internal pure returns (uint256) { return (amount * 1e18) / price; } function auctioneerHasMarketForQuote(address auctioneer, address quoteToken) public view returns (bool) { uint256[] memory markets = marketsForQuote[quoteToken]; for(uint256 i = 0; i < markets.length; i++) { if(marketsToAuctioneers[markets[i]] == auctioneer && isLive(markets[i])) { return true; } } return false; } modifier whenNotPaused() { require(!paused, "Contract is paused"); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_mSig","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bool","name":"add","type":"bool"},{"indexed":false,"internalType":"uint256","name":"rate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"target","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buffer","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastBlock","type":"uint256"}],"name":"AdjustmentSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalOwed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bondPrice","type":"uint256"}],"name":"BondDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"BondEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"ContractPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"ContractUnpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"basePoints","type":"uint256"}],"name":"FeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"newAuctioneer","type":"address"}],"name":"MarketTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":true,"internalType":"address","name":"auctioneer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"daoFee","type":"uint256"}],"name":"QuoteTokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"}],"name":"TokenUnwhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"}],"name":"TokenWhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_auctioneer","type":"address"},{"indexed":false,"internalType":"address","name":"payoutToken","type":"address"}],"name":"addedAuctioneer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"payoutToken","type":"address"},{"indexed":true,"internalType":"address","name":"quoteToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"initialPrice","type":"uint256"}],"name":"newBondCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"auctioneer","type":"address"}],"name":"removeAuctioneer","type":"event"},{"inputs":[],"name":"AUCTIONEER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMERGENCY_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_WHITELISTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_payoutTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"adjustments","outputs":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"buffer","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"auctioneer","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"}],"name":"auctioneerHasMarketForQuote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"bondInfo","outputs":[{"internalType":"address","name":"tokenBonded","type":"address"},{"internalType":"uint256","name":"amountOwed","type":"uint256"},{"internalType":"uint256","name":"initialAmount","type":"uint256"},{"internalType":"uint256","name":"pricePaid","type":"uint256"},{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint32","name":"startTime","type":"uint32"},{"internalType":"uint32","name":"endTime","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"bondPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"_bondId","type":"uint256"}],"name":"calculateLinearPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"closeBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"currentMaxPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeToDao","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"}],"name":"getBondMarketInfo","outputs":[{"components":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"address","name":"payoutToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"},{"internalType":"uint256","name":"amountToBond","type":"uint256"},{"internalType":"address","name":"auctioneer","type":"address"},{"internalType":"bool","name":"isLive","type":"bool"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"bondEnds","type":"uint256"}],"internalType":"struct BondDepository.BondMarketInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"marketIds","type":"uint256[]"}],"name":"getBondMarketInfoBatch","outputs":[{"components":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"address","name":"payoutToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"},{"internalType":"uint256","name":"amountToBond","type":"uint256"},{"internalType":"address","name":"auctioneer","type":"address"},{"internalType":"bool","name":"isLive","type":"bool"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"bondEnds","type":"uint256"}],"internalType":"struct BondDepository.BondMarketInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"payout","type":"address"}],"name":"getMarketsForPayout","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"quoteToken","type":"address"}],"name":"getMarketsForQuote","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getMarketsForUser","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMembers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_auctioneer","type":"address"}],"name":"grantAuctioneerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAuctioneer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"isLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"_bondId","type":"uint256"}],"name":"isMature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mSig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketsForPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketsForQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketsToAuctioneers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"payoutToken_","type":"address"},{"internalType":"contract IERC20","name":"_quoteToken","type":"address"},{"internalType":"uint256[4]","name":"_terms","type":"uint256[4]"},{"internalType":"uint32[2]","name":"_vestingTerms","type":"uint32[2]"}],"name":"newBond","outputs":[{"internalType":"uint256","name":"marketID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"_bondId","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"amountRedeemed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_auctioneer","type":"address"}],"name":"revokeAuctioneerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"bool","name":"_add","type":"bool"},{"internalType":"uint256","name":"_rate","type":"uint256"},{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint256","name":"_buffer","type":"uint256"}],"name":"setAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"basePoints","type":"uint32"}],"name":"setFeetoDao","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"terms","outputs":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"address","name":"payoutToken","type":"address"},{"internalType":"uint256","name":"amountToBond","type":"uint256"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"},{"internalType":"uint256","name":"maxDebt","type":"uint256"},{"internalType":"uint256","name":"quoteTokensRaised","type":"uint256"},{"internalType":"uint256","name":"lastDecay","type":"uint256"},{"internalType":"uint32","name":"bondEnds","type":"uint32"},{"internalType":"uint32","name":"vestingTerm","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"address","name":"newAuctioneer","type":"address"}],"name":"transferMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"unwhitelistToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"whitelistToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"withdrawQuoteTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405234801561000f575f5ffd5b5060405161476c38038061476c83398101604081905261002e91610237565b60016002556001600160a01b03811661007f5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640160405180910390fd5b6001600160a01b0381166080819052610099905f90610106565b506100cc7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a6360805161010660201b60201c565b506100ff7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e60805161010660201b60201c565b505061025d565b5f80610112848461013c565b90508015610133575f84815260016020526040902061013190846101e3565b505b90505b92915050565b5f828152602081815260408083206001600160a01b038516845290915281205460ff166101dc575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556101943390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610136565b505f610136565b5f610133836001600160a01b0384165f8181526001830160205260408120546101dc57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610136565b5f60208284031215610247575f5ffd5b81516001600160a01b0381168114610133575f5ffd5b6080516144f061027c5f395f818161083c015261236c01526144f05ff3fe608060405234801561000f575f5ffd5b50600436106102ff575f3560e01c80639b299d9a11610195578063c8558f1b116100e4578063d547741f1161009e578063ddb2924711610079578063ddb29247146107fc578063ea5e0c601461080f578063ed421a9c14610837578063f9a646641461085e575f5ffd5b8063d547741f146107cd578063d627d25e146107e0578063d918a16e146107f3575f5ffd5b8063c8558f1b1461075a578063ca15c8731461076d578063cfe9232b14610780578063d04cffeb14610794578063d1af1fbc146107a7578063d382fe92146107ba575f5ffd5b8063b33712c51161014f578063be32ee261161012a578063be32ee26146106a7578063c0680e20146106ba578063c0aa0e8a146106cd578063c5f0d05c14610747575f5ffd5b8063b33712c51461062c578063bc063e1a14610634578063bc3b2b121461063d575f5ffd5b80639b299d9a146105b95780639cc84589146105cc5780639cd85b5b146105df578063a217fddf146105f2578063a3246ad3146105f9578063b2f5de9414610619575f5ffd5b8063439766ce116102515780637bde82f21161020b5780639010d07c116101e65780639010d07c14610541578063909b2bb81461056c57806391d148541461059357806391de4d07146105a6575f5ffd5b80637bde82f2146104c05780638ad59c70146104d35780638dbdbe6d1461052e575f5ffd5b8063439766ce1461044b5780635c975abb146104535780636247f6f2146104605780636e76fc8f14610473578063725dafe01461049a5780637b30564e146104ad575f5ffd5b8063172c44ec116102bc578063248a9ca311610297578063248a9ca3146103f057806327507458146104125780632f2ff15d1461042557806336568abe14610438575f5ffd5b8063172c44ec146103c15780631b014e85146103d457806324760807146103e7575f5ffd5b806301ffc9a71461030357806306b40ea31461032b5780630868335e1461034c5780630fb81eb41461036c5780631227b40214610381578063154347b5146103a1575b5f5ffd5b610316610311366004613d6a565b610871565b60405190151581526020015b60405180910390f35b61033e610339366004613da5565b61089b565b604051908152602001610322565b61035f61035a366004613dcf565b6108c6565b6040516103229190613ed6565b61037f61037a366004613f19565b610976565b005b61039461038f366004613f19565b610b0b565b6040516103229190613f30565b6103b46103af366004613f3f565b610bf7565b6040516103229190613f5a565b61033e6103cf366004613f19565b610c60565b6103b46103e2366004613f3f565b610c6a565b61033e60045481565b61033e6103fe366004613f19565b5f9081526020819052604090206001015490565b610316610420366004613f19565b610cd1565b61037f610433366004613f91565b610d55565b61037f610446366004613f91565b610d7f565b61037f610db7565b6003546103169060ff1681565b61037f61046e366004613f3f565b610e1b565b61033e7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a6381565b61037f6104a8366004613f91565b611001565b6103166104bb366004613da5565b611120565b61033e6104ce366004613f91565b6111ce565b6104e66104e1366004613da5565b611609565b604080516001600160a01b0390981688526020880196909652948601939093526060850191909152608084015263ffffffff90811660a08401521660c082015260e001610322565b61037f61053c366004613fbf565b611674565b61055461054f366004613ff5565b611d09565b6040516001600160a01b039091168152602001610322565b61033e7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e81565b6103166105a1366004613f91565b611d27565b6103166105b4366004614015565b611d4f565b61037f6105c7366004613f3f565b611e4b565b61037f6105da366004614041565b611f7d565b6103166105ed366004613f3f565b61217a565b61033e5f81565b61060c610607366004613f19565b612192565b6040516103229190614089565b61037f610627366004613f19565b6121ab565b61037f6123d5565b61033e6103e881565b61067d61064b366004613f19565b60076020525f90815260409020805460018201546002830154600384015460049094015460ff90931693919290919085565b6040805195151586526020860194909452928401919091526060830152608082015260a001610322565b61037f6106b5366004613f3f565b612436565b61033e6106c8366004613da5565b6124b3565b6106e06106db366004613f19565b6124cc565b604080516001600160a01b039c8d1681529b909a1660208c0152988a01979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015263ffffffff9081166101208401521661014082015261016001610322565b61037f6107553660046140e1565b61254c565b61033e610768366004613da5565b6125ed565b61033e61077b366004613f19565b61272c565b61033e5f51602061449b5f395f51905f5281565b6103b46107a2366004613f3f565b612742565b6105546107b5366004613f19565b612828565b61033e6107c8366004613f19565b612850565b61037f6107db366004613f91565b61293a565b61037f6107ee366004613f3f565b61295e565b61033e600e5481565b61033e61080a366004614196565b612a37565b61055461081d366004613f19565b600a6020525f90815260409020546001600160a01b031681565b6105547f000000000000000000000000000000000000000000000000000000000000000081565b61033e61086c366004613da5565b6131ad565b5f6001600160e01b03198216635a05180f60e01b14806108955750610895826131b8565b92915050565b600c602052815f5260405f2081815481106108b4575f80fd5b905f5260205f20015f91509150505481565b60605f8267ffffffffffffffff8111156108e2576108e26140fa565b60405190808252806020026020018201604052801561091b57816020015b610908613c9a565b8152602001906001900390816109005790505b5090505f5b8381101561096e5761094985858381811061093d5761093d614229565b90506020020135610b0b565b82828151811061095b5761095b614229565b6020908102919091010152600101610920565b509392505050565b5f51602061449b5f395f51905f5261098d816131ec565b60035460ff16156109b95760405162461bcd60e51b81526004016109b09061423d565b60405180910390fd5b5f828152600a60205260409020546001600160a01b03163314610a0e5760405162461bcd60e51b815260206004820152600d60248201526c139bdd081e5bdd5c88109bdb99609a1b60448201526064016109b0565b4260068381548110610a2257610a22614229565b905f5260205f2090600a02016009015f6101000a81548163ffffffff021916908363ffffffff1602179055505f60068381548110610a6257610a62614229565b905f5260205f2090600a02016003015460068481548110610a8557610a85614229565b905f5260205f2090600a020160020154610a9f919061427d565b9050610adc338260068681548110610ab957610ab9614229565b5f91825260209091206001600a9092020101546001600160a01b031691906131f9565b60405183907fc22a1d700260b389bc0ce34ad5cd517ce48733d9f3bf0f188725711b0f53940c905f90a2505050565b610b13613c9a565b5f60068381548110610b2757610b27614229565b5f9182526020918290206040805161014081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352919250908101610b6f85613258565b8152602001610b7d85612850565b81526009830154600160201b900463ffffffff1660208083019190915260028401546040808401919091525f878152600a9092529020546001600160a01b03166060820152608001610bce85610cd1565b151581526003830154602082015260099092015463ffffffff1660409092019190915292915050565b6001600160a01b0381165f908152600b6020908152604091829020805483518184028101840190945280845260609392830182828015610c5457602002820191905f5260205f20905b815481526020019060010190808311610c40575b50505050509050919050565b5f61089582613258565b6001600160a01b0381165f908152600c6020908152604091829020805483518184028101840190945280845260609392830182828015610c5457602002820191905f5260205f2090815481526020019060010190808311610c405750505050509050919050565b5f60068281548110610ce557610ce5614229565b5f91825260209091206009600a90920201015463ffffffff164211801590610895575060068281548110610d1b57610d1b614229565b905f5260205f2090600a02016006015460068381548110610d3e57610d3e614229565b905f5260205f2090600a0201600301541092915050565b5f82815260208190526040902060010154610d6f816131ec565b610d798383613262565b50505050565b6001600160a01b0381163314610da85760405163334bd91960e11b815260040160405180910390fd5b610db2828261328d565b505050565b7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a63610de1816131ec565b6003805460ff1916600117905560405133907f81990fd9a5c552b8e3677917d8a03c07678f0d2cb68f88b634aca2022e9bd19f905f90a250565b7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e610e45816131ec565b6001600160a01b038216610e935760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b60448201526064016109b0565b6001600160a01b0382165f9081526009602052604090205460ff1615610efb5760405162461bcd60e51b815260206004820152601960248201527f546f6b656e20616c72656164792077686974656c69737465640000000000000060448201526064016109b0565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610f55575060408051601f3d908101601f19168201909252610f5291810190614290565b60015b610f975760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21022a9219918103a37b5b2b760691b60448201526064016109b0565b506001600160a01b0382165f818152600960205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191690911790555b5050565b5f828152600a60205260409020546001600160a01b031633146110595760405162461bcd60e51b815260206004820152601060248201526f2737ba1036b0b935b2ba1037bbb732b960811b60448201526064016109b0565b6110705f51602061449b5f395f51905f5282611d27565b6110ad5760405162461bcd60e51b815260206004820152600e60248201526d2737ba1030bab1ba34b7b732b2b960911b60448201526064016109b0565b5f828152600a602090815260409182902080546001600160a01b0319166001600160a01b03851690811790915582518581523392810192909252918101919091527f2ce31ebb7c731534ab7267f7655a662e4a2bce5ffbf2c5ac9c197c0f5c554e79906060015b60405180910390a15050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061114c5761114c614229565b5f9182526020918290206040805160e081018252600690930290910180546001600160a01b03168352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015463ffffffff80821660a0840152600160201b9091041660c090910181905242101591505092915050565b5f6111d76132b8565b6001600160a01b0382165f908152600d602052604081205490808267ffffffffffffffff81111561120a5761120a6140fa565b604051908082528060200260200182016040528015611233578160200160208202803683370190505b5090505f805b84811015611351576001600160a01b0387165f908152600d6020526040812080548390811061126a5761126a614229565b905f5260205f209060060201905088816004015403611348575f61128e89846125ed565b90508015611346576001600160a01b0389165f908152600d602052604090208054829190859081106112c2576112c2614229565b905f5260205f2090600602016001015f8282546112df919061427d565b909155506112ef905081876142b0565b9550611309898260068d81548110610ab957610ab9614229565b81600101545f0361134657600185848151811061132857611328614229565b9115156020928302919091019091015283611342816142c3565b9450505b505b50600101611239565b5080156115f9575f611363828661427d565b67ffffffffffffffff81111561137b5761137b6140fa565b6040519080825280602002602001820160405280156113fa57816020015b6113e76040518060e001604052805f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f63ffffffff1681526020015f63ffffffff1681525090565b8152602001906001900390816113995790505b5090505f805b868110156114f85784818151811061141a5761141a614229565b60200260200101516114f0576001600160a01b0389165f908152600d6020526040902080548290811061144f5761144f614229565b5f9182526020918290206040805160e081018252600690930290910180546001600160a01b03168352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015463ffffffff80821660a0840152600160201b9091041660c082015283518490849081106114d6576114d6614229565b602002602001018190525081806114ec906142c3565b9250505b600101611400565b506001600160a01b0388165f908152600d6020526040812061151991613d00565b5f5b82518110156115f5576001600160a01b0389165f908152600d60205260409020835184908390811061154f5761154f614229565b6020908102919091018101518254600181810185555f94855293839020825160069092020180546001600160a01b039092166001600160a01b0319909216919091178155918101518284015560408101516002830155606081015160038301556080810151600483015560a08101516005909201805460c09092015163ffffffff908116600160201b0267ffffffffffffffff199093169316929092171790550161151b565b5050505b5090925050506108956001600255565b600d602052815f5260405f208181548110611622575f80fd5b5f9182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b03909416965091945092909163ffffffff80821691600160201b90041687565b61167c6132b8565b6001600160a01b0381166116c95760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642075736572206164647265737360601b60448201526064016109b0565b600654831061170e5760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081b585c9ad95d081251607a1b60448201526064016109b0565b5f6006848154811061172257611722614229565b5f9182526020909120600a90910201600981015490915063ffffffff1642111561177f5760405162461bcd60e51b815260206004820152600e60248201526d109bdb99081a185cc8195b99195960921b60448201526064016109b0565b80600601548160030154106117d65760405162461bcd60e51b815260206004820152601d60248201527f4d6178696d756d20626f6e64206361706163697479207265616368656400000060448201526064016109b0565b80546040805163313ce56760e01b815290515f926001600160a01b03169163313ce5679160048083019260209291908290030181865afa15801561181c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118409190614290565b90505f61184c8261330f565b90508085101561189e5760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742062656c6f77206d696e696d756d207468726573686f6c640060448201526064016109b0565b6118a78661333a565b6118b08661347c565b5f6118ba8761353d565b90505f6118c88460126142db565b6118d390600a6143d7565b6118dd90836143e5565b6118ef88670de0b6b3a7640000614404565b6118f991906143e5565b90505f61271086600301548760060154611913919061427d565b61191f90610708614404565b61192991906143e5565b90508082111561197b5760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742065786365656473206d6178696d756d20616c6c6f7765640060448201526064016109b0565b856006015482876003015461199091906142b0565b11156119de5760405162461bcd60e51b815260206004820152601960248201527f45786365656473206d6178696d756d20626f6e6420646562740000000000000060448201526064016109b0565b85546040516370a0823160e01b81523060048201526001600160a01b03909116905f9082906370a0823190602401602060405180830381865afa158015611a27573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a4b919061441b565b9050611a626001600160a01b03831633308d6136f7565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015611aa6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aca919061441b565b90508a611ad7838361427d565b14611b245760405162461bcd60e51b815260206004820152601960248201527f496e636f7272656374207472616e7366657220616d6f756e740000000000000060448201526064016109b0565b8a60068d81548110611b3857611b38614229565b905f5260205f2090600a02016007015f828254611b5591906142b0565b925050819055508460068d81548110611b7057611b70614229565b905f5260205f2090600a02016003015f828254611b8d91906142b0565b90915550506001600160a01b03808b165f908152600d6020908152604091829020825160e08101845260018e0154909416845290830188905290820187905260608201889052608082018e905263ffffffff4281811660a085015260098d015492939260c0840192611c079291600160201b9004166142b0565b63ffffffff9081169091528254600181810185555f948552602094859020845160069093020180546001600160a01b039384166001600160a01b031990911617815594840151908501556040808401516002860155606084015160038601556080840151600486015560a08401516005909501805460c0909501518416600160201b0267ffffffffffffffff19909516959093169490941792909217905590518d918c16907f105066e10d7040f371761942e4dcb5b97c51daf3acfe0295b7d4c42d32af86f290611cee908f908a908c909283526020830191909152604082015260600190565b60405180910390a3505050505050505050610db26001600255565b5f828152600160205260408120611d209083613730565b9392505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b0381165f908152600b6020908152604080832080548251818502810185019093528083528493830182828015611da957602002820191905f5260205f20905b815481526020019060010190808311611d95575b509394505f93505050505b8151811015611e4157846001600160a01b0316600a5f848481518110611ddc57611ddc614229565b60209081029190910181015182528101919091526040015f20546001600160a01b0316148015611e295750611e29828281518110611e1c57611e1c614229565b6020026020010151610cd1565b15611e3957600192505050610895565b600101611db4565b505f949350505050565b5f611e55816131ec565b6001600160a01b038216611eab5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c69642061756374696f6e656572206164647265737300000000000060448201526064016109b0565b611ec25f51602061449b5f395f51905f5283611d27565b15611f075760405162461bcd60e51b815260206004820152601560248201527420b63932b0b23c9030b71030bab1ba34b7b732b2b960591b60448201526064016109b0565b611f1e5f51602061449b5f395f51905f5283613262565b506001600160a01b0382165f81815260086020526040808220805460ff19166001179055513392915f51602061449b5f395f51905f52917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f51602061449b5f395f51905f52611f94816131ec565b60035460ff1615611fb75760405162461bcd60e51b81526004016109b09061423d565b5f868152600a60205260409020546001600160a01b031633146120165760405162461bcd60e51b81526020600482015260176024820152762737ba1036b0b935b2ba13b99030bab1ba34b7b732b2b960491b60448201526064016109b0565b5f831161205d5760405162461bcd60e51b81526020600482015260156024820152745461726765742063616e6e6f74206265207a65726f60581b60448201526064016109b0565b5f84116120a25760405162461bcd60e51b8152602060048201526013602482015272526174652063616e6e6f74206265207a65726f60681b60448201526064016109b0565b6040805160a081018252861515815260208082018781528284018781526060840187815263ffffffff42908116608087019081525f8e81526007909652948790209551865490151560ff1990911617865592516001860155905160028501555160038401559051600490920191909155905187917fca26b9928ef624ce9b23cfafc5e93180097417a4faaac312cc856e8d83f5ba4a9161216a918991899189918991909415158552602085019390935260408401919091526060830152608082015260a00190565b60405180910390a2505050505050565b5f6108955f51602061449b5f395f51905f5283611d27565b5f8181526001602052604090206060906108959061373b565b5f51602061449b5f395f51905f526121c2816131ec565b60035460ff16156121e55760405162461bcd60e51b81526004016109b09061423d565b5f828152600a60205260409020546001600160a01b031633146122445760405162461bcd60e51b81526020600482015260176024820152762737ba1036b0b935b2ba13b99030bab1ba34b7b732b2b960491b60448201526064016109b0565b6006828154811061225757612257614229565b5f91825260209091206009600a90920201015463ffffffff1642116122b75760405162461bcd60e51b8152602060048201526016602482015275109bdb99081b9bdd081e595d0818dbdb98db1d59195960521b60448201526064016109b0565b5f600683815481106122cb576122cb614229565b5f91825260208220600a9091020154600680546001600160a01b03909216935090859081106122fc576122fc614229565b5f918252602082206007600a909202010154600e549092501561234357612710600e548361232a9190614404565b61233491906143e5565b9050612340818361427d565b91505b6123576001600160a01b03841633846131f9565b8015612391576123916001600160a01b0384167f0000000000000000000000000000000000000000000000000000000000000000836131f9565b6040805183815260208101839052339187917f6cdd4eeaadbfd702bff31856ddd6a8ac93f3e7683aed304c11ac132081146a1f910160405180910390a35050505050565b7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a636123ff816131ec565b6003805460ff1916905560405133907f5b65b0c1363b3003db9bcc5e1fd8805a6d6bf5bf6dc9d3431ee4494cd7d11766905f90a250565b5f612440816131ec565b6124575f51602061449b5f395f51905f528361328d565b506001600160a01b0382165f81815260086020526040808220805460ff19169055513392915f51602061449b5f395f51905f52917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600b602052815f5260405f2081815481106108b4575f80fd5b600681815481106124db575f80fd5b5f9182526020909120600a909102018054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b039889169a50979096169794969395929491939092919063ffffffff80821691600160201b9004168b565b5f612556816131ec565b6103e88263ffffffff16111561259d5760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b60448201526064016109b0565b600e805463ffffffff84169182905560408051828152602081019390935290917f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df61302910160405180910390a1505050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061261957612619614229565b5f9182526020918290206040805160e081018252600690930290910180546001600160a01b03168352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015463ffffffff80821660a08401819052600160201b9092041660c08301529091504210156126a1575f915050610895565b5f8160a001518260c001516126b69190614432565b63ffffffff1690505f8260c0015163ffffffff1642116126ea5760a08301516126e59063ffffffff164261427d565b6126ec565b815b90505f8284604001516126ff91906143e5565b90505f61270c8383614404565b90508460200151811115612721575060208401515b979650505050505050565b5f81815260016020526040812061089590613747565b6001600160a01b0381165f908152600d60205260408120546060919067ffffffffffffffff811115612776576127766140fa565b60405190808252806020026020018201604052801561279f578160200160208202803683370190505b5090505f5b6001600160a01b0384165f908152600d6020526040902054811015612821576001600160a01b0384165f908152600d602052604090208054829081106127ec576127ec614229565b905f5260205f2090600602016004015482828151811061280e5761280e614229565b60209081029190910101526001016127a4565b5092915050565b60058181548110612837575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f5f6006838154811061286557612865614229565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b0390811685526001820154169284019290925260028201549083015260038101546060830181905260048201546080840152600582015460a0840152600682015460c08401819052600783015460e0850152600883015461010085015260099092015463ffffffff808216610120860152600160201b90910416610140840152919350612917919061427d565b905061271061292882610708614404565b61293291906143e5565b949350505050565b5f82815260208190526040902060010154612954816131ec565b610d79838361328d565b7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e612988816131ec565b6001600160a01b0382165f9081526009602052604090205460ff166129e75760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b60448201526064016109b0565b6001600160a01b0382165f81815260096020908152604091829020805460ff1916905590519182527f108cc7e243d7eb6c2052789466e0961bb24cd62395e2c99e704001b48107a0619101611114565b5f5f51602061449b5f395f51905f52612a4f816131ec565b60035460ff1615612a725760405162461bcd60e51b81526004016109b09061423d565b6001600160a01b038616612abf5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b2103830bcb7baba103a37b5b2b760611b60448201526064016109b0565b6001600160a01b038516612b0b5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21038bab7ba32903a37b5b2b760691b60448201526064016109b0565b856001600160a01b0316856001600160a01b031603612b6c5760405162461bcd60e51b815260206004820152601860248201527f546f6b656e73206d75737420626520646966666572656e74000000000000000060448201526064016109b0565b6001600160a01b0386165f9081526009602052604090205460ff16612bcb5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b60448201526064016109b0565b612bd53386611d4f565b15612c2d5760405162461bcd60e51b815260206004820152602260248201527f416c726561647920686173206d61726b657420666f722071756f746520746f6b60448201526132b760f11b60648201526084016109b0565b82514263ffffffff90911611612c7a5760405162461bcd60e51b8152602060048201526012602482015271426f6e6420656e6420746f6f206561726c7960701b60448201526064016109b0565b8351612cbd5760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b60448201526064016109b0565b6020840151612d0e5760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726f6c207661726961626c65206d757374206265203e20300000000060448201526064016109b0565b6040840151612d5f5760405162461bcd60e51b815260206004820152601960248201527f4d696e696d756d207072696365206d757374206265203e20300000000000000060448201526064016109b0565b6060840151612da75760405162461bcd60e51b815260206004820152601460248201527304d61782064656274206d757374206265203e20360641b60448201526064016109b0565b82515f90612dbc90429063ffffffff1661427d565b90505f8111612e065760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d995cdd1a5b99c81c195c9a5bd960521b60448201526064016109b0565b5f876001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e43573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e679190614290565b9050612e973330612e7984600a6143d7565b8951612e859190614404565b6001600160a01b038c169291906136f7565b60408051610160810182526001600160a01b03808a1682528a1660208201526006918101612ec684600a6143d7565b8951612ed29190614404565b81525f6020808301919091528901516040808301919091528901516060820152608001612f0084600a6143d7565b60608a0151612f0f9190614404565b81526020015f8152602001428152602001875f60028110612f3257612f32614229565b602002015163ffffffff16815260200187600160028110612f5557612f55614229565b602002015163ffffffff16815250908060018154018082558091505060019003905f5260205f2090600a02015f909190919091505f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015f6101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160090160046101000a81548163ffffffff021916908363ffffffff16021790555050505f6004549050600c5f8a6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600b5f896001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f909190919091505533600a5f8381526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060045f815461314e906142c3565b909155506001600160a01b03808916908a16827fe2cf7d92fe44fee405e71ceedac936dbc3b0d18e7d9582e31f2f2a2a3db75c978a6001602002015160405161319991815260200190565b60405180910390a498975050505050505050565b5f611d2083836125ed565b5f6001600160e01b03198216637965db0b60e01b148061089557506301ffc9a760e01b6001600160e01b0319831614610895565b6131f68133613750565b50565b6040516001600160a01b03838116602483015260448201839052610db291859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613789565b5f6108958261353d565b5f5f61326e84846137f5565b90508015611d20575f84815260016020526040902061096e9084613884565b5f5f6132998484613898565b90508015611d20575f84815260016020526040902061096e9084613901565b60028054036133095760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109b0565b60028055565b5f60028260ff161115613332576133276002836142db565b61089590600a6143d7565b506001919050565b5f818152600760205260409020600381015460049091015461335c91906142b0565b4211156131f6575f6006828154811061337757613377614229565b5f91825260208083208584526007909152604090922054600a909102909101915060ff1615613402575f82815260076020526040812060010154600483018054919290916133c69084906142b0565b90915550505f828152600760205260409020600201546004820154106133fd575f8281526007602052604090206002015460048201555b61345f565b5f828152600760205260408120600101546004830180549192909161342890849061427d565b90915550505f8281526007602052604090206002015460048201541161345f575f8281526007602052604090206002015460048201555b505f9081526007602052604090204263ffffffff16600490910155565b5f6006828154811061349057613490614229565b905f5260205f2090600a020190505f81600301549050805f036134b257505050565b5f8260080154426134c3919061427d565b9050805f036134d25750505050565b60098301545f906134f190600160201b900463ffffffff16606461444e565b63ffffffff166135018385614404565b61350b91906143e5565b90508281116135235761351e818461427d565b613525565b5f5b600385015550505063ffffffff421660089091015550565b5f5f6006838154811061355257613552614229565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116808652600183015490911685850152600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e0870152600883015461010087015260099092015463ffffffff808216610120880152600160201b90910416610140860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa15801561362a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061364e9190614290565b90505f61365a85613915565b90505f6136688360126142db565b61367390601261446d565b61367e90600a6143d7565b9050670de0b6b3a76400006136938284614404565b61369d91906143e5565b94505f85116136ee5760405162461bcd60e51b815260206004820152601860248201527f50726963652063616c63756c6174696f6e206661696c6564000000000000000060448201526064016109b0565b50505050919050565b6040516001600160a01b038481166024830152838116604483015260648201839052610d799186918216906323b872dd90608401613226565b5f611d208383613af5565b60605f611d2083613b1b565b5f610895825490565b61375a8282611d27565b610ffd5760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016109b0565b5f5f60205f8451602086015f885af1806137a8576040513d5f823e3d81fd5b50505f513d915081156137bf5780600114156137cc565b6001600160a01b0384163b155b15610d7957604051635274afe760e01b81526001600160a01b03851660048201526024016109b0565b5f6138008383611d27565b61387d575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556138353390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610895565b505f610895565b5f611d20836001600160a01b038416613b72565b5f6138a38383611d27565b1561387d575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610895565b5f611d20836001600160a01b038416613bb7565b5f5f6006838154811061392a5761392a614229565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116855260018083015490911685850152600280830154868501526003808401546060808901919091526004808601546080808b01918252600588015460a0808d0191909152600689015460c08d01526007808a015460e08e015260088a01546101008e015260099099015463ffffffff8082166101208f0152600160201b909104166101408d01528f8d52978a529a88902088519788018952805460ff1615158852958601549887018990529385015496860196909652908301549084015292015494810194909452519193501580613a29575080155b15613a3657949350505050565b5f826080015142613a47919061427d565b90505f836060015182613a5a91906143e5565b90508015613aea575f818560200151613a739190614404565b855190915015613aaf576040850151613a8c82866142b0565b1115613a9e5784604001519350613ae8565b613aa881856142b0565b9350613ae8565b8381101580613aca57506040850151613ac8828661427d565b105b15613adb5784604001519350613ae8565b613ae5818561427d565b93505b505b509095945050505050565b5f825f018281548110613b0a57613b0a614229565b905f5260205f200154905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610c5457602002820191905f5260205f2090815481526020019060010190808311610c405750505050509050919050565b5f81815260018301602052604081205461387d57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610895565b5f8181526001830160205260408120548015613c91575f613bd960018361427d565b85549091505f90613bec9060019061427d565b9050808214613c4b575f865f018281548110613c0a57613c0a614229565b905f5260205f200154905080875f018481548110613c2a57613c2a614229565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080613c5c57613c5c614486565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610895565b5f915050610895565b6040518061014001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f151581526020015f81526020015f81525090565b5080545f8255600602905f5260205f20908101906131f691905b80821115613d665780546001600160a01b03191681555f600182018190556002820181905560038201819055600482015560058101805467ffffffffffffffff19169055600601613d1a565b5090565b5f60208284031215613d7a575f5ffd5b81356001600160e01b031981168114611d20575f5ffd5b6001600160a01b03811681146131f6575f5ffd5b5f5f60408385031215613db6575f5ffd5b8235613dc181613d91565b946020939093013593505050565b5f5f60208385031215613de0575f5ffd5b823567ffffffffffffffff811115613df6575f5ffd5b8301601f81018513613e06575f5ffd5b803567ffffffffffffffff811115613e1c575f5ffd5b8560208260051b8401011115613e30575f5ffd5b6020919091019590945092505050565b80516001600160a01b031682526020810151613e6760208401826001600160a01b03169052565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c0810151613eaa60c08401826001600160a01b03169052565b5060e0810151613ebe60e084018215159052565b50610100818101519083015261012090810151910152565b602080825282518282018190525f918401906040840190835b81811015613aea57613f02838551613e40565b602093909301926101409290920191600101613eef565b5f60208284031215613f29575f5ffd5b5035919050565b61014081016108958284613e40565b5f60208284031215613f4f575f5ffd5b8135611d2081613d91565b602080825282518282018190525f918401906040840190835b81811015613aea578351835260209384019390920191600101613f73565b5f5f60408385031215613fa2575f5ffd5b823591506020830135613fb481613d91565b809150509250929050565b5f5f5f60608486031215613fd1575f5ffd5b83359250602084013591506040840135613fea81613d91565b809150509250925092565b5f5f60408385031215614006575f5ffd5b50508035926020909101359150565b5f5f60408385031215614026575f5ffd5b823561403181613d91565b91506020830135613fb481613d91565b5f5f5f5f5f60a08688031215614055575f5ffd5b853594506020860135801515811461406b575f5ffd5b94979496505050506040830135926060810135926080909101359150565b602080825282518282018190525f918401906040840190835b81811015613aea5783516001600160a01b03168352602093840193909201916001016140a2565b803563ffffffff811681146140dc575f5ffd5b919050565b5f602082840312156140f1575f5ffd5b611d20826140c9565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561414357634e487b7160e01b5f52604160045260245ffd5b604052919050565b5f82601f83011261415a575f5ffd5b614164604061410e565b806040840185811115614175575f5ffd5b845b81811015613aea57614188816140c9565b845260209384019301614177565b5f5f5f5f61010085870312156141aa575f5ffd5b84356141b581613d91565b935060208501356141c581613d91565b9250605f850186136141d5575f5ffd5b6141df608061410e565b8060c08701888111156141f0575f5ffd5b604088015b8181101561420d5780358452602093840193016141f5565b5081945061421b898261414b565b935050505092959194509250565b634e487b7160e01b5f52603260045260245ffd5b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561089557610895614269565b5f602082840312156142a0575f5ffd5b815160ff81168114611d20575f5ffd5b8082018082111561089557610895614269565b5f600182016142d4576142d4614269565b5060010190565b60ff828116828216039081111561089557610895614269565b6001815b600184111561432f5780850481111561431357614313614269565b600184161561432157908102905b60019390931c9280026142f8565b935093915050565b5f8261434557506001610895565b8161435157505f610895565b816001811461436757600281146143715761438d565b6001915050610895565b60ff84111561438257614382614269565b50506001821b610895565b5060208310610133831016604e8410600b84101617156143b0575081810a610895565b6143bc5f1984846142f4565b805f19048211156143cf576143cf614269565b029392505050565b5f611d2060ff841683614337565b5f826143ff57634e487b7160e01b5f52601260045260245ffd5b500490565b808202811582820484141761089557610895614269565b5f6020828403121561442b575f5ffd5b5051919050565b63ffffffff828116828216039081111561089557610895614269565b63ffffffff818116838216029081169081811461282157612821614269565b60ff818116838216019081111561089557610895614269565b634e487b7160e01b5f52603160045260245ffdfec1df76f4e50bdb95676f782d4b88b23904c5346d8bc7c986ae26f7e10e601891a2646970667358221220b0f928d8841dbc0a8450c59e6aefb322928dddab57f8f749de1ee2e8e5d1d0f264736f6c634300081b00330000000000000000000000005b14cc6b2a36a7c36de709775252855d0563e0a5
Deployed Bytecode
0x608060405234801561000f575f5ffd5b50600436106102ff575f3560e01c80639b299d9a11610195578063c8558f1b116100e4578063d547741f1161009e578063ddb2924711610079578063ddb29247146107fc578063ea5e0c601461080f578063ed421a9c14610837578063f9a646641461085e575f5ffd5b8063d547741f146107cd578063d627d25e146107e0578063d918a16e146107f3575f5ffd5b8063c8558f1b1461075a578063ca15c8731461076d578063cfe9232b14610780578063d04cffeb14610794578063d1af1fbc146107a7578063d382fe92146107ba575f5ffd5b8063b33712c51161014f578063be32ee261161012a578063be32ee26146106a7578063c0680e20146106ba578063c0aa0e8a146106cd578063c5f0d05c14610747575f5ffd5b8063b33712c51461062c578063bc063e1a14610634578063bc3b2b121461063d575f5ffd5b80639b299d9a146105b95780639cc84589146105cc5780639cd85b5b146105df578063a217fddf146105f2578063a3246ad3146105f9578063b2f5de9414610619575f5ffd5b8063439766ce116102515780637bde82f21161020b5780639010d07c116101e65780639010d07c14610541578063909b2bb81461056c57806391d148541461059357806391de4d07146105a6575f5ffd5b80637bde82f2146104c05780638ad59c70146104d35780638dbdbe6d1461052e575f5ffd5b8063439766ce1461044b5780635c975abb146104535780636247f6f2146104605780636e76fc8f14610473578063725dafe01461049a5780637b30564e146104ad575f5ffd5b8063172c44ec116102bc578063248a9ca311610297578063248a9ca3146103f057806327507458146104125780632f2ff15d1461042557806336568abe14610438575f5ffd5b8063172c44ec146103c15780631b014e85146103d457806324760807146103e7575f5ffd5b806301ffc9a71461030357806306b40ea31461032b5780630868335e1461034c5780630fb81eb41461036c5780631227b40214610381578063154347b5146103a1575b5f5ffd5b610316610311366004613d6a565b610871565b60405190151581526020015b60405180910390f35b61033e610339366004613da5565b61089b565b604051908152602001610322565b61035f61035a366004613dcf565b6108c6565b6040516103229190613ed6565b61037f61037a366004613f19565b610976565b005b61039461038f366004613f19565b610b0b565b6040516103229190613f30565b6103b46103af366004613f3f565b610bf7565b6040516103229190613f5a565b61033e6103cf366004613f19565b610c60565b6103b46103e2366004613f3f565b610c6a565b61033e60045481565b61033e6103fe366004613f19565b5f9081526020819052604090206001015490565b610316610420366004613f19565b610cd1565b61037f610433366004613f91565b610d55565b61037f610446366004613f91565b610d7f565b61037f610db7565b6003546103169060ff1681565b61037f61046e366004613f3f565b610e1b565b61033e7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a6381565b61037f6104a8366004613f91565b611001565b6103166104bb366004613da5565b611120565b61033e6104ce366004613f91565b6111ce565b6104e66104e1366004613da5565b611609565b604080516001600160a01b0390981688526020880196909652948601939093526060850191909152608084015263ffffffff90811660a08401521660c082015260e001610322565b61037f61053c366004613fbf565b611674565b61055461054f366004613ff5565b611d09565b6040516001600160a01b039091168152602001610322565b61033e7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e81565b6103166105a1366004613f91565b611d27565b6103166105b4366004614015565b611d4f565b61037f6105c7366004613f3f565b611e4b565b61037f6105da366004614041565b611f7d565b6103166105ed366004613f3f565b61217a565b61033e5f81565b61060c610607366004613f19565b612192565b6040516103229190614089565b61037f610627366004613f19565b6121ab565b61037f6123d5565b61033e6103e881565b61067d61064b366004613f19565b60076020525f90815260409020805460018201546002830154600384015460049094015460ff90931693919290919085565b6040805195151586526020860194909452928401919091526060830152608082015260a001610322565b61037f6106b5366004613f3f565b612436565b61033e6106c8366004613da5565b6124b3565b6106e06106db366004613f19565b6124cc565b604080516001600160a01b039c8d1681529b909a1660208c0152988a01979097526060890195909552608088019390935260a087019190915260c086015260e085015261010084015263ffffffff9081166101208401521661014082015261016001610322565b61037f6107553660046140e1565b61254c565b61033e610768366004613da5565b6125ed565b61033e61077b366004613f19565b61272c565b61033e5f51602061449b5f395f51905f5281565b6103b46107a2366004613f3f565b612742565b6105546107b5366004613f19565b612828565b61033e6107c8366004613f19565b612850565b61037f6107db366004613f91565b61293a565b61037f6107ee366004613f3f565b61295e565b61033e600e5481565b61033e61080a366004614196565b612a37565b61055461081d366004613f19565b600a6020525f90815260409020546001600160a01b031681565b6105547f0000000000000000000000005b14cc6b2a36a7c36de709775252855d0563e0a581565b61033e61086c366004613da5565b6131ad565b5f6001600160e01b03198216635a05180f60e01b14806108955750610895826131b8565b92915050565b600c602052815f5260405f2081815481106108b4575f80fd5b905f5260205f20015f91509150505481565b60605f8267ffffffffffffffff8111156108e2576108e26140fa565b60405190808252806020026020018201604052801561091b57816020015b610908613c9a565b8152602001906001900390816109005790505b5090505f5b8381101561096e5761094985858381811061093d5761093d614229565b90506020020135610b0b565b82828151811061095b5761095b614229565b6020908102919091010152600101610920565b509392505050565b5f51602061449b5f395f51905f5261098d816131ec565b60035460ff16156109b95760405162461bcd60e51b81526004016109b09061423d565b60405180910390fd5b5f828152600a60205260409020546001600160a01b03163314610a0e5760405162461bcd60e51b815260206004820152600d60248201526c139bdd081e5bdd5c88109bdb99609a1b60448201526064016109b0565b4260068381548110610a2257610a22614229565b905f5260205f2090600a02016009015f6101000a81548163ffffffff021916908363ffffffff1602179055505f60068381548110610a6257610a62614229565b905f5260205f2090600a02016003015460068481548110610a8557610a85614229565b905f5260205f2090600a020160020154610a9f919061427d565b9050610adc338260068681548110610ab957610ab9614229565b5f91825260209091206001600a9092020101546001600160a01b031691906131f9565b60405183907fc22a1d700260b389bc0ce34ad5cd517ce48733d9f3bf0f188725711b0f53940c905f90a2505050565b610b13613c9a565b5f60068381548110610b2757610b27614229565b5f9182526020918290206040805161014081018252600a90930290910180546001600160a01b03908116845260018201541693830193909352919250908101610b6f85613258565b8152602001610b7d85612850565b81526009830154600160201b900463ffffffff1660208083019190915260028401546040808401919091525f878152600a9092529020546001600160a01b03166060820152608001610bce85610cd1565b151581526003830154602082015260099092015463ffffffff1660409092019190915292915050565b6001600160a01b0381165f908152600b6020908152604091829020805483518184028101840190945280845260609392830182828015610c5457602002820191905f5260205f20905b815481526020019060010190808311610c40575b50505050509050919050565b5f61089582613258565b6001600160a01b0381165f908152600c6020908152604091829020805483518184028101840190945280845260609392830182828015610c5457602002820191905f5260205f2090815481526020019060010190808311610c405750505050509050919050565b5f60068281548110610ce557610ce5614229565b5f91825260209091206009600a90920201015463ffffffff164211801590610895575060068281548110610d1b57610d1b614229565b905f5260205f2090600a02016006015460068381548110610d3e57610d3e614229565b905f5260205f2090600a0201600301541092915050565b5f82815260208190526040902060010154610d6f816131ec565b610d798383613262565b50505050565b6001600160a01b0381163314610da85760405163334bd91960e11b815260040160405180910390fd5b610db2828261328d565b505050565b7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a63610de1816131ec565b6003805460ff1916600117905560405133907f81990fd9a5c552b8e3677917d8a03c07678f0d2cb68f88b634aca2022e9bd19f905f90a250565b7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e610e45816131ec565b6001600160a01b038216610e935760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b60448201526064016109b0565b6001600160a01b0382165f9081526009602052604090205460ff1615610efb5760405162461bcd60e51b815260206004820152601960248201527f546f6b656e20616c72656164792077686974656c69737465640000000000000060448201526064016109b0565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610f55575060408051601f3d908101601f19168201909252610f5291810190614290565b60015b610f975760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21022a9219918103a37b5b2b760691b60448201526064016109b0565b506001600160a01b0382165f818152600960205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191690911790555b5050565b5f828152600a60205260409020546001600160a01b031633146110595760405162461bcd60e51b815260206004820152601060248201526f2737ba1036b0b935b2ba1037bbb732b960811b60448201526064016109b0565b6110705f51602061449b5f395f51905f5282611d27565b6110ad5760405162461bcd60e51b815260206004820152600e60248201526d2737ba1030bab1ba34b7b732b2b960911b60448201526064016109b0565b5f828152600a602090815260409182902080546001600160a01b0319166001600160a01b03851690811790915582518581523392810192909252918101919091527f2ce31ebb7c731534ab7267f7655a662e4a2bce5ffbf2c5ac9c197c0f5c554e79906060015b60405180910390a15050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061114c5761114c614229565b5f9182526020918290206040805160e081018252600690930290910180546001600160a01b03168352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015463ffffffff80821660a0840152600160201b9091041660c090910181905242101591505092915050565b5f6111d76132b8565b6001600160a01b0382165f908152600d602052604081205490808267ffffffffffffffff81111561120a5761120a6140fa565b604051908082528060200260200182016040528015611233578160200160208202803683370190505b5090505f805b84811015611351576001600160a01b0387165f908152600d6020526040812080548390811061126a5761126a614229565b905f5260205f209060060201905088816004015403611348575f61128e89846125ed565b90508015611346576001600160a01b0389165f908152600d602052604090208054829190859081106112c2576112c2614229565b905f5260205f2090600602016001015f8282546112df919061427d565b909155506112ef905081876142b0565b9550611309898260068d81548110610ab957610ab9614229565b81600101545f0361134657600185848151811061132857611328614229565b9115156020928302919091019091015283611342816142c3565b9450505b505b50600101611239565b5080156115f9575f611363828661427d565b67ffffffffffffffff81111561137b5761137b6140fa565b6040519080825280602002602001820160405280156113fa57816020015b6113e76040518060e001604052805f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f63ffffffff1681526020015f63ffffffff1681525090565b8152602001906001900390816113995790505b5090505f805b868110156114f85784818151811061141a5761141a614229565b60200260200101516114f0576001600160a01b0389165f908152600d6020526040902080548290811061144f5761144f614229565b5f9182526020918290206040805160e081018252600690930290910180546001600160a01b03168352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015463ffffffff80821660a0840152600160201b9091041660c082015283518490849081106114d6576114d6614229565b602002602001018190525081806114ec906142c3565b9250505b600101611400565b506001600160a01b0388165f908152600d6020526040812061151991613d00565b5f5b82518110156115f5576001600160a01b0389165f908152600d60205260409020835184908390811061154f5761154f614229565b6020908102919091018101518254600181810185555f94855293839020825160069092020180546001600160a01b039092166001600160a01b0319909216919091178155918101518284015560408101516002830155606081015160038301556080810151600483015560a08101516005909201805460c09092015163ffffffff908116600160201b0267ffffffffffffffff199093169316929092171790550161151b565b5050505b5090925050506108956001600255565b600d602052815f5260405f208181548110611622575f80fd5b5f9182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b03909416965091945092909163ffffffff80821691600160201b90041687565b61167c6132b8565b6001600160a01b0381166116c95760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642075736572206164647265737360601b60448201526064016109b0565b600654831061170e5760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081b585c9ad95d081251607a1b60448201526064016109b0565b5f6006848154811061172257611722614229565b5f9182526020909120600a90910201600981015490915063ffffffff1642111561177f5760405162461bcd60e51b815260206004820152600e60248201526d109bdb99081a185cc8195b99195960921b60448201526064016109b0565b80600601548160030154106117d65760405162461bcd60e51b815260206004820152601d60248201527f4d6178696d756d20626f6e64206361706163697479207265616368656400000060448201526064016109b0565b80546040805163313ce56760e01b815290515f926001600160a01b03169163313ce5679160048083019260209291908290030181865afa15801561181c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118409190614290565b90505f61184c8261330f565b90508085101561189e5760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742062656c6f77206d696e696d756d207468726573686f6c640060448201526064016109b0565b6118a78661333a565b6118b08661347c565b5f6118ba8761353d565b90505f6118c88460126142db565b6118d390600a6143d7565b6118dd90836143e5565b6118ef88670de0b6b3a7640000614404565b6118f991906143e5565b90505f61271086600301548760060154611913919061427d565b61191f90610708614404565b61192991906143e5565b90508082111561197b5760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742065786365656473206d6178696d756d20616c6c6f7765640060448201526064016109b0565b856006015482876003015461199091906142b0565b11156119de5760405162461bcd60e51b815260206004820152601960248201527f45786365656473206d6178696d756d20626f6e6420646562740000000000000060448201526064016109b0565b85546040516370a0823160e01b81523060048201526001600160a01b03909116905f9082906370a0823190602401602060405180830381865afa158015611a27573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a4b919061441b565b9050611a626001600160a01b03831633308d6136f7565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015611aa6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aca919061441b565b90508a611ad7838361427d565b14611b245760405162461bcd60e51b815260206004820152601960248201527f496e636f7272656374207472616e7366657220616d6f756e740000000000000060448201526064016109b0565b8a60068d81548110611b3857611b38614229565b905f5260205f2090600a02016007015f828254611b5591906142b0565b925050819055508460068d81548110611b7057611b70614229565b905f5260205f2090600a02016003015f828254611b8d91906142b0565b90915550506001600160a01b03808b165f908152600d6020908152604091829020825160e08101845260018e0154909416845290830188905290820187905260608201889052608082018e905263ffffffff4281811660a085015260098d015492939260c0840192611c079291600160201b9004166142b0565b63ffffffff9081169091528254600181810185555f948552602094859020845160069093020180546001600160a01b039384166001600160a01b031990911617815594840151908501556040808401516002860155606084015160038601556080840151600486015560a08401516005909501805460c0909501518416600160201b0267ffffffffffffffff19909516959093169490941792909217905590518d918c16907f105066e10d7040f371761942e4dcb5b97c51daf3acfe0295b7d4c42d32af86f290611cee908f908a908c909283526020830191909152604082015260600190565b60405180910390a3505050505050505050610db26001600255565b5f828152600160205260408120611d209083613730565b9392505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b0381165f908152600b6020908152604080832080548251818502810185019093528083528493830182828015611da957602002820191905f5260205f20905b815481526020019060010190808311611d95575b509394505f93505050505b8151811015611e4157846001600160a01b0316600a5f848481518110611ddc57611ddc614229565b60209081029190910181015182528101919091526040015f20546001600160a01b0316148015611e295750611e29828281518110611e1c57611e1c614229565b6020026020010151610cd1565b15611e3957600192505050610895565b600101611db4565b505f949350505050565b5f611e55816131ec565b6001600160a01b038216611eab5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c69642061756374696f6e656572206164647265737300000000000060448201526064016109b0565b611ec25f51602061449b5f395f51905f5283611d27565b15611f075760405162461bcd60e51b815260206004820152601560248201527420b63932b0b23c9030b71030bab1ba34b7b732b2b960591b60448201526064016109b0565b611f1e5f51602061449b5f395f51905f5283613262565b506001600160a01b0382165f81815260086020526040808220805460ff19166001179055513392915f51602061449b5f395f51905f52917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f51602061449b5f395f51905f52611f94816131ec565b60035460ff1615611fb75760405162461bcd60e51b81526004016109b09061423d565b5f868152600a60205260409020546001600160a01b031633146120165760405162461bcd60e51b81526020600482015260176024820152762737ba1036b0b935b2ba13b99030bab1ba34b7b732b2b960491b60448201526064016109b0565b5f831161205d5760405162461bcd60e51b81526020600482015260156024820152745461726765742063616e6e6f74206265207a65726f60581b60448201526064016109b0565b5f84116120a25760405162461bcd60e51b8152602060048201526013602482015272526174652063616e6e6f74206265207a65726f60681b60448201526064016109b0565b6040805160a081018252861515815260208082018781528284018781526060840187815263ffffffff42908116608087019081525f8e81526007909652948790209551865490151560ff1990911617865592516001860155905160028501555160038401559051600490920191909155905187917fca26b9928ef624ce9b23cfafc5e93180097417a4faaac312cc856e8d83f5ba4a9161216a918991899189918991909415158552602085019390935260408401919091526060830152608082015260a00190565b60405180910390a2505050505050565b5f6108955f51602061449b5f395f51905f5283611d27565b5f8181526001602052604090206060906108959061373b565b5f51602061449b5f395f51905f526121c2816131ec565b60035460ff16156121e55760405162461bcd60e51b81526004016109b09061423d565b5f828152600a60205260409020546001600160a01b031633146122445760405162461bcd60e51b81526020600482015260176024820152762737ba1036b0b935b2ba13b99030bab1ba34b7b732b2b960491b60448201526064016109b0565b6006828154811061225757612257614229565b5f91825260209091206009600a90920201015463ffffffff1642116122b75760405162461bcd60e51b8152602060048201526016602482015275109bdb99081b9bdd081e595d0818dbdb98db1d59195960521b60448201526064016109b0565b5f600683815481106122cb576122cb614229565b5f91825260208220600a9091020154600680546001600160a01b03909216935090859081106122fc576122fc614229565b5f918252602082206007600a909202010154600e549092501561234357612710600e548361232a9190614404565b61233491906143e5565b9050612340818361427d565b91505b6123576001600160a01b03841633846131f9565b8015612391576123916001600160a01b0384167f0000000000000000000000005b14cc6b2a36a7c36de709775252855d0563e0a5836131f9565b6040805183815260208101839052339187917f6cdd4eeaadbfd702bff31856ddd6a8ac93f3e7683aed304c11ac132081146a1f910160405180910390a35050505050565b7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a636123ff816131ec565b6003805460ff1916905560405133907f5b65b0c1363b3003db9bcc5e1fd8805a6d6bf5bf6dc9d3431ee4494cd7d11766905f90a250565b5f612440816131ec565b6124575f51602061449b5f395f51905f528361328d565b506001600160a01b0382165f81815260086020526040808220805460ff19169055513392915f51602061449b5f395f51905f52917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600b602052815f5260405f2081815481106108b4575f80fd5b600681815481106124db575f80fd5b5f9182526020909120600a909102018054600182015460028301546003840154600485015460058601546006870154600788015460088901546009909901546001600160a01b039889169a50979096169794969395929491939092919063ffffffff80821691600160201b9004168b565b5f612556816131ec565b6103e88263ffffffff16111561259d5760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b60448201526064016109b0565b600e805463ffffffff84169182905560408051828152602081019390935290917f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df61302910160405180910390a1505050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061261957612619614229565b5f9182526020918290206040805160e081018252600690930290910180546001600160a01b03168352600181015493830193909352600283015490820152600382015460608201526004820154608082015260059091015463ffffffff80821660a08401819052600160201b9092041660c08301529091504210156126a1575f915050610895565b5f8160a001518260c001516126b69190614432565b63ffffffff1690505f8260c0015163ffffffff1642116126ea5760a08301516126e59063ffffffff164261427d565b6126ec565b815b90505f8284604001516126ff91906143e5565b90505f61270c8383614404565b90508460200151811115612721575060208401515b979650505050505050565b5f81815260016020526040812061089590613747565b6001600160a01b0381165f908152600d60205260408120546060919067ffffffffffffffff811115612776576127766140fa565b60405190808252806020026020018201604052801561279f578160200160208202803683370190505b5090505f5b6001600160a01b0384165f908152600d6020526040902054811015612821576001600160a01b0384165f908152600d602052604090208054829081106127ec576127ec614229565b905f5260205f2090600602016004015482828151811061280e5761280e614229565b60209081029190910101526001016127a4565b5092915050565b60058181548110612837575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f5f6006838154811061286557612865614229565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b0390811685526001820154169284019290925260028201549083015260038101546060830181905260048201546080840152600582015460a0840152600682015460c08401819052600783015460e0850152600883015461010085015260099092015463ffffffff808216610120860152600160201b90910416610140840152919350612917919061427d565b905061271061292882610708614404565b61293291906143e5565b949350505050565b5f82815260208190526040902060010154612954816131ec565b610d79838361328d565b7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e612988816131ec565b6001600160a01b0382165f9081526009602052604090205460ff166129e75760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b60448201526064016109b0565b6001600160a01b0382165f81815260096020908152604091829020805460ff1916905590519182527f108cc7e243d7eb6c2052789466e0961bb24cd62395e2c99e704001b48107a0619101611114565b5f5f51602061449b5f395f51905f52612a4f816131ec565b60035460ff1615612a725760405162461bcd60e51b81526004016109b09061423d565b6001600160a01b038616612abf5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b2103830bcb7baba103a37b5b2b760611b60448201526064016109b0565b6001600160a01b038516612b0b5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21038bab7ba32903a37b5b2b760691b60448201526064016109b0565b856001600160a01b0316856001600160a01b031603612b6c5760405162461bcd60e51b815260206004820152601860248201527f546f6b656e73206d75737420626520646966666572656e74000000000000000060448201526064016109b0565b6001600160a01b0386165f9081526009602052604090205460ff16612bcb5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b60448201526064016109b0565b612bd53386611d4f565b15612c2d5760405162461bcd60e51b815260206004820152602260248201527f416c726561647920686173206d61726b657420666f722071756f746520746f6b60448201526132b760f11b60648201526084016109b0565b82514263ffffffff90911611612c7a5760405162461bcd60e51b8152602060048201526012602482015271426f6e6420656e6420746f6f206561726c7960701b60448201526064016109b0565b8351612cbd5760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b60448201526064016109b0565b6020840151612d0e5760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726f6c207661726961626c65206d757374206265203e20300000000060448201526064016109b0565b6040840151612d5f5760405162461bcd60e51b815260206004820152601960248201527f4d696e696d756d207072696365206d757374206265203e20300000000000000060448201526064016109b0565b6060840151612da75760405162461bcd60e51b815260206004820152601460248201527304d61782064656274206d757374206265203e20360641b60448201526064016109b0565b82515f90612dbc90429063ffffffff1661427d565b90505f8111612e065760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d995cdd1a5b99c81c195c9a5bd960521b60448201526064016109b0565b5f876001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e43573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e679190614290565b9050612e973330612e7984600a6143d7565b8951612e859190614404565b6001600160a01b038c169291906136f7565b60408051610160810182526001600160a01b03808a1682528a1660208201526006918101612ec684600a6143d7565b8951612ed29190614404565b81525f6020808301919091528901516040808301919091528901516060820152608001612f0084600a6143d7565b60608a0151612f0f9190614404565b81526020015f8152602001428152602001875f60028110612f3257612f32614229565b602002015163ffffffff16815260200187600160028110612f5557612f55614229565b602002015163ffffffff16815250908060018154018082558091505060019003905f5260205f2090600a02015f909190919091505f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015f6101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160090160046101000a81548163ffffffff021916908363ffffffff16021790555050505f6004549050600c5f8a6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600b5f896001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f909190919091505533600a5f8381526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060045f815461314e906142c3565b909155506001600160a01b03808916908a16827fe2cf7d92fe44fee405e71ceedac936dbc3b0d18e7d9582e31f2f2a2a3db75c978a6001602002015160405161319991815260200190565b60405180910390a498975050505050505050565b5f611d2083836125ed565b5f6001600160e01b03198216637965db0b60e01b148061089557506301ffc9a760e01b6001600160e01b0319831614610895565b6131f68133613750565b50565b6040516001600160a01b03838116602483015260448201839052610db291859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613789565b5f6108958261353d565b5f5f61326e84846137f5565b90508015611d20575f84815260016020526040902061096e9084613884565b5f5f6132998484613898565b90508015611d20575f84815260016020526040902061096e9084613901565b60028054036133095760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109b0565b60028055565b5f60028260ff161115613332576133276002836142db565b61089590600a6143d7565b506001919050565b5f818152600760205260409020600381015460049091015461335c91906142b0565b4211156131f6575f6006828154811061337757613377614229565b5f91825260208083208584526007909152604090922054600a909102909101915060ff1615613402575f82815260076020526040812060010154600483018054919290916133c69084906142b0565b90915550505f828152600760205260409020600201546004820154106133fd575f8281526007602052604090206002015460048201555b61345f565b5f828152600760205260408120600101546004830180549192909161342890849061427d565b90915550505f8281526007602052604090206002015460048201541161345f575f8281526007602052604090206002015460048201555b505f9081526007602052604090204263ffffffff16600490910155565b5f6006828154811061349057613490614229565b905f5260205f2090600a020190505f81600301549050805f036134b257505050565b5f8260080154426134c3919061427d565b9050805f036134d25750505050565b60098301545f906134f190600160201b900463ffffffff16606461444e565b63ffffffff166135018385614404565b61350b91906143e5565b90508281116135235761351e818461427d565b613525565b5f5b600385015550505063ffffffff421660089091015550565b5f5f6006838154811061355257613552614229565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116808652600183015490911685850152600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e0870152600883015461010087015260099092015463ffffffff808216610120880152600160201b90910416610140860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa15801561362a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061364e9190614290565b90505f61365a85613915565b90505f6136688360126142db565b61367390601261446d565b61367e90600a6143d7565b9050670de0b6b3a76400006136938284614404565b61369d91906143e5565b94505f85116136ee5760405162461bcd60e51b815260206004820152601860248201527f50726963652063616c63756c6174696f6e206661696c6564000000000000000060448201526064016109b0565b50505050919050565b6040516001600160a01b038481166024830152838116604483015260648201839052610d799186918216906323b872dd90608401613226565b5f611d208383613af5565b60605f611d2083613b1b565b5f610895825490565b61375a8282611d27565b610ffd5760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016109b0565b5f5f60205f8451602086015f885af1806137a8576040513d5f823e3d81fd5b50505f513d915081156137bf5780600114156137cc565b6001600160a01b0384163b155b15610d7957604051635274afe760e01b81526001600160a01b03851660048201526024016109b0565b5f6138008383611d27565b61387d575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556138353390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610895565b505f610895565b5f611d20836001600160a01b038416613b72565b5f6138a38383611d27565b1561387d575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610895565b5f611d20836001600160a01b038416613bb7565b5f5f6006838154811061392a5761392a614229565b5f91825260208083206040805161016081018252600a90940290910180546001600160a01b03908116855260018083015490911685850152600280830154868501526003808401546060808901919091526004808601546080808b01918252600588015460a0808d0191909152600689015460c08d01526007808a015460e08e015260088a01546101008e015260099099015463ffffffff8082166101208f0152600160201b909104166101408d01528f8d52978a529a88902088519788018952805460ff1615158852958601549887018990529385015496860196909652908301549084015292015494810194909452519193501580613a29575080155b15613a3657949350505050565b5f826080015142613a47919061427d565b90505f836060015182613a5a91906143e5565b90508015613aea575f818560200151613a739190614404565b855190915015613aaf576040850151613a8c82866142b0565b1115613a9e5784604001519350613ae8565b613aa881856142b0565b9350613ae8565b8381101580613aca57506040850151613ac8828661427d565b105b15613adb5784604001519350613ae8565b613ae5818561427d565b93505b505b509095945050505050565b5f825f018281548110613b0a57613b0a614229565b905f5260205f200154905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610c5457602002820191905f5260205f2090815481526020019060010190808311610c405750505050509050919050565b5f81815260018301602052604081205461387d57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610895565b5f8181526001830160205260408120548015613c91575f613bd960018361427d565b85549091505f90613bec9060019061427d565b9050808214613c4b575f865f018281548110613c0a57613c0a614229565b905f5260205f200154905080875f018481548110613c2a57613c2a614229565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080613c5c57613c5c614486565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610895565b5f915050610895565b6040518061014001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f151581526020015f81526020015f81525090565b5080545f8255600602905f5260205f20908101906131f691905b80821115613d665780546001600160a01b03191681555f600182018190556002820181905560038201819055600482015560058101805467ffffffffffffffff19169055600601613d1a565b5090565b5f60208284031215613d7a575f5ffd5b81356001600160e01b031981168114611d20575f5ffd5b6001600160a01b03811681146131f6575f5ffd5b5f5f60408385031215613db6575f5ffd5b8235613dc181613d91565b946020939093013593505050565b5f5f60208385031215613de0575f5ffd5b823567ffffffffffffffff811115613df6575f5ffd5b8301601f81018513613e06575f5ffd5b803567ffffffffffffffff811115613e1c575f5ffd5b8560208260051b8401011115613e30575f5ffd5b6020919091019590945092505050565b80516001600160a01b031682526020810151613e6760208401826001600160a01b03169052565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c0810151613eaa60c08401826001600160a01b03169052565b5060e0810151613ebe60e084018215159052565b50610100818101519083015261012090810151910152565b602080825282518282018190525f918401906040840190835b81811015613aea57613f02838551613e40565b602093909301926101409290920191600101613eef565b5f60208284031215613f29575f5ffd5b5035919050565b61014081016108958284613e40565b5f60208284031215613f4f575f5ffd5b8135611d2081613d91565b602080825282518282018190525f918401906040840190835b81811015613aea578351835260209384019390920191600101613f73565b5f5f60408385031215613fa2575f5ffd5b823591506020830135613fb481613d91565b809150509250929050565b5f5f5f60608486031215613fd1575f5ffd5b83359250602084013591506040840135613fea81613d91565b809150509250925092565b5f5f60408385031215614006575f5ffd5b50508035926020909101359150565b5f5f60408385031215614026575f5ffd5b823561403181613d91565b91506020830135613fb481613d91565b5f5f5f5f5f60a08688031215614055575f5ffd5b853594506020860135801515811461406b575f5ffd5b94979496505050506040830135926060810135926080909101359150565b602080825282518282018190525f918401906040840190835b81811015613aea5783516001600160a01b03168352602093840193909201916001016140a2565b803563ffffffff811681146140dc575f5ffd5b919050565b5f602082840312156140f1575f5ffd5b611d20826140c9565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561414357634e487b7160e01b5f52604160045260245ffd5b604052919050565b5f82601f83011261415a575f5ffd5b614164604061410e565b806040840185811115614175575f5ffd5b845b81811015613aea57614188816140c9565b845260209384019301614177565b5f5f5f5f61010085870312156141aa575f5ffd5b84356141b581613d91565b935060208501356141c581613d91565b9250605f850186136141d5575f5ffd5b6141df608061410e565b8060c08701888111156141f0575f5ffd5b604088015b8181101561420d5780358452602093840193016141f5565b5081945061421b898261414b565b935050505092959194509250565b634e487b7160e01b5f52603260045260245ffd5b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561089557610895614269565b5f602082840312156142a0575f5ffd5b815160ff81168114611d20575f5ffd5b8082018082111561089557610895614269565b5f600182016142d4576142d4614269565b5060010190565b60ff828116828216039081111561089557610895614269565b6001815b600184111561432f5780850481111561431357614313614269565b600184161561432157908102905b60019390931c9280026142f8565b935093915050565b5f8261434557506001610895565b8161435157505f610895565b816001811461436757600281146143715761438d565b6001915050610895565b60ff84111561438257614382614269565b50506001821b610895565b5060208310610133831016604e8410600b84101617156143b0575081810a610895565b6143bc5f1984846142f4565b805f19048211156143cf576143cf614269565b029392505050565b5f611d2060ff841683614337565b5f826143ff57634e487b7160e01b5f52601260045260245ffd5b500490565b808202811582820484141761089557610895614269565b5f6020828403121561442b575f5ffd5b5051919050565b63ffffffff828116828216039081111561089557610895614269565b63ffffffff818116838216029081169081811461282157612821614269565b60ff818116838216019081111561089557610895614269565b634e487b7160e01b5f52603160045260245ffdfec1df76f4e50bdb95676f782d4b88b23904c5346d8bc7c986ae26f7e10e601891a2646970667358221220b0f928d8841dbc0a8450c59e6aefb322928dddab57f8f749de1ee2e8e5d1d0f264736f6c634300081b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005b14cc6b2a36a7c36de709775252855d0563e0a5
-----Decoded View---------------
Arg [0] : _mSig (address): 0x5B14Cc6b2a36a7c36dE709775252855d0563E0A5
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005b14cc6b2a36a7c36de709775252855d0563e0a5
Deployed Bytecode Sourcemap
50503:24359:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44037:214;;;;;;:::i;:::-;;:::i;:::-;;;566:14:1;;559:22;541:41;;529:2;514:18;44037:214:0;;;;;;;;52349:53;;;;;;:::i;:::-;;:::i;:::-;;;1247:25:1;;;1235:2;1220:18;52349:53:0;1101:177:1;68697:342:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57243:393::-;;;;;;:::i;:::-;;:::i;:::-;;68041:648;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;65762:142::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;66819:107::-;;;;;;:::i;:::-;;:::i;65912:138::-;;;;;;:::i;:::-;;:::i;51971:28::-;;;;;;27110:122;;;;;;:::i;:::-;27175:7;27202:12;;;;;;;;;;:22;;;;27110:122;66387:162;;;;;;:::i;:::-;;:::i;27542:138::-;;;;;;:::i;:::-;;:::i;28679:251::-;;;;;;:::i;:::-;;:::i;65049:165::-;;;:::i;50868:18::-;;;;;;;;;64269:525;;;;;;:::i;:::-;;:::i;50779:80::-;;50826:33;50779:80;;58364:350;;;;;;:::i;:::-;;:::i;69193:174::-;;;;;;:::i;:::-;;:::i;61507:1838::-;;;;;;:::i;:::-;;:::i;52409:43::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6367:32:1;;;6349:51;;6431:2;6416:18;;6409:34;;;;6459:18;;;6452:34;;;;6517:2;6502:18;;6495:34;;;;6560:3;6545:19;;6538:35;6622:10;6610:23;;;6387:3;6589:19;;6582:52;6671:23;6665:3;6650:19;;6643:52;6336:3;6321:19;52409:43:0;6038:663:1;59640:1859:0;;;;;;:::i;:::-;;:::i;44850:144::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7713:32:1;;;7695:51;;7683:2;7668:18;44850:144:0;7549:203:1;50688:84:0;;50737:35;50688:84;;26126:138;;;;;;:::i;:::-;;:::i;74368:375::-;;;;;;:::i;:::-;;:::i;63465:489::-;;;;;;:::i;:::-;;:::i;58723:790::-;;;;;;:::i;:::-;;:::i;66938:127::-;;;;;;:::i;:::-;;:::i;25438:49::-;;25483:4;25438:49;;45854:138;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57642:710::-;;;;;;:::i;:::-;;:::i;65222:170::-;;;:::i;52526:38::-;;52560:4;52526:38;;52071:45;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9832:14:1;;9825:22;9807:41;;9879:2;9864:18;;9857:34;;;;9907:18;;;9900:34;;;;9965:2;9950:18;;9943:34;10008:3;9993:19;;9986:35;9794:3;9779:19;52071:45:0;9554:473:1;63962:298:0;;;;;;:::i;:::-;;:::i;52290:52::-;;;;;;:::i;:::-;;:::i;52044:20::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;10474:32:1;;;10456:51;;10543:32;;;;10538:2;10523:18;;10516:60;10592:18;;;10585:34;;;;10650:2;10635:18;;10628:34;;;;10693:3;10678:19;;10671:35;;;;10494:3;10722:19;;10715:35;;;;10781:3;10766:19;;10759:35;10825:3;10810:19;;10803:35;10869:3;10854:19;;10847:35;10931:10;10919:23;;;10913:3;10898:19;;10891:52;10980:24;10974:3;10959:19;;10952:53;10443:3;10428:19;52044:20:0;10032:979:1;65399:237:0;;;;;;:::i;:::-;;:::i;67073:958::-;;;;;;:::i;:::-;;:::i;45168:133::-;;;;;;:::i;:::-;;:::i;50611:70::-;;-1:-1:-1;;;;;;;;;;;50611:70:0;;66058:316;;;;;;:::i;:::-;;:::i;52006:31::-;;;;;;:::i;:::-;;:::i;66563:244::-;;;;;;:::i;:::-;;:::i;27973:140::-;;;;;;:::i;:::-;;:::i;64802:232::-;;;;;;:::i;:::-;;:::i;52496:23::-;;;;;;54832:2402;;;;;;:::i;:::-;;:::i;52228:55::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;52228:55:0;;;52460:29;;;;;69045:141;;;;;;:::i;:::-;;:::i;44037:214::-;44122:4;-1:-1:-1;;;;;;44146:57:0;;-1:-1:-1;;;44146:57:0;;:97;;;44207:36;44231:11;44207:23;:36::i;:::-;44139:104;44037:214;-1:-1:-1;;44037:214:0:o;52349:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68697:342::-;68782:23;68814:31;68869:9;68848:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;68814:72:0;-1:-1:-1;68904:9:0;68899:110;68919:20;;;68899:110;;;68970:31;68988:9;;68998:1;68988:12;;;;;;;:::i;:::-;;;;;;;68970:17;:31::i;:::-;68957:7;68965:1;68957:10;;;;;;;;:::i;:::-;;;;;;;;;;:44;68941:3;;68899:110;;;-1:-1:-1;69028:7:0;68697:342;-1:-1:-1;;;68697:342:0:o;57243:393::-;-1:-1:-1;;;;;;;;;;;25722:16:0;25733:4;25722:10;:16::i;:::-;74802:6:::1;::::0;::::1;;74801:7;74793:38;;;;-1:-1:-1::0;;;74793:38:0::1;;;;;;;:::i;:::-;;;;;;;;;57335:25:::2;::::0;;;:20:::2;:25;::::0;;;;;-1:-1:-1;;;;;57335:25:0::2;57364:10;57335:39;57331:69;;57376:24;::::0;-1:-1:-1;;;57376:24:0;;14254:2:1;57376:24:0::2;::::0;::::2;14236:21:1::0;14293:2;14273:18;;;14266:30;-1:-1:-1;;;14312:18:1;;;14305:43;14365:18;;57376:24:0::2;14052:337:1::0;57331:69:0::2;57436:15;57407:5;57413:3;57407:10;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;:45;;;;;;;;;;;;;;;;;;57461:18;57508:5;57514:3;57508:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;57482:5;57488:3;57482:10;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;:46;;;;:::i;:::-;57461:67;;57537;57581:10;57593;57544:5;57550:3;57544:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:22:::2;:10;::::0;;::::2;;:22;::::0;-1:-1:-1;;;;;57544:22:0::2;::::0;57537:67;:43:::2;:67::i;:::-;57618:14;::::0;57628:3;;57618:14:::2;::::0;;;::::2;57324:312;57243:393:::0;;:::o;68041:648::-;68107:21;;:::i;:::-;68141:18;68162:5;68168:8;68162:15;;;;;;;;:::i;:::-;;;;;;;;;;68205:476;;;;;;;;68162:15;;;;;;;68247;;-1:-1:-1;;;;;68247:15:0;;;68205:476;;68247:15;68290:16;;;;68205:476;;;;;;;68162:15;;-1:-1:-1;68205:476:0;;;68328:24;68343:8;68328:14;:24::i;:::-;68205:476;;;;68378:26;68395:8;68378:16;:26::i;:::-;68205:476;;68432:16;;;;-1:-1:-1;;;68432:16:0;;;;68205:476;;;;;;;;68478:17;;;;68205:476;;;;;;;;-1:-1:-1;68522:30:0;;;:20;:30;;;;;;-1:-1:-1;;;;;68522:30:0;68205:476;;;;;;68575:16;68522:30;68575:6;:16::i;:::-;68205:476;;;;68617:14;;;;68205:476;;;;68656:13;;;;;;;68205:476;;;;;;;;68198:483;68041:648;-1:-1:-1;;68041:648:0:o;65762:142::-;-1:-1:-1;;;;;65869:27:0;;;;;;:15;:27;;;;;;;;;65862:34;;;;;;;;;;;;;;;;;65832:16;;65862:34;;;65869:27;65862:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65762:142;;;:::o;66819:107::-;66871:7;66899:19;66914:3;66899:14;:19::i;65912:138::-;-1:-1:-1;;;;;66018:24:0;;;;;;:16;:24;;;;;;;;;66011:31;;;;;;;;;;;;;;;;;65979:16;;66011:31;;;66018:24;66011:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65912:138;;;:::o;66387:162::-;66437:4;66481:5;66487:3;66481:10;;;;;;;;:::i;:::-;;;;;;;;;:19;:10;;;;;:19;;;;66462:15;:38;;;;:83;;;66527:5;66533:3;66527:10;;;;;;;;:::i;:::-;;;;;;;;;;;:18;;;66504:5;66510:3;66504:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;:41;66455:90;66387:162;-1:-1:-1;;66387:162:0:o;27542:138::-;27175:7;27202:12;;;;;;;;;;:22;;;25722:16;25733:4;25722:10;:16::i;:::-;27647:25:::1;27658:4;27664:7;27647:10;:25::i;:::-;;27542:138:::0;;;:::o;28679:251::-;-1:-1:-1;;;;;28773:34:0;;22429:10;28773:34;28769:104;;28831:30;;-1:-1:-1;;;28831:30:0;;;;;;;;;;;28769:104;28885:37;28897:4;28903:18;28885:11;:37::i;:::-;;28679:251;;:::o;65049:165::-;50826:33;25722:16;25733:4;25722:10;:16::i;:::-;65151:6:::1;:13:::0;;-1:-1:-1;;65151:13:0::1;65160:4;65151:13;::::0;;65180:26:::1;::::0;65195:10:::1;::::0;65180:26:::1;::::0;65151:6:::1;::::0;65180:26:::1;65049:165:::0;:::o;64269:525::-;50737:35;25722:16;25733:4;25722:10;:16::i;:::-;-1:-1:-1;;;;;64396:20:0;::::1;64388:54;;;::::0;-1:-1:-1;;;64388:54:0;;14861:2:1;64388:54:0::1;::::0;::::1;14843:21:1::0;14900:2;14880:18;;;14873:30;-1:-1:-1;;;14919:18:1;;;14912:51;14980:18;;64388:54:0::1;14659:345:1::0;64388:54:0::1;-1:-1:-1::0;;;;;64462:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;::::1;;64461:26;64453:64;;;::::0;-1:-1:-1;;;64453:64:0;;15211:2:1;64453:64:0::1;::::0;::::1;15193:21:1::0;15250:2;15230:18;;;15223:30;15289:27;15269:18;;;15262:55;15334:18;;64453:64:0::1;15009:349:1::0;64453:64:0::1;64589:6;-1:-1:-1::0;;;;;64574:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;64574:33:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;64574:33:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;64570:217;;64746:29;::::0;-1:-1:-1;;;64746:29:0;;15843:2:1;64746:29:0::1;::::0;::::1;15825:21:1::0;15882:2;15862:18;;;15855:30;-1:-1:-1;;;15901:18:1;;;15894:49;15960:18;;64746:29:0::1;15641:343:1::0;64570:217:0::1;-1:-1:-1::0;;;;;;64639:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;:32;;-1:-1:-1;;64639:32:0::1;64667:4;64639:32:::0;;::::1;::::0;;;64686:13:::1;:26:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;64686:26:0::1;::::0;;::::1;::::0;;64570:217:::1;64269:525:::0;;:::o;58364:350::-;58453:30;;;;:20;:30;;;;;;-1:-1:-1;;;;;58453:30:0;58487:10;58453:44;58445:73;;;;-1:-1:-1;;;58445:73:0;;16191:2:1;58445:73:0;;;16173:21:1;16230:2;16210:18;;;16203:30;-1:-1:-1;;;16249:18:1;;;16242:46;16305:18;;58445:73:0;15989:340:1;58445:73:0;58533:39;-1:-1:-1;;;;;;;;;;;58558:13:0;58533:7;:39::i;:::-;58525:66;;;;-1:-1:-1;;;58525:66:0;;16536:2:1;58525:66:0;;;16518:21:1;16575:2;16555:18;;;16548:30;-1:-1:-1;;;16594:18:1;;;16587:44;16648:18;;58525:66:0;16334:338:1;58525:66:0;58598:30;;;;:20;:30;;;;;;;;;:46;;-1:-1:-1;;;;;;58598:46:0;-1:-1:-1;;;;;58598:46:0;;;;;;;;58656:54;;16879:25:1;;;58684:10:0;16920:18:1;;;16913:60;;;;16989:18;;;16982:60;;;;58656:54:0;;16867:2:1;16852:18;58656:54:0;;;;;;;;58364:350;;:::o;69193:174::-;-1:-1:-1;;;;;69295:14:0;;69263:4;69295:14;;;:8;:14;;;;;:23;;69263:4;;69295:14;69310:7;;69295:23;;;;;;:::i;:::-;;;;;;;;;;69276:42;;;;;;;;69295:23;;;;;;;69276:42;;-1:-1:-1;;;;;69276:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;69276:42:0;;;;;;;;;;;69332:15;:31;;;-1:-1:-1;;69193:174:0;;;;:::o;61507:1838::-;61581:22;48945:21;:19;:21::i;:::-;-1:-1:-1;;;;;61629:14:0;::::1;61612;61629::::0;;;:8:::1;:14;::::0;;;;:21;;61612:14;61629:21;61714:18:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;61714:18:0::1;-1:-1:-1::0;61689:43:0;-1:-1:-1;61739:19:0::1;::::0;61846:692:::1;61870:6;61866:1;:10;61846:692;;;-1:-1:-1::0;;;;;61921:14:0;::::1;61894:24;61921:14:::0;;;:8:::1;:14;::::0;;;;:17;;61936:1;;61921:17;::::1;;;;;:::i;:::-;;;;;;;;;;;61894:44;;61977:3;61953:11;:20;;;:27:::0;61949:582:::1;;61997:14;62014:30;62036:4;62042:1;62014:21;:30::i;:::-;61997:47:::0;-1:-1:-1;62077:10:0;;62073:447:::1;;-1:-1:-1::0;;;;;62108:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;:17;;62140:6;;62108:14;62123:1;;62108:17;::::1;;;;;:::i;:::-;;;;;;;;;;;:28;;;:38;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;62165:23:0::1;::::0;-1:-1:-1;62182:6:0;62165:23;::::1;:::i;:::-;;;62225:57;62269:4;62275:6;62232:5;62238:3;62232:10;;;;;;;;:::i;62225:57::-;62379:11;:22;;;62405:1;62379:27:::0;62375:130:::1;;62445:4;62431:8;62440:1;62431:11;;;;;;;;:::i;:::-;:18:::0;::::1;;:11;::::0;;::::1;::::0;;;;;;;:18;62472:13;::::1;::::0;::::1;:::i;:::-;;;;62375:130;61982:549;61949:582;-1:-1:-1::0;61878:3:0::1;;61846:692;;;-1:-1:-1::0;62607:15:0;;62603:706:::1;;62685:28;62727:20;62736:11:::0;62727:6;:20:::1;:::i;:::-;62716:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62716:32:0::1;;;;;;;;;;;;;;;;-1:-1:-1::0;62685:63:0;-1:-1:-1;62759:16:0::1;::::0;62848:189:::1;62872:6;62868:1;:10;62848:189;;;62905:8;62914:1;62905:11;;;;;;;;:::i;:::-;;;;;;;62900:126;;-1:-1:-1::0;;;;;62964:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;:17;;62979:1;;62964:17;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;62937:44:::1;::::0;;::::1;::::0;::::1;::::0;;62964:17:::1;::::0;;::::1;::::0;;::::1;62937:44:::0;;-1:-1:-1;;;;;62937:44:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;62937:44:0;;::::1;;::::0;;;;:24;;:14;;62952:8;;62937:24;::::1;;;;;:::i;:::-;;;;;;:44;;;;63000:10;;;;;:::i;:::-;;;;62900:126;62880:3;;62848:189;;;-1:-1:-1::0;;;;;;63097:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;63090:21:::1;::::0;::::1;:::i;:::-;63190:9;63185:117;63209:14;:21;63205:1;:25;63185:117;;;-1:-1:-1::0;;;;;63252:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;63272:17;;:14;;63287:1;;63272:17;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;63252:38;;::::1;::::0;;::::1;::::0;;-1:-1:-1;63252:38:0;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;63252:38:0;;::::1;-1:-1:-1::0;;;;;;63252:38:0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;;63252:38:0::1;-1:-1:-1::0;;63252:38:0;;;;::::1;::::0;;;;::::1;::::0;;63232:3:::1;63185:117;;;;62624:685;;62603:706;-1:-1:-1::0;63328:13:0;;-1:-1:-1;;;48989:20:0;48383:1;49509:7;:22;49326:213;52409:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52409:43:0;;;;-1:-1:-1;52409:43:0;;-1:-1:-1;52409:43:0;;;;;;;;-1:-1:-1;;;52409:43:0;;;;:::o;59640:1859::-;48945:21;:19;:21::i;:::-;-1:-1:-1;;;;;59735:18:0;::::1;59727:51;;;::::0;-1:-1:-1;;;59727:51:0;;17525:2:1;59727:51:0::1;::::0;::::1;17507:21:1::0;17564:2;17544:18;;;17537:30;-1:-1:-1;;;17583:18:1;;;17576:50;17643:18;;59727:51:0::1;17323:344:1::0;59727:51:0::1;59799:5;:12:::0;59793:18;::::1;59785:48;;;::::0;-1:-1:-1;;;59785:48:0;;17874:2:1;59785:48:0::1;::::0;::::1;17856:21:1::0;17913:2;17893:18;;;17886:30;-1:-1:-1;;;17932:18:1;;;17925:47;17989:18;;59785:48:0::1;17672:341:1::0;59785:48:0::1;59840:18;59861:5;59867:3;59861:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;59905:13;::::0;::::1;::::0;59861:10;;-1:-1:-1;59905:13:0::1;;59886:15;:32;;59878:59;;;::::0;-1:-1:-1;;;59878:59:0;;18220:2:1;59878:59:0::1;::::0;::::1;18202:21:1::0;18259:2;18239:18;;;18232:30;-1:-1:-1;;;18278:18:1;;;18271:44;18332:18;;59878:59:0::1;18018:338:1::0;59878:59:0::1;59969:4;:12;;;59952:4;:14;;;:29;59944:71;;;::::0;-1:-1:-1;;;59944:71:0;;18563:2:1;59944:71:0::1;::::0;::::1;18545:21:1::0;18602:2;18582:18;;;18575:30;18641:31;18621:18;;;18614:59;18690:18;;59944:71:0::1;18361:353:1::0;59944:71:0::1;60069:15:::0;;60046:51:::1;::::0;;-1:-1:-1;;;60046:51:0;;;;60024:19:::1;::::0;-1:-1:-1;;;;;60069:15:0::1;::::0;60046:49:::1;::::0;:51:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;60069:15;60046:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60024:73;;60104:22;60129:38;60153:13;60129:23;:38::i;:::-;60104:63;;60192:14;60182:6;:24;;60174:68;;;::::0;-1:-1:-1;;;60174:68:0;;18921:2:1;60174:68:0::1;::::0;::::1;18903:21:1::0;18960:2;18940:18;;;18933:30;18999:33;18979:18;;;18972:61;19050:18;;60174:68:0::1;18719:355:1::0;60174:68:0::1;60251:10;60257:3;60251:5;:10::i;:::-;60268:15;60279:3;60268:10;:15::i;:::-;60292:13;60308:17;60321:3;60308:12;:17::i;:::-;60292:33:::0;-1:-1:-1;60387:14:0::1;60439:18;60444:13:::0;60439:2:::1;:18;:::i;:::-;60432:26;::::0;:2:::1;:26;:::i;:::-;60423:36;::::0;:5;:36:::1;:::i;:::-;60405:13;:6:::0;60414:4:::1;60405:13;:::i;:::-;60404:56;;;;:::i;:::-;60387:73;;60473:17;60536:5;60510:4;:14;;;60495:4;:12;;;:29;;;;:::i;:::-;60494:38;::::0;60528:4:::1;60494:38;:::i;:::-;60493:48;;;;:::i;:::-;60473:68;;60572:9;60562:6;:19;;60554:63;;;::::0;-1:-1:-1;;;60554:63:0;;21264:2:1;60554:63:0::1;::::0;::::1;21246:21:1::0;21303:2;21283:18;;;21276:30;21342:33;21322:18;;;21315:61;21393:18;;60554:63:0::1;21062:355:1::0;60554:63:0::1;60659:4;:12;;;60649:6;60632:4;:14;;;:23;;;;:::i;:::-;:39;;60624:77;;;::::0;-1:-1:-1;;;60624:77:0;;21624:2:1;60624:77:0::1;::::0;::::1;21606:21:1::0;21663:2;21643:18;;;21636:30;21702:27;21682:18;;;21675:55;21747:18;;60624:77:0::1;21422:349:1::0;60624:77:0::1;60737:15:::0;;60784:35:::1;::::0;-1:-1:-1;;;60784:35:0;;60813:4:::1;60784:35;::::0;::::1;7695:51:1::0;-1:-1:-1;;;;;60737:15:0;;::::1;::::0;60710:17:::1;::::0;60737:15;;60784:20:::1;::::0;7668:18:1;;60784:35:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60760:59:::0;-1:-1:-1;60826:62:0::1;-1:-1:-1::0;;;;;60826:27:0;::::1;60854:10;60874:4;60881:6:::0;60826:27:::1;:62::i;:::-;60918:35;::::0;-1:-1:-1;;;60918:35:0;;60947:4:::1;60918:35;::::0;::::1;7695:51:1::0;60895:20:0::1;::::0;-1:-1:-1;;;;;60918:20:0;::::1;::::0;::::1;::::0;7668:18:1;;60918:35:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60895:58:::0;-1:-1:-1;61000:6:0;60968:28:::1;60983:13:::0;60895:58;60968:28:::1;:::i;:::-;:38;60960:76;;;::::0;-1:-1:-1;;;60960:76:0;;22167:2:1;60960:76:0::1;::::0;::::1;22149:21:1::0;22206:2;22186:18;;;22179:30;22245:27;22225:18;;;22218:55;22290:18;;60960:76:0::1;21965:349:1::0;60960:76:0::1;61081:6;61049:5;61055:3;61049:10;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;:38;;;;;;;:::i;:::-;;;;;;;;61118:6;61094:5;61100:3;61094:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;61133:14:0;;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;;61153:276;;::::1;::::0;::::1;::::0;;61182:16:::1;::::0;::::1;::::0;;;::::1;61153:276:::0;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;::::1;61343:15;61153:276:::0;;::::1;::::0;;;;61386:16:::1;::::0;::::1;::::0;61133:14;;61153:276;;;;;61386:34:::1;::::0;61343:15;-1:-1:-1;;;61386:16:0;::::1;;:34;:::i;:::-;61153:276;::::0;;::::1;::::0;;;61133:297;;::::1;::::0;;::::1;::::0;;-1:-1:-1;61133:297:0;;;::::1;::::0;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;61133:297:0;;::::1;-1:-1:-1::0;;;;;;61133:297:0;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;61133:297:0::1;-1:-1:-1::0;;61133:297:0;;;;;;::::1;::::0;;;;;;;::::1;::::0;;61448:47;;61468:3;;61448:47;::::1;::::0;::::1;::::0;::::1;::::0;61473:6;;61481;;61489:5;;22521:25:1;;;22577:2;22562:18;;22555:34;;;;22620:2;22605:18;;22598:34;22509:2;22494:18;;22319:319;61448:47:0::1;;;;;;;;59720:1779;;;;;;;;;48989:20:::0;48383:1;49509:7;:22;49326:213;44850:144;44931:7;44958:18;;;:12;:18;;;;;:28;;44980:5;44958:21;:28::i;:::-;44951:35;44850:144;-1:-1:-1;;;44850:144:0:o;26126:138::-;26203:4;26227:12;;;;;;;;;;;-1:-1:-1;;;;;26227:29:0;;;;;;;;;;;;;;;26126:138::o;74368:375::-;-1:-1:-1;;;;;74506:27:0;;74466:4;74506:27;;;:15;:27;;;;;;;;74479:54;;;;;;;;;;;;;;;;;74466:4;;74479:54;;74506:27;74479:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;74479:54:0;;-1:-1:-1;74544:9:0;;-1:-1:-1;;;;74540:181:0;74563:7;:14;74559:1;:18;74540:181;;;74633:10;-1:-1:-1;;;;;74597:46:0;:20;:32;74618:7;74626:1;74618:10;;;;;;;;:::i;:::-;;;;;;;;;;;;74597:32;;;;;;;;;;-1:-1:-1;74597:32:0;;-1:-1:-1;;;;;74597:32:0;:46;:68;;;;;74647:18;74654:7;74662:1;74654:10;;;;;;;;:::i;:::-;;;;;;;74647:6;:18::i;:::-;74594:120;;;74698:4;74691:11;;;;;;74594:120;74579:3;;74540:181;;;-1:-1:-1;74734:5:0;;74368:375;-1:-1:-1;;;;74368:375:0:o;63465:489::-;25483:4;25722:16;25483:4;25722:10;:16::i;:::-;-1:-1:-1;;;;;63632:25:0;::::1;63624:64;;;::::0;-1:-1:-1;;;63624:64:0;;22845:2:1;63624:64:0::1;::::0;::::1;22827:21:1::0;22884:2;22864:18;;;22857:30;22923:28;22903:18;;;22896:56;22969:18;;63624:64:0::1;22643:350:1::0;63624:64:0::1;63708:37;-1:-1:-1::0;;;;;;;;;;;63733:11:0::1;63708:7;:37::i;:::-;63707:38;63699:72;;;::::0;-1:-1:-1;;;63699:72:0;;23200:2:1;63699:72:0::1;::::0;::::1;23182:21:1::0;23239:2;23219:18;;;23212:30;-1:-1:-1;;;23258:18:1;;;23251:51;23319:18;;63699:72:0::1;22998:345:1::0;63699:72:0::1;63784:40;-1:-1:-1::0;;;;;;;;;;;63812:11:0::1;63784:10;:40::i;:::-;-1:-1:-1::0;;;;;;63835:35:0;::::1;;::::0;;;:22:::1;:35;::::0;;;;;:42;;-1:-1:-1;;63835:42:0::1;63873:4;63835:42;::::0;;63893:53;63935:10:::1;::::0;63835:35;-1:-1:-1;;;;;;;;;;;50653:28:0;63893:53:::1;::::0;63835:35;63893:53:::1;63465:489:::0;;:::o;58723:790::-;-1:-1:-1;;;;;;;;;;;25722:16:0;25733:4;25722:10;:16::i;:::-;74802:6:::1;::::0;::::1;;74801:7;74793:38;;;;-1:-1:-1::0;;;74793:38:0::1;;;;;;;:::i;:::-;58939:25:::2;::::0;;;:20:::2;:25;::::0;;;;;-1:-1:-1;;;;;58939:25:0::2;58968:10;58939:39;58931:75;;;::::0;-1:-1:-1;;;58931:75:0;;23550:2:1;58931:75:0::2;::::0;::::2;23532:21:1::0;23589:2;23569:18;;;23562:30;-1:-1:-1;;;23608:18:1;;;23601:53;23671:18;;58931:75:0::2;23348:347:1::0;58931:75:0::2;59035:1;59025:7;:11;59017:45;;;::::0;-1:-1:-1;;;59017:45:0;;23902:2:1;59017:45:0::2;::::0;::::2;23884:21:1::0;23941:2;23921:18;;;23914:30;-1:-1:-1;;;23960:18:1;;;23953:51;24021:18;;59017:45:0::2;23700:345:1::0;59017:45:0::2;59089:1;59081:5;:9;59073:41;;;::::0;-1:-1:-1;;;59073:41:0;;24252:2:1;59073:41:0::2;::::0;::::2;24234:21:1::0;24291:2;24271:18;;;24264:30;-1:-1:-1;;;24310:18:1;;;24303:49;24369:18;;59073:41:0::2;24050:343:1::0;59073:41:0::2;59154:178;::::0;;::::2;::::0;::::2;::::0;;;::::2;;::::0;;::::2;::::0;;::::2;::::0;;;;;;;;;;;;;;;::::2;59304:15;59154:178:::0;;::::2;::::0;;;;;;-1:-1:-1;59135:16:0;;;:11:::2;:16:::0;;;;;;;:197;;;;;::::2;;-1:-1:-1::0;;59135:197:0;;::::2;;::::0;;;;;;::::2;::::0;;;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;;::::2;::::0;;::::2;::::0;;;;59350:155;;59147:3;;59350:155:::2;::::0;::::2;::::0;59181:4;;59206:5;;59234:7;;59264;;59304:15;9832:14:1;;9825:22;9807:41;;9879:2;9864:18;;9857:34;;;;9922:2;9907:18;;9900:34;;;;9965:2;9950:18;;9943:34;10008:3;9993:19;;9986:35;9794:3;9779:19;;9554:473;59350:155:0::2;;;;;;;;58723:790:::0;;;;;;:::o;66938:127::-;67000:4;67024:33;-1:-1:-1;;;;;;;;;;;67049:7:0;67024;:33::i;45854:138::-;45957:18;;;;:12;:18;;;;;45921:16;;45957:27;;:25;:27::i;57642:710::-;-1:-1:-1;;;;;;;;;;;25722:16:0;25733:4;25722:10;:16::i;:::-;74802:6:::1;::::0;::::1;;74801:7;74793:38;;;;-1:-1:-1::0;;;74793:38:0::1;;;;;;;:::i;:::-;57748:25:::2;::::0;;;:20:::2;:25;::::0;;;;;-1:-1:-1;;;;;57748:25:0::2;57777:10;57748:39;57740:75;;;::::0;-1:-1:-1;;;57740:75:0;;23550:2:1;57740:75:0::2;::::0;::::2;23532:21:1::0;23589:2;23569:18;;;23562:30;-1:-1:-1;;;23608:18:1;;;23601:53;23671:18;;57740:75:0::2;23348:347:1::0;57740:75:0::2;57848:5;57854:3;57848:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:19:::2;:10;::::0;;::::2;;:19;::::0;::::2;;57830:15;:37;57822:72;;;::::0;-1:-1:-1;;;57822:72:0;;24600:2:1;57822:72:0::2;::::0;::::2;24582:21:1::0;24639:2;24619:18;;;24612:30;-1:-1:-1;;;24658:18:1;;;24651:52;24720:18;;57822:72:0::2;24398:346:1::0;57822:72:0::2;57903:18;57924:5;57930:3;57924:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;:21:::0;57970:5:::2;:10:::0;;-1:-1:-1;;;;;57924:21:0;;::::2;::::0;-1:-1:-1;57970:5:0;57976:3;;57970:10;::::2;;;;;:::i;:::-;;::::0;;;::::2;::::0;;:28:::2;:10;::::0;;::::2;;:28;::::0;58036:8:::2;::::0;57970:28;;-1:-1:-1;58036:12:0;58032:102:::2;;58093:5;58081:8;;58071:7;:18;;;;:::i;:::-;58070:28;;;;:::i;:::-;58061:37:::0;-1:-1:-1;58109:17:0::2;58061:37:::0;58109:17;::::2;:::i;:::-;;;58032:102;58142:52;-1:-1:-1::0;;;;;58142:31:0;::::2;58174:10;58186:7:::0;58142:31:::2;:52::i;:::-;58205:10:::0;;58201:80:::2;;58228:45;-1:-1:-1::0;;;;;58228:31:0;::::2;58260:4;58266:6:::0;58228:31:::2;:45::i;:::-;58294:54;::::0;;24923:25:1;;;24979:2;24964:18;;24957:34;;;58320:10:0::2;::::0;58315:3;;58294:54:::2;::::0;24896:18:1;58294:54:0::2;;;;;;;57733:619;;;57642:710:::0;;:::o;65222:170::-;50826:33;25722:16;25733:4;25722:10;:16::i;:::-;65326:6:::1;:14:::0;;-1:-1:-1;;65326:14:0::1;::::0;;65356:28:::1;::::0;65373:10:::1;::::0;65356:28:::1;::::0;65335:5:::1;::::0;65356:28:::1;65222:170:::0;:::o;63962:298::-;25483:4;25722:16;25483:4;25722:10;:16::i;:::-;64088:41:::1;-1:-1:-1::0;;;;;;;;;;;64117:11:0::1;64088;:41::i;:::-;-1:-1:-1::0;;;;;;64140:35:0;::::1;64178:5;64140:35:::0;;;:22:::1;:35;::::0;;;;;:43;;-1:-1:-1;;64140:43:0::1;::::0;;64199:53;64241:10:::1;::::0;64140:35;-1:-1:-1;;;;;;;;;;;50653:28:0;64199:53:::1;::::0;64178:5;64199:53:::1;63962:298:::0;;:::o;52290:52::-;;;;;;;;;;;;;;;;;;;;52044:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52044:20:0;;;;-1:-1:-1;52044:20:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52044:20:0;;;;:::o;65399:237::-;25483:4;25722:16;25483:4;25722:10;:16::i;:::-;52560:4:::1;65492:10;:21;;;;65484:46;;;::::0;-1:-1:-1;;;65484:46:0;;25204:2:1;65484:46:0::1;::::0;::::1;25186:21:1::0;25243:2;25223:18;;;25216:30;-1:-1:-1;;;25262:18:1;;;25255:42;25314:18;;65484:46:0::1;25002:336:1::0;65484:46:0::1;65554:8;::::0;;65569:21:::1;::::0;::::1;::::0;;;;65602:30:::1;::::0;;25516:25:1;;;25572:2;25557:18;;25550:51;;;;65554:8:0;;65602:30:::1;::::0;25489:18:1;65602:30:0::1;;;;;;;65477:159;65399:237:::0;;:::o;67073:958::-;-1:-1:-1;;;;;67191:14:0;;67156:7;67191:14;;;:8;:14;;;;;:23;;67156:7;;67191:14;67206:7;;67191:23;;;;;;:::i;:::-;;;;;;;;;;67172:42;;;;;;;;67191:23;;;;;;;67172:42;;-1:-1:-1;;;;;67172:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;67172:42:0;;;;;;;;;;-1:-1:-1;67263:15:0;:32;67259:65;;;67315:1;67308:8;;;;;67259:65;67373:19;67410:4;:14;;;67395:4;:12;;;:29;;;;:::i;:::-;67373:51;;;;67481:19;67521:4;:12;;;67503:30;;:15;:30;:99;;67588:14;;;;67570:32;;;;:15;:32;:::i;:::-;67503:99;;;67546:11;67503:99;67481:121;;67670:23;67717:11;67696:4;:18;;;:32;;;;:::i;:::-;67670:58;-1:-1:-1;67780:24:0;67807:29;67825:11;67670:58;67807:29;:::i;:::-;67780:56;;67926:4;:15;;;67907:16;:34;67903:93;;;-1:-1:-1;67973:15:0;;;;67903:93;68011:16;67073:958;-1:-1:-1;;;;;;;67073:958:0:o;45168:133::-;45239:7;45266:18;;;:12;:18;;;;;:27;;:25;:27::i;66058:316::-;-1:-1:-1;;;;;66199:14:0;;66154:28;66199:14;;;:8;:14;;;;;:21;66121:16;;66154:28;66185:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66185:36:0;-1:-1:-1;66154:67:0;-1:-1:-1;66233:9:0;66228:114;-1:-1:-1;;;;;66252:14:0;;;;;;:8;:14;;;;;:21;66248:25;;66228:114;;;-1:-1:-1;;;;;66308:14:0;;;;;;:8;:14;;;;;:17;;66323:1;;66308:17;;;;;;:::i;:::-;;;;;;;;;;;:26;;;66291:11;66303:1;66291:14;;;;;;;;:::i;:::-;;;;;;;;;;:43;66275:3;;66228:114;;;-1:-1:-1;66355:11:0;66058:316;-1:-1:-1;;66058:316:0:o;52006:31::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52006:31:0;;-1:-1:-1;52006:31:0;:::o;66563:244::-;66623:7;66642:17;66662:5;66668:3;66662:10;;;;;;;;:::i;:::-;;;;;;;;;66642:30;;;;;;;;66662:10;;;;;;;66642:30;;-1:-1:-1;;;;;66642:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66642:30:0;;;;;;;;;;-1:-1:-1;66706:29:0;;66642:30;66706:29;:::i;:::-;66682:53;-1:-1:-1;66777:5:0;66753:20;66682:53;66769:4;66753:20;:::i;:::-;66752:30;;;;:::i;:::-;66745:37;66563:244;-1:-1:-1;;;;66563:244:0:o;27973:140::-;27175:7;27202:12;;;;;;;;;;:22;;;25722:16;25733:4;25722:10;:16::i;:::-;28079:26:::1;28091:4;28097:7;28079:11;:26::i;64802:232::-:0;50737:35;25722:16;25733:4;25722:10;:16::i;:::-;-1:-1:-1;;;;;64901:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;::::1;;64893:59;;;::::0;-1:-1:-1;;;64893:59:0;;25989:2:1;64893:59:0::1;::::0;::::1;25971:21:1::0;26028:2;26008:18;;;26001:30;-1:-1:-1;;;26047:18:1;;;26040:51;26108:18;;64893:59:0::1;25787:345:1::0;64893:59:0::1;-1:-1:-1::0;;;;;64959:25:0;::::1;64987:5;64959:25:::0;;;:17:::1;:25;::::0;;;;;;;;:33;;-1:-1:-1;;64959:33:0::1;::::0;;65004:26;;7695:51:1;;;65004:26:0::1;::::0;7668:18:1;65004:26:0::1;7549:203:1::0;54832:2402:0;55121:16;-1:-1:-1;;;;;;;;;;;25722:16:0;25733:4;25722:10;:16::i;:::-;74802:6:::1;::::0;::::1;;74801:7;74793:38;;;;-1:-1:-1::0;;;74793:38:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;55182:26:0;::::2;55174:59;;;::::0;-1:-1:-1;;;55174:59:0;;26339:2:1;55174:59:0::2;::::0;::::2;26321:21:1::0;26378:2;26358:18;;;26351:30;-1:-1:-1;;;26397:18:1;;;26390:50;26457:18;;55174:59:0::2;26137:344:1::0;55174:59:0::2;-1:-1:-1::0;;;;;55248:34:0;::::2;55240:66;;;::::0;-1:-1:-1;;;55240:66:0;;26688:2:1;55240:66:0::2;::::0;::::2;26670:21:1::0;26727:2;26707:18;;;26700:30;-1:-1:-1;;;26746:18:1;;;26739:49;26805:18;;55240:66:0::2;26486:343:1::0;55240:66:0::2;55345:12;-1:-1:-1::0;;;;;55321:36:0::2;55329:11;-1:-1:-1::0;;;;;55321:36:0::2;::::0;55313:73:::2;;;::::0;-1:-1:-1;;;55313:73:0;;27036:2:1;55313:73:0::2;::::0;::::2;27018:21:1::0;27075:2;27055:18;;;27048:30;27114:26;27094:18;;;27087:54;27158:18;;55313:73:0::2;26834:348:1::0;55313:73:0::2;-1:-1:-1::0;;;;;55401:31:0;::::2;;::::0;;;:17:::2;:31;::::0;;;;;::::2;;55393:65;;;::::0;-1:-1:-1;;;55393:65:0;;25989:2:1;55393:65:0::2;::::0;::::2;25971:21:1::0;26028:2;26008:18;;;26001:30;-1:-1:-1;;;26047:18:1;;;26040:51;26108:18;;55393:65:0::2;25787:345:1::0;55393:65:0::2;55474:61;55502:10;55522:11;55474:27;:61::i;:::-;55473:62;55465:109;;;::::0;-1:-1:-1;;;55465:109:0;;27389:2:1;55465:109:0::2;::::0;::::2;27371:21:1::0;27428:2;27408:18;;;27401:30;27467:34;27447:18;;;27440:62;-1:-1:-1;;;27518:18:1;;;27511:32;27560:19;;55465:109:0::2;27187:398:1::0;55465:109:0::2;55620:16:::0;;55639:15:::2;55620:34;::::0;;::::2;;55612:65;;;::::0;-1:-1:-1;;;55612:65:0;;27792:2:1;55612:65:0::2;::::0;::::2;27774:21:1::0;27831:2;27811:18;;;27804:30;-1:-1:-1;;;27850:18:1;;;27843:48;27908:18;;55612:65:0::2;27590:342:1::0;55612:65:0::2;55723:9:::0;;55715:44:::2;;;::::0;-1:-1:-1;;;55715:44:0;;28139:2:1;55715:44:0::2;::::0;::::2;28121:21:1::0;28178:2;28158:18;;;28151:30;-1:-1:-1;;;28197:18:1;;;28190:48;28255:18;;55715:44:0::2;27937:342:1::0;55715:44:0::2;55774:9;::::0;::::2;::::0;55766:54:::2;;;::::0;-1:-1:-1;;;55766:54:0;;28486:2:1;55766:54:0::2;::::0;::::2;28468:21:1::0;28525:2;28505:18;;;28498:30;28564;28544:18;;;28537:58;28612:18;;55766:54:0::2;28284:352:1::0;55766:54:0::2;55835:9:::0;;::::2;::::0;55827:51:::2;;;::::0;-1:-1:-1;;;55827:51:0;;28843:2:1;55827:51:0::2;::::0;::::2;28825:21:1::0;28882:2;28862:18;;;28855:30;28921:27;28901:18;;;28894:55;28966:18;;55827:51:0::2;28641:349:1::0;55827:51:0::2;55893:9:::0;;::::2;::::0;55885:46:::2;;;::::0;-1:-1:-1;;;55885:46:0;;29197:2:1;55885:46:0::2;::::0;::::2;29179:21:1::0;29236:2;29216:18;;;29209:30;-1:-1:-1;;;29255:18:1;;;29248:50;29315:18;;55885:46:0::2;28995:344:1::0;55885:46:0::2;55974:16:::0;;55944:27:::2;::::0;55974:34:::2;::::0;55993:15:::2;::::0;55974:34:::2;;;:::i;:::-;55944:64;;56045:1;56023:19;:23;56015:58;;;::::0;-1:-1:-1;;;56015:58:0;;29546:2:1;56015:58:0::2;::::0;::::2;29528:21:1::0;29585:2;29565:18;;;29558:30;-1:-1:-1;;;29604:18:1;;;29597:52;29666:18;;56015:58:0::2;29344:346:1::0;56015:58:0::2;56136:20;56174:12;-1:-1:-1::0;;;;;56159:37:0::2;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56136:62:::0;-1:-1:-1;56242:96:0::2;56280:10;56300:4;56319:18;56136:62:::0;56319:2:::2;:18;:::i;:::-;56307:9:::0;;:30:::2;::::0;;::::2;:::i;:::-;-1:-1:-1::0;;;;;56242:37:0;::::2;::::0;:96;;:37:::2;:96::i;:::-;56385:475;::::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;56385:475:0;;::::2;::::0;;;::::2;;::::0;::::2;::::0;56374:5:::2;::::0;56385:475;;56504:18:::2;56508:14:::0;56504:2:::2;:18;:::i;:::-;56492:9:::0;;:30:::2;::::0;;::::2;:::i;:::-;56385:475:::0;;56851:1:::2;56385:475;::::0;;::::2;::::0;;;;56551:9;::::2;::::0;56385:475;;;;;;;;56584:9;::::2;::::0;56385:475;;;;;;56669:18:::2;56673:14:::0;56669:2:::2;:18;:::i;:::-;56657:9:::0;;::::2;::::0;:30:::2;::::0;;::::2;:::i;:::-;56385:475;;;;56718:1;56385:475;;;;56740:15;56385:475;;;;56775:13;56789:1;56775:16;;;;;;;:::i;:::-;;;;;56385:475;;;;;;56814:13;56828:1;56814:16;;;;;;;:::i;:::-;;;;;56385:475;;;;::::0;56374:487:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;56374:487:0::2;;;;;-1:-1:-1::0;;;;;56374:487:0::2;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;56374:487:0::2;;;;;-1:-1:-1::0;;;;;56374:487:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56898:16;56917:13;;56898:32;;56937:16;:30;56954:12;-1:-1:-1::0;;;;;56937:30:0::2;-1:-1:-1::0;;;;;56937:30:0::2;;;;;;;;;;;;56973:8;56937:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56989:15;:37;57013:11;-1:-1:-1::0;;;;;56989:37:0::2;-1:-1:-1::0;;;;;56989:37:0::2;;;;;;;;;;;;57032:8;56989:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57081:10;57048:20;:30;57069:8;57048:30;;;;;;;;;;;;:43;;;;;-1:-1:-1::0;;;;;57048:43:0::2;;;;;-1:-1:-1::0;;;;;57048:43:0::2;;;;;;57106:13;;57104:15;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;57131:71:0;;::::2;::::0;;::::2;57146:8:::0;57131:71:::2;57192:6:::0;57199:1:::2;57192:9;;;;57131:71;;;;1247:25:1::0;;1235:2;1220:18;;1101:177;57131:71:0::2;;;;;;;;57222:8:::0;54832:2402;-1:-1:-1;;;;;;;;54832:2402:0:o;69045:141::-;69116:14;69146:36;69168:4;69174:7;69146:21;:36::i;25830:204::-;25915:4;-1:-1:-1;;;;;;25939:47:0;;-1:-1:-1;;;25939:47:0;;:87;;-1:-1:-1;;;;;;;;;;23403:40:0;;;25990:36;23303:148;26479:105;26546:30;26557:4;22429:10;26546;:30::i;:::-;26479:105;:::o;8974:162::-;9084:43;;-1:-1:-1;;;;;29887:32:1;;;9084:43:0;;;29869:51:1;29936:18;;;29929:34;;;9057:71:0;;9077:5;;9099:14;;;;;29842:18:1;;9084:43:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9084:43:0;;;;;;;;;;;9057:19;:71::i;71393:139::-;71452:13;71503:17;71516:3;71503:12;:17::i;46099:263::-;46185:4;46202:12;46217:31;46234:4;46240:7;46217:16;:31::i;:::-;46202:46;;46263:7;46259:71;;;46287:18;;;;:12;:18;;;;;:31;;46310:7;46287:22;:31::i;46470:268::-;46557:4;46574:12;46589:32;46607:4;46613:7;46589:17;:32::i;:::-;46574:47;;46636:7;46632:74;;;46660:18;;;;:12;:18;;;;;:34;;46686:7;46660:25;:34::i;49025:293::-;48427:1;49159:7;;:19;49151:63;;;;-1:-1:-1;;;49151:63:0;;30176:2:1;49151:63:0;;;30158:21:1;30215:2;30195:18;;;30188:30;30254:33;30234:18;;;30227:61;30305:18;;49151:63:0;29974:355:1;49151:63:0;48427:1;49292:18;;49025:293::o;73811:340::-;73883:7;74001:1;73990:8;:12;;;73986:96;;;74031:12;74042:1;74031:8;:12;:::i;:::-;74024:20;;:2;:20;:::i;73986:96::-;-1:-1:-1;74099:1:0;;73811:340;-1:-1:-1;73811:340:0:o;70006:783::-;70108:16;;;;:11;:16;;;;;:23;;;;70079:26;;;;;:52;;70108:23;70079:52;:::i;:::-;70061:15;:70;70057:719;;;70144:18;70165:5;70171:3;70165:10;;;;;;;;:::i;:::-;;;;;;;;;70200:16;;;:11;:16;;;;;;;:20;70165:10;;;;;;;;-1:-1:-1;70200:20:0;;70196:500;;;70261:16;;;;:11;:16;;;;;:21;;;70237:20;;;:45;;70261:21;;70237:20;;:45;;70261:21;;70237:45;:::i;:::-;;;;-1:-1:-1;;70339:16:0;;;;:11;:16;;;;;:23;;;70315:20;;;;:47;70311:134;;70406:16;;;;:11;:16;;;;;:23;;;70383:20;;;:46;70311:134;70196:500;;;70501:16;;;;:11;:16;;;;;:21;;;70477:20;;;:45;;70501:21;;70477:20;;:45;;70501:21;;70477:45;:::i;:::-;;;;-1:-1:-1;;70579:16:0;;;;:11;:16;;;;;:23;;;70555:20;;;;:47;70551:134;;70646:16;;;;:11;:16;;;;;:23;;;70623:20;;;:46;70551:134;-1:-1:-1;70716:16:0;;;;:11;:16;;;;;70752:15;70716:52;;:26;;;;:52;70006:783::o;69497:495::-;69546:18;69567:5;69573:3;69567:10;;;;;;;;:::i;:::-;;;;;;;;;;;69546:31;;69590:19;69612:4;:14;;;69590:36;;69637:11;69652:1;69637:16;69633:29;;69655:7;;69497:495;:::o;69633:29::-;69670:26;69717:4;:14;;;69699:15;:32;;;;:::i;:::-;69670:61;;69742:18;69764:1;69742:23;69738:36;;69767:7;;;69497:495;:::o;69738:36::-;69842:16;;;;69788:13;;69842:22;;-1:-1:-1;;;69842:16:0;;;;69861:3;69842:22;:::i;:::-;69804:61;;69805:32;69819:18;69805:11;:32;:::i;:::-;69804:61;;;;:::i;:::-;69788:77;;69904:11;69896:5;:19;:45;;69922:19;69936:5;69922:11;:19;:::i;:::-;69896:45;;;69918:1;69896:45;69879:14;;;:62;-1:-1:-1;;;69948:40:0;69972:15;69948:40;:14;;;;:40;-1:-1:-1;69497:495:0:o;70797:574::-;70855:13;70877:17;70897:5;70903:3;70897:10;;;;;;;;:::i;:::-;;;;;;;;;70877:30;;;;;;;;70897:10;;;;;;;70877:30;;-1:-1:-1;;;;;70877:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;70877:30:0;;;;;;;;70942:51;;-1:-1:-1;;;70942:51:0;;;;70877:30;;-1:-1:-1;70877:30:0;70942:49;;:51;;;;70897:10;;70942:51;;;;;;70877:30;70942:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70920:73;;71000:17;71020:28;71044:3;71020:23;:28::i;:::-;71000:48;-1:-1:-1;71113:21:0;71150:18;71155:13;71150:2;:18;:::i;:::-;71144:25;;:2;:25;:::i;:::-;71137:33;;:2;:33;:::i;:::-;71113:57;-1:-1:-1;71285:4:0;71257:25;71113:57;71257:9;:25;:::i;:::-;:32;;;;:::i;:::-;71249:40;;71318:1;71310:5;:9;71302:46;;;;-1:-1:-1;;;71302:46:0;;30938:2:1;71302:46:0;;;30920:21:1;30977:2;30957:18;;;30950:30;31016:26;30996:18;;;30989:54;31060:18;;71302:46:0;30736:348:1;71302:46:0;71355:12;;;;70797:574;;;:::o;9381:190::-;9509:53;;-1:-1:-1;;;;;31309:32:1;;;9509:53:0;;;31291:51:1;31378:32;;;31358:18;;;31351:60;31427:18;;;31420:34;;;9482:81:0;;9502:5;;9524:18;;;;;31264::1;;9509:53:0;31089:371:1;40168:158:0;40242:7;40293:22;40297:3;40309:5;40293:3;:22::i;40876:282::-;40939:16;40968:22;40993:19;41001:3;40993:7;:19::i;39697:117::-;39760:7;39787:19;39795:3;35025:18;;34942:109;26720:201;26809:22;26817:4;26823:7;26809;:22::i;:::-;26804:110;;26855:47;;-1:-1:-1;;;26855:47:0;;-1:-1:-1;;;;;29887:32:1;;26855:47:0;;;29869:51:1;29936:18;;;29929:34;;;29842:18;;26855:47:0;29695:274:1;15567:738:0;15648:18;15677:19;15817:4;15814:1;15807:4;15801:11;15794:4;15788;15784:15;15781:1;15774:5;15767;15762:60;15876:7;15866:180;;15921:4;15915:11;15967:16;15964:1;15959:3;15944:40;16014:16;16009:3;16002:29;15866:180;-1:-1:-1;;16125:1:0;16119:8;16074:16;;-1:-1:-1;16154:15:0;;:68;;16206:11;16221:1;16206:16;;16154:68;;;-1:-1:-1;;;;;16172:26:0;;;:31;16154:68;16150:148;;;16246:40;;-1:-1:-1;;;16246:40:0;;-1:-1:-1;;;;;7713:32:1;;16246:40:0;;;7695:51:1;7668:18;;16246:40:0;7549:203:1;29556:324:0;29633:4;29655:22;29663:4;29669:7;29655;:22::i;:::-;29650:223;;29694:6;:12;;;;;;;;;;;-1:-1:-1;;;;;29694:29:0;;;;;;;;;:36;;-1:-1:-1;;29694:36:0;29726:4;29694:36;;;29777:12;22429:10;;22349:98;29777:12;-1:-1:-1;;;;;29750:40:0;29768:7;-1:-1:-1;;;;;29750:40:0;29762:4;29750:40;;;;;;;;;;-1:-1:-1;29812:4:0;29805:11;;29650:223;-1:-1:-1;29856:5:0;29849:12;;38872:152;38942:4;38966:50;38971:3;-1:-1:-1;;;;;38991:23:0;;38966:4;:50::i;30124:325::-;30202:4;30223:22;30231:4;30237:7;30223;:22::i;:::-;30219:223;;;30294:5;30262:12;;;;;;;;;;;-1:-1:-1;;;;;30262:29:0;;;;;;;;;;:37;;-1:-1:-1;;30262:37:0;;;30319:40;22429:10;;30262:12;;30319:40;;30294:5;30319:40;-1:-1:-1;30381:4:0;30374:11;;39200:158;39273:4;39297:53;39305:3;-1:-1:-1;;;;;39325:23:0;;39297:7;:53::i;72483:1260::-;72552:7;72568:17;72588:5;72594:3;72588:10;;;;;;;;:::i;:::-;;;;;;;;;72568:30;;;;;;;;72588:10;;;;;;;72568:30;;-1:-1:-1;;;;;72568:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;72568:30:0;;;;;;;;72632:16;;;;;;;;;;72605:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72718:20;72568:30;;-1:-1:-1;72819:20:0;;:38;;-1:-1:-1;72843:14:0;;72819:38;72815:79;;;72877:9;72483:1260;-1:-1:-1;;;;72483:1260:0:o;72815:79::-;72973:19;73013:10;:20;;;72995:15;:38;;;;:::i;:::-;72973:60;;73040:23;73080:10;:17;;;73066:11;:31;;;;:::i;:::-;73040:57;-1:-1:-1;73114:19:0;;73110:605;;73146:23;73190:15;73172:10;:15;;;:33;;;;:::i;:::-;73230:14;;73146:59;;-1:-1:-1;73226:482:0;;;73295:17;;;;73265:27;73277:15;73265:9;:27;:::i;:::-;:47;73261:186;;;73345:10;:17;;;73333:29;;73226:482;;73261:186;73403:28;73416:15;73403:28;;:::i;:::-;;;73226:482;;;73502:9;73483:15;:28;;:79;;;-1:-1:-1;73545:17:0;;;;73515:27;73527:15;73515:9;:27;:::i;:::-;:47;73483:79;73479:218;;;73595:10;:17;;;73583:29;;73479:218;;;73653:28;73666:15;73653:28;;:::i;:::-;;;73479:218;73135:580;73110:605;-1:-1:-1;73730:9:0;;72483:1260;-1:-1:-1;;;;;72483:1260:0:o;35405:120::-;35472:7;35499:3;:11;;35511:5;35499:18;;;;;;;;:::i;:::-;;;;;;;;;35492:25;;35405:120;;;;:::o;36075:111::-;36131:16;36167:3;:11;;36160:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36075:111;;;:::o;32647:416::-;32710:4;34822:21;;;:14;;;:21;;;;;;32727:329;;-1:-1:-1;32770:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;32955:18;;32931:21;;;:14;;;:21;;;;;;:42;;;;32988:11;;33239:1400;33305:4;33436:21;;;:14;;;:21;;;;;;33474:13;;33470:1162;;33847:18;33868:12;33879:1;33868:8;:12;:::i;:::-;33915:18;;33847:33;;-1:-1:-1;33895:17:0;;33915:22;;33936:1;;33915:22;:::i;:::-;33895:42;;33972:9;33958:10;:23;33954:385;;34002:17;34022:3;:11;;34034:9;34022:22;;;;;;;;:::i;:::-;;;;;;;;;34002:42;;34172:9;34146:3;:11;;34158:10;34146:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;34287:25;;;:14;;;:25;;;;;:36;;;33954:385;34420:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;34526:3;:14;;:21;34541:5;34526:21;;;;;;;;;;;34519:28;;;34571:4;34564:11;;;;;;;33470:1162;34615:5;34608:12;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:286:1:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;593:131;-1:-1:-1;;;;;668:31:1;;658:42;;648:70;;714:1;711;704:12;729:367;797:6;805;858:2;846:9;837:7;833:23;829:32;826:52;;;874:1;871;864:12;826:52;913:9;900:23;932:31;957:5;932:31;:::i;:::-;982:5;1060:2;1045:18;;;;1032:32;;-1:-1:-1;;;729:367:1:o;1283:610::-;1369:6;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1486:9;1473:23;1519:18;1511:6;1508:30;1505:50;;;1551:1;1548;1541:12;1505:50;1574:22;;1627:4;1619:13;;1615:27;-1:-1:-1;1605:55:1;;1656:1;1653;1646:12;1605:55;1696:2;1683:16;1722:18;1714:6;1711:30;1708:50;;;1754:1;1751;1744:12;1708:50;1807:7;1802:2;1792:6;1789:1;1785:14;1781:2;1777:23;1773:32;1770:45;1767:65;;;1828:1;1825;1818:12;1767:65;1859:2;1851:11;;;;;1881:6;;-1:-1:-1;1283:610:1;-1:-1:-1;;;1283:610:1:o;2007:787::-;2094:12;;-1:-1:-1;;;;;1964:31:1;1952:44;;2158:4;2151:5;2147:16;2141:23;2173:48;2215:4;2210:3;2206:14;2192:12;-1:-1:-1;;;;;1964:31:1;1952:44;;1898:104;2173:48;;2270:4;2263:5;2259:16;2253:23;2246:4;2241:3;2237:14;2230:47;2326:4;2319:5;2315:16;2309:23;2302:4;2297:3;2293:14;2286:47;2382:4;2375:5;2371:16;2365:23;2358:4;2353:3;2349:14;2342:47;2438:4;2431:5;2427:16;2421:23;2414:4;2409:3;2405:14;2398:47;2493:4;2486:5;2482:16;2476:23;2508:50;2552:4;2547:3;2543:14;2527;-1:-1:-1;;;;;1964:31:1;1952:44;;1898:104;2508:50;;2606:4;2599:5;2595:16;2589:23;2621:47;2662:4;2657:3;2653:14;2637;375:13;368:21;356:34;;305:91;2621:47;-1:-1:-1;2719:6:1;2708:18;;;2702:25;2684:16;;;2677:51;2779:6;2768:18;;;2762:25;2744:16;;2737:51;2007:787::o;2799:705::-;3053:2;3065:21;;;3135:13;;3038:18;;;3157:22;;;3005:4;;3236:15;;;3210:2;3195:18;;;3005:4;3279:199;3293:6;3290:1;3287:13;3279:199;;;3342:52;3390:3;3381:6;3375:13;3342:52;:::i;:::-;3465:2;3453:15;;;;;3423:6;3414:16;;;;;3315:1;3308:9;3279:199;;3509:226;3568:6;3621:2;3609:9;3600:7;3596:23;3592:32;3589:52;;;3637:1;3634;3627:12;3589:52;-1:-1:-1;3682:23:1;;3509:226;-1:-1:-1;3509:226:1:o;3740:268::-;3938:3;3923:19;;3951:51;3927:9;3984:6;3951:51;:::i;4013:247::-;4072:6;4125:2;4113:9;4104:7;4100:23;4096:32;4093:52;;;4141:1;4138;4131:12;4093:52;4180:9;4167:23;4199:31;4224:5;4199:31;:::i;4265:611::-;4455:2;4467:21;;;4537:13;;4440:18;;;4559:22;;;4407:4;;4638:15;;;4612:2;4597:18;;;4407:4;4681:169;4695:6;4692:1;4689:13;4681:169;;;4756:13;;4744:26;;4799:2;4825:15;;;;4790:12;;;;4717:1;4710:9;4681:169;;5294:367;5362:6;5370;5423:2;5411:9;5402:7;5398:23;5394:32;5391:52;;;5439:1;5436;5429:12;5391:52;5484:23;;;-1:-1:-1;5583:2:1;5568:18;;5555:32;5596:33;5555:32;5596:33;:::i;:::-;5648:7;5638:17;;;5294:367;;;;;:::o;6706:487::-;6783:6;6791;6799;6852:2;6840:9;6831:7;6827:23;6823:32;6820:52;;;6868:1;6865;6858:12;6820:52;6913:23;;;-1:-1:-1;7033:2:1;7018:18;;7005:32;;-1:-1:-1;7115:2:1;7100:18;;7087:32;7128:33;7087:32;7128:33;:::i;:::-;7180:7;7170:17;;;6706:487;;;;;:::o;7198:346::-;7266:6;7274;7327:2;7315:9;7306:7;7302:23;7298:32;7295:52;;;7343:1;7340;7333:12;7295:52;-1:-1:-1;;7388:23:1;;;7508:2;7493:18;;;7480:32;;-1:-1:-1;7198:346:1:o;7757:388::-;7825:6;7833;7886:2;7874:9;7865:7;7861:23;7857:32;7854:52;;;7902:1;7899;7892:12;7854:52;7941:9;7928:23;7960:31;7985:5;7960:31;:::i;:::-;8010:5;-1:-1:-1;8067:2:1;8052:18;;8039:32;8080:33;8039:32;8080:33;:::i;8150:757::-;8242:6;8250;8258;8266;8274;8327:3;8315:9;8306:7;8302:23;8298:33;8295:53;;;8344:1;8341;8334:12;8295:53;8389:23;;;-1:-1:-1;8488:2:1;8473:18;;8460:32;8530:15;;8523:23;8511:36;;8501:64;;8561:1;8558;8551:12;8501:64;8150:757;;8584:7;;-1:-1:-1;;;;8664:2:1;8649:18;;8636:32;;8767:2;8752:18;;8739:32;;8870:3;8855:19;;;8842:33;;-1:-1:-1;8150:757:1:o;8912:637::-;9102:2;9114:21;;;9184:13;;9087:18;;;9206:22;;;9054:4;;9285:15;;;9259:2;9244:18;;;9054:4;9328:195;9342:6;9339:1;9336:13;9328:195;;;9407:13;;-1:-1:-1;;;;;9403:39:1;9391:52;;9472:2;9498:15;;;;9463:12;;;;9439:1;9357:9;9328:195;;11016:163;11083:20;;11143:10;11132:22;;11122:33;;11112:61;;11169:1;11166;11159:12;11112:61;11016:163;;;:::o;11184:184::-;11242:6;11295:2;11283:9;11274:7;11270:23;11266:32;11263:52;;;11311:1;11308;11301:12;11263:52;11334:28;11352:9;11334:28;:::i;11373:127::-;11434:10;11429:3;11425:20;11422:1;11415:31;11465:4;11462:1;11455:15;11489:4;11486:1;11479:15;11505:372;11576:2;11570:9;11641:2;11622:13;;-1:-1:-1;;11618:27:1;11606:40;;11676:18;11661:34;;11697:22;;;11658:62;11655:185;;;11762:10;11757:3;11753:20;11750:1;11743:31;11797:4;11794:1;11787:15;11825:4;11822:1;11815:15;11655:185;11856:2;11849:22;11505:372;;-1:-1:-1;11505:372:1:o;11882:566::-;11931:5;11984:3;11977:4;11969:6;11965:17;11961:27;11951:55;;12002:1;11999;11992:12;11951:55;12103:19;12081:2;12103:19;:::i;:::-;12146:3;12184:2;12176:6;12172:15;12210:3;12202:6;12199:15;12196:35;;;12227:1;12224;12217:12;12196:35;12251:6;12266:151;12282:6;12277:3;12274:15;12266:151;;;12350:22;12368:3;12350:22;:::i;:::-;12338:35;;12402:4;12393:14;;;;12299;12266:151;;12453:1115;12597:6;12605;12613;12621;12674:3;12662:9;12653:7;12649:23;12645:33;12642:53;;;12691:1;12688;12681:12;12642:53;12730:9;12717:23;12749:31;12774:5;12749:31;:::i;:::-;12799:5;-1:-1:-1;12856:2:1;12841:18;;12828:32;12869:33;12828:32;12869:33;:::i;:::-;12921:7;-1:-1:-1;12966:2:1;12951:18;;12947:32;-1:-1:-1;12937:60:1;;12993:1;12990;12983:12;12937:60;13095:20;13072:3;13095:20;:::i;:::-;13137:3;13178;13167:9;13163:19;13205:7;13197:6;13194:19;13191:39;;;13226:1;13223;13216:12;13191:39;13265:2;13254:9;13250:18;13277:202;13293:6;13288:3;13285:15;13277:202;;;13387:17;;13417:20;;13466:2;13457:12;;;;13310;13277:202;;;13281:3;13498:5;13488:15;;13522:40;13554:7;13546:6;13522:40;:::i;:::-;13512:50;;;;;12453:1115;;;;;;;:::o;13573:127::-;13634:10;13629:3;13625:20;13622:1;13615:31;13665:4;13662:1;13655:15;13689:4;13686:1;13679:15;13705:342;13907:2;13889:21;;;13946:2;13926:18;;;13919:30;-1:-1:-1;;;13980:2:1;13965:18;;13958:48;14038:2;14023:18;;13705:342::o;14394:127::-;14455:10;14450:3;14446:20;14443:1;14436:31;14486:4;14483:1;14476:15;14510:4;14507:1;14500:15;14526:128;14593:9;;;14614:11;;;14611:37;;;14628:18;;:::i;15363:273::-;15431:6;15484:2;15472:9;15463:7;15459:23;15455:32;15452:52;;;15500:1;15497;15490:12;15452:52;15532:9;15526:16;15582:4;15575:5;15571:16;15564:5;15561:27;15551:55;;15602:1;15599;15592:12;17053:125;17118:9;;;17139:10;;;17136:36;;;17152:18;;:::i;17183:135::-;17222:3;17243:17;;;17240:43;;17263:18;;:::i;:::-;-1:-1:-1;17310:1:1;17299:13;;17183:135::o;19079:151::-;19169:4;19162:12;;;19148;;;19144:31;;19187:14;;19184:40;;;19204:18;;:::i;19235:375::-;19323:1;19341:5;19355:249;19376:1;19366:8;19363:15;19355:249;;;19426:4;19421:3;19417:14;19411:4;19408:24;19405:50;;;19435:18;;:::i;:::-;19485:1;19475:8;19471:16;19468:49;;;19499:16;;;;19468:49;19582:1;19578:16;;;;;19538:15;;19355:249;;;19235:375;;;;;;:::o;19615:902::-;19664:5;19694:8;19684:80;;-1:-1:-1;19735:1:1;19749:5;;19684:80;19783:4;19773:76;;-1:-1:-1;19820:1:1;19834:5;;19773:76;19865:4;19883:1;19878:59;;;;19951:1;19946:174;;;;19858:262;;19878:59;19908:1;19899:10;;19922:5;;;19946:174;19983:3;19973:8;19970:17;19967:43;;;19990:18;;:::i;:::-;-1:-1:-1;;20046:1:1;20032:16;;20105:5;;19858:262;;20204:2;20194:8;20191:16;20185:3;20179:4;20176:13;20172:36;20166:2;20156:8;20153:16;20148:2;20142:4;20139:12;20135:35;20132:77;20129:203;;;-1:-1:-1;20241:19:1;;;20317:5;;20129:203;20364:42;-1:-1:-1;;20389:8:1;20383:4;20364:42;:::i;:::-;20442:6;20438:1;20434:6;20430:19;20421:7;20418:32;20415:58;;;20453:18;;:::i;:::-;20491:20;;19615:902;-1:-1:-1;;;19615:902:1:o;20522:140::-;20580:5;20609:47;20650:4;20640:8;20636:19;20630:4;20609:47;:::i;20667:217::-;20707:1;20733;20723:132;;20777:10;20772:3;20768:20;20765:1;20758:31;20812:4;20809:1;20802:15;20840:4;20837:1;20830:15;20723:132;-1:-1:-1;20869:9:1;;20667:217::o;20889:168::-;20962:9;;;20993;;21010:15;;;21004:22;;20990:37;20980:71;;21031:18;;:::i;21776:184::-;21846:6;21899:2;21887:9;21878:7;21874:23;21870:32;21867:52;;;21915:1;21912;21905:12;21867:52;-1:-1:-1;21938:16:1;;21776:184;-1:-1:-1;21776:184:1:o;25612:170::-;25709:10;25702:18;;;25682;;;25678:43;;25733:20;;25730:46;;;25756:18;;:::i;30334:244::-;30445:10;30418:18;;;30438;;;30414:43;30477:28;;;;30524:24;;;30514:58;;30552:18;;:::i;30583:148::-;30671:4;30650:12;;;30664;;;30646:31;;30689:13;;30686:39;;;30705:18;;:::i;31744:127::-;31805:10;31800:3;31796:20;31793:1;31786:31;31836:4;31833:1;31826:15;31860:4;31857:1;31850:15
Swarm Source
ipfs://b0f928d8841dbc0a8450c59e6aefb322928dddab57f8f749de1ee2e8e5d1d0f2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.