More Info
Private Name Tags
ContractCreator
Multichain Info
No addresses found
Latest 25 from a total of 19,815 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Cancel Offer | 15799942 | 57 days ago | IN | 0 ETH | 0.00000009 | ||||
Cancel Offer | 13216575 | 117 days ago | IN | 0 ETH | 0.00000007 | ||||
Cancel Offer | 8194194 | 233 days ago | IN | 0 ETH | 0 | ||||
Cancel Offer | 7936495 | 239 days ago | IN | 0 ETH | 0.00000011 | ||||
Revoke Role | 7136722 | 258 days ago | IN | 0 ETH | 0.00000008 | ||||
Cancel Offer | 6422961 | 274 days ago | IN | 0 ETH | 0.00000006 | ||||
Settle Cancelled | 5906891 | 286 days ago | IN | 0 ETH | 0.00000003 | ||||
Cancel Offer | 5870454 | 287 days ago | IN | 0 ETH | 0 | ||||
Settle Cancelled | 5736667 | 290 days ago | IN | 0 ETH | 0 | ||||
Cancel Offer | 5427652 | 298 days ago | IN | 0 ETH | 0.00000045 | ||||
Cancel Offer | 5407571 | 298 days ago | IN | 0 ETH | 0.00000069 | ||||
Settle Cancelled | 5387532 | 298 days ago | IN | 0 ETH | 0.00000069 | ||||
Settle Cancelled | 5380165 | 299 days ago | IN | 0 ETH | 0.00000067 | ||||
Settle Cancelled | 5380076 | 299 days ago | IN | 0 ETH | 0.00000066 | ||||
Settle Cancelled | 5380046 | 299 days ago | IN | 0 ETH | 0.00000066 | ||||
Settle Cancelled | 5379449 | 299 days ago | IN | 0 ETH | 0.00000069 | ||||
Cancel Offer | 5374924 | 299 days ago | IN | 0 ETH | 0.00000071 | ||||
Settle Cancelled | 5373353 | 299 days ago | IN | 0 ETH | 0.00000071 | ||||
Settle Cancelled... | 5349825 | 299 days ago | IN | 0 ETH | 0.00000099 | ||||
Settle Cancelled... | 5349791 | 299 days ago | IN | 0 ETH | 0.00000098 | ||||
Settle Cancelled... | 5349735 | 299 days ago | IN | 0 ETH | 0.00000162 | ||||
Settle Cancelled... | 5349694 | 299 days ago | IN | 0 ETH | 0.00000174 | ||||
Settle Cancelled... | 5349612 | 299 days ago | IN | 0 ETH | 0.00000049 | ||||
Settle Cancelled | 5348056 | 299 days ago | IN | 0 ETH | 0.0000031 | ||||
Settle Filleds | 5344631 | 299 days ago | IN | 0 ETH | 0.00000886 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
15799942 | 57 days ago | 0.00000136 ETH | ||||
15799942 | 57 days ago | 0.00027163 ETH | ||||
13216575 | 117 days ago | 0.00000013 ETH | ||||
13216575 | 117 days ago | 0.00002686 ETH | ||||
8194194 | 233 days ago | 0.00001428 ETH | ||||
8194194 | 233 days ago | 0.00284271 ETH | ||||
7936495 | 239 days ago | 0.00001432 ETH | ||||
7936495 | 239 days ago | 0.00284968 ETH | ||||
6422961 | 274 days ago | 0.00000135 ETH | ||||
6422961 | 274 days ago | 0.00026964 ETH | ||||
5906891 | 286 days ago | 0.00002 ETH | ||||
5870454 | 287 days ago | 0.00000001 ETH | ||||
5870454 | 287 days ago | 0.00000199 ETH | ||||
5427652 | 298 days ago | 0.00001418 ETH | ||||
5427652 | 298 days ago | 0.00282182 ETH | ||||
5407571 | 298 days ago | 0.00000001 ETH | ||||
5407571 | 298 days ago | 0.00000298 ETH | ||||
5387532 | 298 days ago | 1.935064 ETH | ||||
5380165 | 299 days ago | 2.907924 ETH | ||||
5380076 | 299 days ago | 7.95818 ETH | ||||
5380046 | 299 days ago | 7.90636 ETH | ||||
5379449 | 299 days ago | 0.00704 ETH | ||||
5374924 | 299 days ago | 0.00001427 ETH | ||||
5374924 | 299 days ago | 0.00283973 ETH | ||||
5373353 | 299 days ago | 0.005936 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
PremiusMarketBlast
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at blastscan.io on 2024-05-14 */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol) pragma solidity ^0.8.20; /** * @dev External interface of AccessControl declared to support ERC165 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, an admin role * bearer except when using {AccessControl-_setupRole}. */ 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; } // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) 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; } } // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * 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[EIP 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); } // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 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; } } // OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol) 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; } } } // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ 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); } // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.20; /** * @dev Interface for the optional metadata functions from the ERC20 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); } // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success,) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget(address target, bool success, bytes memory returndata) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } } // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; /** * @title SafeERC20 * @dev Wrappers around ERC20 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 { using Address for address; /** * @dev An operation with an ERC20 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. */ 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. */ 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. */ 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 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). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { 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 silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } } // OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; /** * @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; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); 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 if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // 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.0; interface IBlastPoints { function configurePointsOperator(address operator) external; function configurePointsOperatorOnBehalf(address contractAddress, address operator) external; } pragma solidity ^0.8.20; contract Blastpoint { // https://docs.blast.io/airdrop/mainnet-points-api/how-to-integrate-api // be sure to use the appropriate testnet/mainnet BlastPoints address // BlastPoints Testnet address: 0x2fc95838c71e76ec69ff817983BFf17c710F34E0 // BlastPoints Mainnet address: 0x2536FE9ab3F511540F2f9e2eC2A805005C3Dd800 IBlastPoints public constant BLAST_POINT = IBlastPoints(0x2536FE9ab3F511540F2f9e2eC2A805005C3Dd800); function _configurePointsOperator(address _operator) internal { BLAST_POINT.configurePointsOperator(_operator); } function _configurePointsOperatorOnBehalf(address _contractAddress, address _operator) internal { BLAST_POINT.configurePointsOperatorOnBehalf(_contractAddress, _operator); } } pragma solidity ^0.8.0; enum YieldMode { AUTOMATIC, VOID, CLAIMABLE } enum GasMode { VOID, CLAIMABLE } interface IBlast { // configure function configureContract(address contractAddress, YieldMode _yield, GasMode gasMode, address governor) external; function configure(YieldMode _yield, GasMode gasMode, address governor) external; // base configuration options function configureClaimableYield() external; function configureClaimableYieldOnBehalf(address contractAddress) external; function configureAutomaticYield() external; function configureAutomaticYieldOnBehalf(address contractAddress) external; function configureVoidYield() external; function configureVoidYieldOnBehalf(address contractAddress) external; function configureClaimableGas() external; function configureClaimableGasOnBehalf(address contractAddress) external; function configureVoidGas() external; function configureVoidGasOnBehalf(address contractAddress) external; function configureGovernor(address _governor) external; function configureGovernorOnBehalf(address _newGovernor, address contractAddress) external; // claim yield function claimYield(address contractAddress, address recipientOfYield, uint256 amount) external returns (uint256); function claimAllYield(address contractAddress, address recipientOfYield) external returns (uint256); // claim gas function claimAllGas(address contractAddress, address recipientOfGas) external returns (uint256); function claimGasAtMinClaimRate(address contractAddress, address recipientOfGas, uint256 minClaimRateBips) external returns (uint256); function claimMaxGas(address contractAddress, address recipientOfGas) external returns (uint256); function claimGas(address contractAddress, address recipientOfGas, uint256 gasToClaim, uint256 gasSecondsToConsume) external returns (uint256); // read functions function readClaimableYield(address contractAddress) external view returns (uint256); function readYieldConfiguration(address contractAddress) external view returns (uint8); function readGasParams(address contractAddress) external view returns (uint256 etherSeconds, uint256 etherBalance, uint256 lastUpdated, GasMode); } pragma solidity ^0.8.0; enum YieldModeERC20 { AUTOMATIC, VOID, CLAIMABLE } interface IERC20Rebasing { // changes the yield mode of the caller and update the balance // to reflect the configuration function configure(YieldModeERC20) external returns (uint256); // "claimable" yield mode accounts can call this this claim their yield // to another address function claim(address recipient, uint256 amount) external returns (uint256); // read the claimable amount for an account function getClaimableAmount(address account) external view returns (uint256); } pragma solidity ^0.8.20; contract Blastyield { IBlast public constant BLAST = IBlast(0x4300000000000000000000000000000000000002); // todo change this to mainet befor product // NOTE: these addresses differ on the Blast mainnet and testnet; the lines below are the mainnet addresses IERC20Rebasing public constant USDB = IERC20Rebasing(0x4300000000000000000000000000000000000003); IERC20Rebasing public constant WETH = IERC20Rebasing(0x4300000000000000000000000000000000000004); // NOTE: the commented lines below are the testnet addresses // IERC20Rebasing public constant USDB = IERC20Rebasing(0x4200000000000000000000000000000000000022); // IERC20Rebasing public constant WETH = IERC20Rebasing(0x4200000000000000000000000000000000000023); function getClaimableAmount(address token) public view returns (uint256) { return IERC20Rebasing(token).getClaimableAmount(address(this)); } function _claimAllYield(address receiver) internal { //internal function to claim the yield BLAST.claimAllYield(address(this), receiver); } function _claimAllGas(address receiver) internal { //internal function to claim the gas BLAST.claimAllGas(address(this), receiver); } function _claimYield(address token, address receiver) internal { uint256 claimableAmount = getClaimableAmount(token); IERC20Rebasing(token).claim(receiver, claimableAmount); } function _initBlastYield() internal { //Blast configuration for claimable yield BLAST.configureClaimableYield(); BLAST.configureClaimableGas(); USDB.configure(YieldModeERC20.CLAIMABLE); //configure claimable yield for USDB WETH.configure(YieldModeERC20.CLAIMABLE); //configure claimable yield for WETH } } pragma solidity ^0.8.16; struct Token { address token; uint48 settleTime; uint48 settleDuration; uint152 settleRate; // number of token per point uint8 status; // } struct Offer { uint8 offerType; bytes32 tokenId; address exToken; uint256 amount; uint256 value; uint256 collateral; uint256 filledAmount; uint8 status; address offeredBy; bool fullMatch; } struct Order { uint256 offerId; uint256 amount; address seller; address buyer; uint8 status; } struct Config { uint256 pledgeRate; uint256 feeRefund; uint256 feeSettle; address feeWallet; } contract PremiusMarketBlast is AccessControl, ReentrancyGuard, Blastyield, Blastpoint { using SafeERC20 for IERC20; uint256 constant WEI6 = 10 ** 6; uint8 constant OFFER_BUY = 1; uint8 constant OFFER_SELL = 2; // Status // Offer status uint8 constant STATUS_OFFER_OPEN = 1; uint8 constant STATUS_OFFER_FILLED = 2; uint8 constant STATUS_OFFER_CANCELLED = 3; // Order Status uint8 constant STATUS_ORDER_OPEN = 1; uint8 constant STATUS_ORDER_SETTLE_FILLED = 2; uint8 constant STATUS_ORDER_SETTLE_CANCELLED = 3; uint8 constant STATUS_ORDER_CANCELLED = 3; // token status uint8 constant STATUS_TOKEN_ACTIVE = 1; uint8 constant STATUS_TOKEN_INACTIVE = 2; uint8 constant STATUS_TOKEN_SETTLE = 3; bytes32 public constant OPERATOR_ROLE = keccak256("OPERATOR_ROLE"); mapping(address => bool) public acceptedTokens; mapping(bytes32 => bool) public tokenCreated; mapping(bytes32 => Token) public tokens; mapping(uint256 => Offer) public offers; uint256 public lastOfferId; mapping(uint256 => Order) public orders; uint256 public lastOrderId; Config public config; // event event NewOffer( uint256 id, uint8 offerType, bytes32 tokenId, address exToken, uint256 amount, uint256 value, uint256 collateral, bool fullMatch, address doer ); event NewToken(bytes32 tokenId, uint256 settleDuration); event NewOrder(uint256 id, uint256 offerId, uint256 amount, address seller, address buyer); event SettleFilled(uint256 orderId, uint256 value, uint256 fee, address doer); event SettleCancelled(uint256 orderId, uint256 value, uint256 fee, address doer); event CancelOrder(uint256 orderId, address doer); event CancelOffer(uint256 offerId, uint256 refundValue, uint256 refundFee, address doer); event UpdateAcceptedTokens(address[] tokens, bool isAccepted); event CloseOffer(uint256 offerId, uint256 refundAmount); event UpdateConfig( address oldFeeWallet, uint256 oldFeeSettle, uint256 oldFeeRefund, uint256 oldPledgeRate, address newFeeWallet, uint256 newFeeSettle, uint256 newFeeRefund, uint256 newPledgeRate ); event TokenToSettlePhase(bytes32 tokenId, address token, uint256 settleRate, uint256 settleTime); event UpdateTokenStatus(bytes32 tokenId, uint8 oldValue, uint8 newValue); event TokenForceCancelSettlePhase(bytes32 tokenId); event Settle2Steps(uint256 orderId, bytes32 hash, address doer); event UpdateTokenSettleDuration(bytes32 tokenId, uint48 oldValue, uint48 newValue); constructor(address feeWalletAddress) { require(feeWalletAddress != address(0), "Fee wallet address cannot be the zero address"); _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(OPERATOR_ROLE, msg.sender); config.pledgeRate = WEI6; // 1:1 config.feeWallet = feeWalletAddress; config.feeSettle = 0; // 0% config.feeRefund = 0; // 0% } /////////////////////////// ////// SYSTEM ACTION ////// /////////////////////////// /** * @dev Creates a new token. Only addresses with the OPERATOR_ROLE role can call this function. * @param tokenId The unique identifier of the token. * @param settleDuration The duration of the settlement, in seconds, representing the time from the start of the transaction to when it can be settled. */ function createToken(bytes32 tokenId, uint48 settleDuration) external onlyRole(OPERATOR_ROLE) { require(settleDuration >= 24 * 60 * 60, "createToken: Minimum 24h for settling"); //+ require(!tokenCreated[tokenId], "createToken: Token already exists"); tokenCreated[tokenId] = true; Token storage _token = tokens[tokenId]; _token.settleDuration = settleDuration; _token.status = STATUS_TOKEN_ACTIVE; emit NewToken(tokenId, settleDuration); } /** * @dev Moves a token to the settlement phase. Only addresses with the OPERATOR_ROLE role can call this function. * @param tokenId The unique identifier of the token. * @param tokenAddress The contract address of the token. * @param settleRate The settlement rate, representing how many tokens can be exchanged for 1M points. */ function tokenToSettlePhase( bytes32 tokenId, address tokenAddress, uint152 settleRate // how many token for 1M points ) external onlyRole(OPERATOR_ROLE) { Token storage _token = tokens[tokenId]; require(tokenAddress != address(0), "tokenToSettlePhase: Invalid Token Address"); require(settleRate > 0, "tokenToSettlePhase:Invalid Settle Rate"); require( _token.status == STATUS_TOKEN_ACTIVE || _token.status == STATUS_TOKEN_INACTIVE, "tokenToSettlePhase:Invalid Token Status" ); _token.token = tokenAddress; _token.settleRate = settleRate; // update token settle status & time _token.status = STATUS_TOKEN_SETTLE; _token.settleTime = uint48(block.timestamp); emit TokenToSettlePhase(tokenId, tokenAddress, settleRate, block.timestamp); } /** * @param tokenId The unique identifier of the token. */ function tokenToggleActivation(bytes32 tokenId) external onlyRole(OPERATOR_ROLE) { Token storage _token = tokens[tokenId]; uint8 fromStatus = _token.status; uint8 toStatus = fromStatus == STATUS_TOKEN_ACTIVE ? STATUS_TOKEN_INACTIVE : STATUS_TOKEN_ACTIVE; require(fromStatus == STATUS_TOKEN_ACTIVE || fromStatus == STATUS_TOKEN_INACTIVE, "Cannot Change Token Status"); _token.status = toStatus; emit UpdateTokenStatus(tokenId, fromStatus, toStatus); } /** * @param tokenId The unique identifier of the token. */ function tokenForceCancelSettlePhase(bytes32 tokenId) external onlyRole(OPERATOR_ROLE) { Token storage _token = tokens[tokenId]; require(_token.status == STATUS_TOKEN_SETTLE, "Invalid Token Status"); _token.status = STATUS_TOKEN_INACTIVE; emit TokenForceCancelSettlePhase(tokenId); } /** * @param tokenId The unique identifier of the token. * @param newValue The new settle duration value in seconds. */ function updateSettleDuration(bytes32 tokenId, uint48 newValue) external onlyRole(OPERATOR_ROLE) { require(newValue >= 24 * 60 * 60, "Minimum 24h for settling"); Token storage _token = tokens[tokenId]; uint48 oldValue = _token.settleDuration; _token.settleDuration = newValue; emit UpdateTokenSettleDuration(tokenId, oldValue, newValue); } /** * @param orderId The ID of the order to be canceled. */ function forceCancelOrder(uint256 orderId) public nonReentrant onlyRole(OPERATOR_ROLE) { Order storage order = orders[orderId]; Offer storage offer = offers[order.offerId]; require(order.status == STATUS_OFFER_OPEN, "Invalid Order Status"); // PMA-3 uint8 targetDecimals; if (offer.exToken == address(0)) { targetDecimals = 18; } else { targetDecimals = IERC20Metadata(offer.exToken).decimals(); } // calculate refund value uint256 buyerRefundValue = convertDecimals( (order.amount * offer.value) / offer.amount, 18, // source decimals targetDecimals ); uint256 sellerRefundValue = convertDecimals( (order.amount * offer.collateral) / offer.amount, 18, // source decimals targetDecimals ); address buyer = order.buyer; address seller = order.seller; // refund if (offer.exToken == address(0)) { // refund ETH if (buyerRefundValue > 0 && buyer != address(0)) { (bool success,) = buyer.call{value: buyerRefundValue}(""); require(success, "Transfer Funds to Seller Fail"); } if (sellerRefundValue > 0 && seller != address(0)) { (bool success,) = seller.call{value: sellerRefundValue}(""); require(success, "Transfer Funds to Seller Fail"); } } else { IERC20 iexToken = IERC20(offer.exToken); if (buyerRefundValue > 0 && buyer != address(0)) { iexToken.safeTransfer(buyer, buyerRefundValue); } if (sellerRefundValue > 0 && seller != address(0)) { iexToken.safeTransfer(seller, sellerRefundValue); } } order.status = STATUS_ORDER_CANCELLED; emit CancelOrder(orderId, _msgSender()); } /** * @param orderId The ID of the order being settled. * @param hash A hash representing transaction details or verification information, used for additional security or validation. */ function settle2Steps(uint256 orderId, bytes32 hash) public nonReentrant onlyRole(OPERATOR_ROLE) { Order storage order = orders[orderId]; Offer storage offer = offers[order.offerId]; Token storage token = tokens[offer.tokenId]; // check condition require(token.status == STATUS_TOKEN_SETTLE, "Invalid Status"); require(token.token != address(0) && token.settleRate > 0, "Token Not Set"); //PMA-5 require(token.settleTime > 0, "Settling Time Not Started"); require(order.status == STATUS_ORDER_OPEN, "Invalid Order Status"); uint8 targetDecimals; if (offer.exToken == address(0)) { targetDecimals = 18; } else { targetDecimals = IERC20Metadata(offer.exToken).decimals(); } // calculate and adjust the precision of the settlement value uint256 collateral = convertDecimals((order.amount * offer.collateral) / offer.amount, 18, targetDecimals); uint256 value = convertDecimals((order.amount * offer.value) / offer.amount, 18, targetDecimals); // transfer liquid to seller uint256 settleFee = (value * config.feeSettle) / WEI6; uint256 totalValue = value + collateral - settleFee; if (offer.exToken == address(0)) { // by ETH (bool success1,) = order.seller.call{value: totalValue}(""); (bool success2,) = config.feeWallet.call{value: settleFee}(""); require(success1 && success2, "Transfer Funds Fail"); } else { // by exToken IERC20 iexToken = IERC20(offer.exToken); iexToken.safeTransfer(order.seller, totalValue); iexToken.safeTransfer(config.feeWallet, settleFee); } order.status = STATUS_ORDER_SETTLE_FILLED; emit Settle2Steps(orderId, hash, _msgSender()); emit SettleFilled(orderId, totalValue, settleFee, _msgSender()); } /** * @param orderIds An array of order IDs to be settled. * @param hashes An array of hashes, each corresponding to a transaction in the `orderIds` array for verification. */ function settle2StepsBatch(uint256[] memory orderIds, bytes32[] memory hashes) external { require(orderIds.length == hashes.length, "Invalid Input"); for (uint256 i = 0; i < orderIds.length; i++) { settle2Steps(orderIds[i], hashes[i]); } } /////////////////////////////// ////// BLAST CLAIM YIELD ////// /////////////////////////////// function initBlastYield() external onlyRole(DEFAULT_ADMIN_ROLE) { _initBlastYield(); } function claimEthYield() external onlyRole(DEFAULT_ADMIN_ROLE) { _claimAllYield(config.feeWallet); } function claimAllGas() external onlyRole(DEFAULT_ADMIN_ROLE) { _claimAllGas(config.feeWallet); } function claimTokenYeild(address _token) external onlyRole(DEFAULT_ADMIN_ROLE) { _claimYield(_token, config.feeWallet); } /////////////////////////// ////// BLAST POINT ////// /////////////////////////// function configurePointsOperator(address pointOperator) external onlyRole(DEFAULT_ADMIN_ROLE) { _configurePointsOperator(pointOperator); } function configurePointsOperatorOnBehalf(address contractAddress, address pointOperator) external onlyRole(DEFAULT_ADMIN_ROLE) { _configurePointsOperatorOnBehalf(contractAddress, pointOperator); } ///////////////////////// ////// USER ACTION ////// ///////////////////////// /** * @param offerType Specifies the type of offer: 1 for buy, 2 for sell. * @param tokenId The unique identifier of the token for which the offer is being made. * @param amount The amount of tokens being offered for buy/sell. * @param value The total value (in exchange token or ETH) that the offerer is willing to pay or receive. * @param exToken The token address against which the offer is being made. Address(0) if the offer is in ETH. * @param fullMatch A boolean indicating if the offer must be fully matched (true) or can be partially filled (false). */ function newOffer(uint8 offerType, bytes32 tokenId, uint256 amount, uint256 value, address exToken, bool fullMatch) external nonReentrant { Token storage token = tokens[tokenId]; require(token.status == STATUS_TOKEN_ACTIVE, "Invalid Token"); require(exToken != address(0) && acceptedTokens[exToken], "Invalid Offer Token"); require(amount > 0 && value > 0, "Invalid Amount or Value"); uint8 targetDecimals = IERC20Metadata(exToken).decimals(); uint256 adjustedValue = convertDecimalsCeil(value, 18, targetDecimals); uint256 collateral = (value * config.pledgeRate) / WEI6; uint256 adjustedCollateral = convertDecimalsCeil(collateral, 18, targetDecimals); uint256 _transferAmount = offerType == OFFER_BUY ? adjustedValue : adjustedCollateral; IERC20 iexToken = IERC20(exToken); iexToken.safeTransferFrom(_msgSender(), address(this), _transferAmount); // create new offer _newOffer(offerType, tokenId, exToken, amount, value, collateral, fullMatch); } /** * @param offerType, tokenId, amount, value, and fullMatch parameters have the same definitions as in `newOffer`. */ function newOfferETH(uint8 offerType, bytes32 tokenId, uint256 amount, uint256 value, bool fullMatch) external payable nonReentrant { Token storage token = tokens[tokenId]; require(token.status == STATUS_TOKEN_ACTIVE, "Invalid Token"); require(amount > 0 && value > 0, "Invalid Amount or Value"); // collateral uint256 collateral = (value * config.pledgeRate) / WEI6; uint256 _ethAmount = offerType == OFFER_BUY ? value : collateral; require(_ethAmount <= msg.value, "Insufficient Funds"); // (PMA-1)If the sent ETH is more than required, refund the excess if (msg.value > _ethAmount) { uint256 excessAmount = msg.value - _ethAmount; (bool refundSuccess,) = msg.sender.call{value: excessAmount}(""); require(refundSuccess, "Refund of excess ETH failed"); } // create new offer _newOffer(offerType, tokenId, address(0), amount, value, collateral, fullMatch); } /** * @param offerId The ID of the offer being filled. * @param amount The amount of the offer the filler wishes to fulfill. Must not exceed the available amount in the offer. */ function fillOffer(uint256 offerId, uint256 amount) external nonReentrant { Offer storage offer = offers[offerId]; Token storage token = tokens[offer.tokenId]; require(offer.status == STATUS_OFFER_OPEN, "Invalid Offer Status"); require(token.status == STATUS_TOKEN_ACTIVE, "Invalid token Status"); require(amount > 0, "Invalid Amount"); require(offer.amount - offer.filledAmount >= amount, "Insufficient Allocations"); require(offer.fullMatch == false || offer.amount == amount, "FullMatch required"); require(offer.exToken != address(0), "Invalid Offer Token"); // transfer value or collateral IERC20 iexToken = IERC20(offer.exToken); uint256 _transferAmount; address buyer; address seller; uint8 targetDecimals = IERC20Metadata(offer.exToken).decimals(); if (offer.offerType == OFFER_BUY) { uint256 collateralAmount = (offer.collateral * amount) / offer.amount; _transferAmount = convertDecimalsCeil(collateralAmount, 18, targetDecimals); buyer = offer.offeredBy; seller = _msgSender(); } else { uint256 valueAmount = (offer.value * amount) / offer.amount; _transferAmount = convertDecimalsCeil(valueAmount, 18, targetDecimals); buyer = _msgSender(); seller = offer.offeredBy; } iexToken.safeTransferFrom(_msgSender(), address(this), _transferAmount); // new order _fillOffer(offerId, amount, buyer, seller); } /** * @param offerId The ID of the offer to be filled. * @param amount The amount of the offer that the user wishes to fulfill. */ function fillOfferETH(uint256 offerId, uint256 amount) external payable nonReentrant { Offer storage offer = offers[offerId]; Token storage token = tokens[offer.tokenId]; require(offer.status == STATUS_OFFER_OPEN, "Invalid Offer Status"); require(token.status == STATUS_TOKEN_ACTIVE, "Invalid token Status"); require(amount > 0, "Invalid Amount"); require(offer.amount - offer.filledAmount >= amount, "Insufficient Allocations"); require(offer.fullMatch == false || offer.amount == amount, "FullMatch required"); require(offer.exToken == address(0), "Invalid Offer Token"); // transfer value or collecteral uint256 _ethAmount; address buyer; address seller; if (offer.offerType == OFFER_BUY) { _ethAmount = (offer.collateral * amount) / offer.amount; buyer = offer.offeredBy; seller = _msgSender(); } else { _ethAmount = (offer.value * amount) / offer.amount; buyer = _msgSender(); seller = offer.offeredBy; } require(msg.value >= _ethAmount, "Insufficient Funds"); // (PMA-1)Refund excess ETH if (msg.value > _ethAmount) { uint256 excessAmount = msg.value - _ethAmount; (bool refundSuccess,) = msg.sender.call{value: excessAmount}(""); require(refundSuccess, "Refund of excess ETH failed"); } // new order _fillOffer(offerId, amount, buyer, seller); } /** * @param offerId The ID of the offer to be cancelled. */ function cancelOffer(uint256 offerId) public nonReentrant { Offer storage offer = offers[offerId]; require(offer.offeredBy == _msgSender(), "Offer Owner Only"); require(offer.status == STATUS_OFFER_OPEN, "Invalid Offer Status"); uint256 refundAmount = offer.amount - offer.filledAmount; require(refundAmount > 0, "Insufficient Allocations"); // calculate refund uint8 targetDecimals; if (offer.exToken == address(0)) { targetDecimals = 18; } else { targetDecimals = IERC20Metadata(offer.exToken).decimals(); } uint256 refundValue; if (offer.offerType == OFFER_BUY) { refundValue = convertDecimals( (refundAmount * offer.value) / offer.amount, 18, // source decimals targetDecimals ); } else { refundValue = convertDecimals( (refundAmount * offer.collateral) / offer.amount, 18, // source decimals targetDecimals ); } uint256 refundFee = (refundValue * config.feeRefund) / WEI6; refundValue -= refundFee; // refund if (offer.exToken == address(0)) { // refund ETH (bool success1,) = offer.offeredBy.call{value: refundValue}(""); (bool success2,) = config.feeWallet.call{value: refundFee}(""); require(success1 && success2, "Transfer Funds Fail"); } else { IERC20 iexToken = IERC20(offer.exToken); iexToken.safeTransfer(offer.offeredBy, refundValue); iexToken.safeTransfer(config.feeWallet, refundFee); } offer.status = STATUS_OFFER_CANCELLED; emit CancelOffer(offerId, refundValue, refundFee, _msgSender()); } /** * @param orderId The ID of the order to settle. */ function settleFilled(uint256 orderId) public nonReentrant { Order storage order = orders[orderId]; Offer storage offer = offers[order.offerId]; Token storage token = tokens[offer.tokenId]; // check condition require(token.status == STATUS_TOKEN_SETTLE, "Invalid Status"); require(token.token != address(0) && token.settleRate > 0, "Token Not Set"); //PMA-5 require(token.settleTime > 0, "Settling Time Not Started"); require(order.seller == _msgSender(), "Seller Only"); require(order.status == STATUS_ORDER_OPEN, "Invalid Order Status"); uint8 exTokenDecimals; if (offer.exToken == address(0)) { exTokenDecimals = 18; } else { exTokenDecimals = IERC20Metadata(offer.exToken).decimals(); } uint256 collateral = convertDecimals((order.amount * offer.collateral) / offer.amount, 18, exTokenDecimals); uint256 value = convertDecimals((order.amount * offer.value) / offer.amount, 18, exTokenDecimals); // transfer token to buyer IERC20 iToken = IERC20(token.token); uint8 tokenDecimals = IERC20Metadata(token.token).decimals(); // calculate token amount uint256 tokenAmount = convertDecimals((order.amount * token.settleRate) / WEI6, 18, tokenDecimals); uint256 tokenAmountFee = (tokenAmount * config.feeSettle) / WEI6; // transfer order fee in token to fee wallet iToken.safeTransferFrom(order.seller, config.feeWallet, tokenAmountFee); // transfer token after fee to buyer iToken.safeTransferFrom(order.seller, order.buyer, tokenAmount - tokenAmountFee); // transfer liquid to seller uint256 settleFee = (value * config.feeSettle) / WEI6; uint256 totalValue = value + collateral - settleFee; if (offer.exToken == address(0)) { // by ETH (bool success1,) = order.seller.call{value: totalValue}(""); (bool success2,) = config.feeWallet.call{value: settleFee}(""); require(success1 && success2, "Transfer Funds Fail"); } else { // by exToken IERC20 iexToken = IERC20(offer.exToken); iexToken.safeTransfer(order.seller, totalValue); iexToken.safeTransfer(config.feeWallet, settleFee); } order.status = STATUS_ORDER_SETTLE_FILLED; emit SettleFilled(orderId, totalValue, settleFee, _msgSender()); } /** * @param orderId The ID of the order to cancel settlement for. */ function settleCancelled(uint256 orderId) public nonReentrant { Order storage order = orders[orderId]; Offer storage offer = offers[order.offerId]; Token storage token = tokens[offer.tokenId]; // check condition require(token.status == STATUS_TOKEN_SETTLE, "Invalid Status"); require(block.timestamp > token.settleTime + token.settleDuration, "Settling Time Not Ended Yet"); require(order.status == STATUS_ORDER_OPEN, "Invalid Order Status"); require(order.buyer == _msgSender() || hasRole(OPERATOR_ROLE, _msgSender()), "Buyer or Operator Only"); uint8 exTokenDecimals; if (offer.exToken == address(0)) { exTokenDecimals = 18; } else { exTokenDecimals = IERC20Metadata(offer.exToken).decimals(); } uint256 collateral = convertDecimals((order.amount * offer.collateral) / offer.amount, 18, exTokenDecimals); uint256 value = convertDecimals((order.amount * offer.value) / offer.amount, 18, exTokenDecimals); // transfer liquid to buyer uint256 settleFee = (collateral * config.feeSettle * 2) / WEI6; uint256 totalValue = value + collateral - settleFee; if (offer.exToken == address(0)) { // by ETH (bool success1,) = order.buyer.call{value: totalValue}(""); (bool success2,) = config.feeWallet.call{value: settleFee}(""); require(success1 && success2, "Transfer Funds Fail"); } else { // by exToken IERC20 iexToken = IERC20(offer.exToken); iexToken.safeTransfer(order.buyer, totalValue); iexToken.safeTransfer(config.feeWallet, settleFee); } order.status = STATUS_ORDER_SETTLE_CANCELLED; emit SettleCancelled(orderId, totalValue, settleFee, _msgSender()); } /** * @param orderIds An array of order IDs to be forcibly cancelled. */ function forceCancelOrders(uint256[] memory orderIds) external { for (uint256 i = 0; i < orderIds.length; i++) { forceCancelOrder(orderIds[i]); } } /** * @param offerIds An array of offer IDs that the user wishes to cancel. */ function cancelOffers(uint256[] memory offerIds) external { for (uint256 i = 0; i < offerIds.length; i++) { cancelOffer(offerIds[i]); } } /** * @param orderIds An array of order IDs to be settled. */ function settleFilleds(uint256[] memory orderIds) external { for (uint256 i = 0; i < orderIds.length; i++) { settleFilled(orderIds[i]); } } /** * @param orderIds An array of order IDs for which settlement is to be cancelled. */ function settleCancelleds(uint256[] memory orderIds) external { for (uint256 i = 0; i < orderIds.length; i++) { settleCancelled(orderIds[i]); } } /** * @param offerIds An array of offer IDs to be filled. * @param amounts An array of amounts, each corresponding to an offer in the `offerIds` array. */ function fillOffers(uint256[] memory offerIds, uint256[] memory amounts) external nonReentrant { require(offerIds.length == amounts.length, "Invalid Input"); for (uint256 i = 0; i < offerIds.length; i++) { uint256 offerId = offerIds[i]; uint256 amount = amounts[i]; Offer storage offer = offers[offerId]; Token storage token = tokens[offer.tokenId]; require(offer.status == STATUS_OFFER_OPEN, "Invalid Offer Status"); require(token.status == STATUS_TOKEN_ACTIVE, "Invalid token Status"); require(amount > 0, "Invalid Amount"); require(offer.amount - offer.filledAmount >= amount, "Insufficient Allocations"); require(offer.fullMatch == false || offer.amount == amount, "FullMatch required"); require(offer.exToken != address(0), "Invalid Offer Token"); // transfer value or collateral IERC20 iexToken = IERC20(offer.exToken); uint256 _transferAmount; address buyer; address seller; uint8 targetDecimals = IERC20Metadata(offer.exToken).decimals(); if (offer.offerType == OFFER_BUY) { uint256 collateralAmount = (offer.collateral * amount) / offer.amount; _transferAmount = convertDecimalsCeil(collateralAmount, 18, targetDecimals); buyer = offer.offeredBy; seller = _msgSender(); } else { uint256 valueAmount = (offer.value * amount) / offer.amount; _transferAmount = convertDecimalsCeil(valueAmount, 18, targetDecimals); buyer = _msgSender(); seller = offer.offeredBy; } iexToken.safeTransferFrom(_msgSender(), address(this), _transferAmount); // new order _fillOffer(offerId, amount, buyer, seller); } } /** * @param offerIds An array of offer IDs to be filled. * @param amounts An array of amounts, each corresponding to an offer in the `offerIds` array. */ function fillOffersETH(uint256[] memory offerIds, uint256[] memory amounts) external payable nonReentrant { require(offerIds.length == amounts.length, "Invalid Input"); uint256 totalEthAmount = 0; for (uint256 i = 0; i < offerIds.length; i++) { uint256 offerId = offerIds[i]; uint256 amount = amounts[i]; Offer storage offer = offers[offerId]; Token storage token = tokens[offer.tokenId]; require(offer.status == STATUS_OFFER_OPEN, "Invalid Offer Status"); require(token.status == STATUS_TOKEN_ACTIVE, "Invalid token Status"); require(amount > 0, "Invalid Amount"); require(offer.amount - offer.filledAmount >= amount, "Insufficient Allocations"); require(offer.fullMatch == false || offer.amount == amount, "FullMatch required"); require(offer.exToken == address(0), "Invalid Offer Token"); uint256 _ethAmount; if (offer.offerType == OFFER_BUY) { _ethAmount = (offer.collateral * amount) / offer.amount; } else { _ethAmount = (offer.value * amount) / offer.amount; } totalEthAmount += _ethAmount; // Assuming _fillOffer handles the logic for each offer correctly _fillOffer(offerId, amount, offer.offeredBy, _msgSender()); } require(msg.value >= totalEthAmount, "Insufficient Funds"); // (PMA-1)Refund excess ETH if (msg.value > totalEthAmount) { uint256 excessAmount = msg.value - totalEthAmount; (bool refundSuccess,) = msg.sender.call{value: excessAmount}(""); require(refundSuccess, "Refund of excess ETH failed"); } } /////////////////////////// ///////// SETTER ////////// /////////////////////////// /** * @param feeWallet_ The address of the wallet where transaction fees are collected. * @param feeSettle_ The fee percentage charged upon the successful settlement of an order. * @param feeRefund_ The fee percentage charged when an offer is cancelled and funds are refunded. * @param pledgeRate_ The required collateral percentage for creating sell offers. */ function updateConfig(address feeWallet_, uint256 feeSettle_, uint256 feeRefund_, uint256 pledgeRate_) external onlyRole(OPERATOR_ROLE) { require(feeWallet_ != address(0), "Invalid Address"); require(feeSettle_ <= WEI6 / 10, "Settle Fee <= 10%"); require(feeRefund_ <= WEI6 / 10, "Cancel Fee <= 10%"); //PMA-2 limit pledge rate from 1% to 100%. require(pledgeRate_ >= WEI6 / 100 && pledgeRate_ <= WEI6, "Pledge Rate out of range"); emit UpdateConfig( config.feeWallet, config.feeSettle, config.feeRefund, config.pledgeRate, feeWallet_, feeSettle_, feeRefund_, pledgeRate_ ); // update config.feeWallet = feeWallet_; config.feeSettle = feeSettle_; config.feeRefund = feeRefund_; config.pledgeRate = pledgeRate_; } /** * @param tokenAddresses An array of token addresses to be updated. * @param isAccepted Boolean flag indicating whether the tokens should be accepted (true) or not (false). */ function setAcceptedTokens(address[] memory tokenAddresses, bool isAccepted) external onlyRole(OPERATOR_ROLE) { for (uint256 i = 0; i < tokenAddresses.length; i++) { acceptedTokens[tokenAddresses[i]] = isAccepted; } emit UpdateAcceptedTokens(tokenAddresses, isAccepted); } /////////////////////////// ///////// GETTER ////////// /////////////////////////// /** * @param offerId The unique identifier of the offer. */ function offerAmount(uint256 offerId) external view returns (uint256) { return offers[offerId].amount; } /** * @param offerId The unique identifier of the offer. */ function offerAmountAvailable(uint256 offerId) external view returns (uint256) { return offers[offerId].amount - offers[offerId].filledAmount; } /** * @param offerId The unique identifier of the offer. */ function offerValue(uint256 offerId) external view returns (uint256) { return offers[offerId].value; } /** * @param offerId The unique identifier of the offer. */ function offerExToken(uint256 offerId) external view returns (address) { return offers[offerId].exToken; } /** * @param offerId The unique identifier of the offer. */ function isBuyOffer(uint256 offerId) external view returns (bool) { return offers[offerId].offerType == OFFER_BUY; } /** * @param offerId The unique identifier of the offer. */ function isSellOffer(uint256 offerId) external view returns (bool) { return offers[offerId].offerType == OFFER_SELL; } /** * @param offerId The unique identifier of the offer. */ function offerStatus(uint256 offerId) external view returns (uint256) { return offers[offerId].status; } /** * @param orderId The unique identifier of the order. */ function orderStatus(uint256 orderId) external view returns (uint256) { return orders[orderId].status; } /** * @param id The unique identifier of the token, typically derived from its properties or a hash of its metadata. */ function tokensInfo(bytes32 id) external view returns (Token memory tokenInfo) { return tokens[id]; } /** * @param id The unique identifier of the offer. */ function offersInfo(uint256 id) external view returns (Offer memory) { return offers[id]; } /** * @param id The unique identifier of the order. */ function ordersInfo(uint256 id) external view returns (Order memory) { return orders[id]; } /** * Accesses the current configuration settings of the platform, including fees and the pledge rate. */ function configInfo() external view returns (Config memory) { return config; } /** * Checks whether a specific token is accepted for trading on the platform. * @param token The address of the token in question. */ function isAcceptedToken(address token) external view returns (bool) { return acceptedTokens[token]; } /** * Retrieves the identifier of the last offer made in the market, indicative of the total number of offers created. */ function lastOfferIdInfo() external view returns (uint256) { return lastOfferId; } /** * Returns the identifier of the last order processed in the system, serving as a measure of the platform's trading volume. */ function lastOrderIdInfo() external view returns (uint256) { return lastOrderId; } /////////////////////////// //////// INTERNAL ///////// /////////////////////////// /** * @param offerType Specifies whether it's a buy or sell offer. * @param tokenId The unique identifier for the token being traded. * @param exToken The address of the exchange token or ETH used for the trade. * @param amount The amount of the token being offered. * @param value The total value (in exToken or ETH) of the offer. * @param collateral The required collateral for the offer, applicable for sell offers. * @param fullMatch Indicates whether the offer requires to be filled in its entirety. */ function _newOffer( uint8 offerType, bytes32 tokenId, address exToken, uint256 amount, uint256 value, uint256 collateral, bool fullMatch ) internal { // create new offer offers[++lastOfferId] = Offer(offerType, tokenId, exToken, amount, value, collateral, 0, STATUS_OFFER_OPEN, _msgSender(), fullMatch); emit NewOffer(lastOfferId, offerType, tokenId, exToken, amount, value, collateral, fullMatch, _msgSender()); } /** * @param offerId The ID of the offer being filled. * @param amount The amount of the offer that is being fulfilled. * @param buyer The address of the buyer in the transaction. * @param seller The address of the seller. */ function _fillOffer(uint256 offerId, uint256 amount, address buyer, address seller) internal { Offer storage offer = offers[offerId]; // new order orders[++lastOrderId] = Order(offerId, amount, seller, buyer, STATUS_ORDER_OPEN); // check if offer is fullfilled offer.filledAmount += amount; if (offer.filledAmount == offer.amount) { offer.status = STATUS_OFFER_FILLED; emit CloseOffer(offerId, 0); } emit NewOrder(lastOrderId, offerId, amount, seller, buyer); } /** * @dev Withdraws stuck tokens from the contract. Only addresses with the UPGRADER_ROLE role can call this function. * @param _token The address of the token to withdraw. * @param _to The address to receive the withdrawn tokens. * @notice Use this function with caution to avoid accidentally moving funds. */ function withdrawStuckToken(address _token, address _to) external onlyRole(DEFAULT_ADMIN_ROLE) { require(_token != address(0) && !acceptedTokens[_token], "Invalid Token Address"); uint256 _contractBalance = IERC20(_token).balanceOf(address(this)); IERC20(_token).safeTransfer(_to, _contractBalance); } /** * @dev Convert value from sourceDecimals to targetDecimals. */ function convertDecimals(uint256 value, uint8 sourceDecimals, uint8 targetDecimals) internal pure returns (uint256 result) { if (sourceDecimals == targetDecimals) { result = value; } else if (sourceDecimals < targetDecimals) { result = value * (10 ** (targetDecimals - sourceDecimals)); } else { result = value / (10 ** (sourceDecimals - targetDecimals)); } } /** * @dev Convert value from sourceDecimals to targetDecimals, rounded up. */ function convertDecimalsCeil(uint256 value, uint8 sourceDecimals, uint8 targetDecimals) internal pure returns (uint256 result) { if (sourceDecimals == targetDecimals) { result = value; } else if (sourceDecimals < targetDecimals) { result = value * (10 ** (targetDecimals - sourceDecimals)); } else { uint256 temp = 10 ** (sourceDecimals - targetDecimals); result = value / temp; if (value % temp != 0) { result += 1; } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"feeWalletAddress","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":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"offerId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"refundValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"refundFee","type":"uint256"},{"indexed":false,"internalType":"address","name":"doer","type":"address"}],"name":"CancelOffer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":false,"internalType":"address","name":"doer","type":"address"}],"name":"CancelOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"offerId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"refundAmount","type":"uint256"}],"name":"CloseOffer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"offerType","type":"uint8"},{"indexed":false,"internalType":"bytes32","name":"tokenId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"exToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"collateral","type":"uint256"},{"indexed":false,"internalType":"bool","name":"fullMatch","type":"bool"},{"indexed":false,"internalType":"address","name":"doer","type":"address"}],"name":"NewOffer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"offerId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"}],"name":"NewOrder","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"tokenId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"settleDuration","type":"uint256"}],"name":"NewToken","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":"uint256","name":"orderId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"},{"indexed":false,"internalType":"address","name":"doer","type":"address"}],"name":"Settle2Steps","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"address","name":"doer","type":"address"}],"name":"SettleCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"orderId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"address","name":"doer","type":"address"}],"name":"SettleFilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"tokenId","type":"bytes32"}],"name":"TokenForceCancelSettlePhase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"tokenId","type":"bytes32"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"settleRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"settleTime","type":"uint256"}],"name":"TokenToSettlePhase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"tokens","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isAccepted","type":"bool"}],"name":"UpdateAcceptedTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldFeeWallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldFeeSettle","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldFeeRefund","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldPledgeRate","type":"uint256"},{"indexed":false,"internalType":"address","name":"newFeeWallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"newFeeSettle","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFeeRefund","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPledgeRate","type":"uint256"}],"name":"UpdateConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"tokenId","type":"bytes32"},{"indexed":false,"internalType":"uint48","name":"oldValue","type":"uint48"},{"indexed":false,"internalType":"uint48","name":"newValue","type":"uint48"}],"name":"UpdateTokenSettleDuration","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"tokenId","type":"bytes32"},{"indexed":false,"internalType":"uint8","name":"oldValue","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newValue","type":"uint8"}],"name":"UpdateTokenStatus","type":"event"},{"inputs":[],"name":"BLAST","outputs":[{"internalType":"contract IBlast","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLAST_POINT","outputs":[{"internalType":"contract IBlastPoints","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDB","outputs":[{"internalType":"contract IERC20Rebasing","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IERC20Rebasing","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"acceptedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId","type":"uint256"}],"name":"cancelOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"offerIds","type":"uint256[]"}],"name":"cancelOffers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAllGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEthYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"claimTokenYeild","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"config","outputs":[{"internalType":"uint256","name":"pledgeRate","type":"uint256"},{"internalType":"uint256","name":"feeRefund","type":"uint256"},{"internalType":"uint256","name":"feeSettle","type":"uint256"},{"internalType":"address","name":"feeWallet","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"configInfo","outputs":[{"components":[{"internalType":"uint256","name":"pledgeRate","type":"uint256"},{"internalType":"uint256","name":"feeRefund","type":"uint256"},{"internalType":"uint256","name":"feeSettle","type":"uint256"},{"internalType":"address","name":"feeWallet","type":"address"}],"internalType":"struct Config","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pointOperator","type":"address"}],"name":"configurePointsOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"address","name":"pointOperator","type":"address"}],"name":"configurePointsOperatorOnBehalf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenId","type":"bytes32"},{"internalType":"uint48","name":"settleDuration","type":"uint48"}],"name":"createToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"fillOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"fillOfferETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"offerIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"fillOffers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"offerIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"fillOffersETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"}],"name":"forceCancelOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"orderIds","type":"uint256[]"}],"name":"forceCancelOrders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getClaimableAmount","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":"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":[],"name":"initBlastYield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"isAcceptedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId","type":"uint256"}],"name":"isBuyOffer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId","type":"uint256"}],"name":"isSellOffer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastOfferId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastOfferIdInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastOrderId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastOrderIdInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"offerType","type":"uint8"},{"internalType":"bytes32","name":"tokenId","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"address","name":"exToken","type":"address"},{"internalType":"bool","name":"fullMatch","type":"bool"}],"name":"newOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"offerType","type":"uint8"},{"internalType":"bytes32","name":"tokenId","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bool","name":"fullMatch","type":"bool"}],"name":"newOfferETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId","type":"uint256"}],"name":"offerAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId","type":"uint256"}],"name":"offerAmountAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId","type":"uint256"}],"name":"offerExToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId","type":"uint256"}],"name":"offerStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId","type":"uint256"}],"name":"offerValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"offers","outputs":[{"internalType":"uint8","name":"offerType","type":"uint8"},{"internalType":"bytes32","name":"tokenId","type":"bytes32"},{"internalType":"address","name":"exToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"collateral","type":"uint256"},{"internalType":"uint256","name":"filledAmount","type":"uint256"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"address","name":"offeredBy","type":"address"},{"internalType":"bool","name":"fullMatch","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"offersInfo","outputs":[{"components":[{"internalType":"uint8","name":"offerType","type":"uint8"},{"internalType":"bytes32","name":"tokenId","type":"bytes32"},{"internalType":"address","name":"exToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"collateral","type":"uint256"},{"internalType":"uint256","name":"filledAmount","type":"uint256"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"address","name":"offeredBy","type":"address"},{"internalType":"bool","name":"fullMatch","type":"bool"}],"internalType":"struct Offer","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"}],"name":"orderStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"orders","outputs":[{"internalType":"uint256","name":"offerId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint8","name":"status","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ordersInfo","outputs":[{"components":[{"internalType":"uint256","name":"offerId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint8","name":"status","type":"uint8"}],"internalType":"struct Order","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","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":"address[]","name":"tokenAddresses","type":"address[]"},{"internalType":"bool","name":"isAccepted","type":"bool"}],"name":"setAcceptedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"settle2Steps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"orderIds","type":"uint256[]"},{"internalType":"bytes32[]","name":"hashes","type":"bytes32[]"}],"name":"settle2StepsBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"}],"name":"settleCancelled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"orderIds","type":"uint256[]"}],"name":"settleCancelleds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"}],"name":"settleFilled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"orderIds","type":"uint256[]"}],"name":"settleFilleds","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":"bytes32","name":"","type":"bytes32"}],"name":"tokenCreated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenId","type":"bytes32"}],"name":"tokenForceCancelSettlePhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenId","type":"bytes32"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint152","name":"settleRate","type":"uint152"}],"name":"tokenToSettlePhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenId","type":"bytes32"}],"name":"tokenToggleActivation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"tokens","outputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint48","name":"settleTime","type":"uint48"},{"internalType":"uint48","name":"settleDuration","type":"uint48"},{"internalType":"uint152","name":"settleRate","type":"uint152"},{"internalType":"uint8","name":"status","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"tokensInfo","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint48","name":"settleTime","type":"uint48"},{"internalType":"uint48","name":"settleDuration","type":"uint48"},{"internalType":"uint152","name":"settleRate","type":"uint152"},{"internalType":"uint8","name":"status","type":"uint8"}],"internalType":"struct Token","name":"tokenInfo","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"feeWallet_","type":"address"},{"internalType":"uint256","name":"feeSettle_","type":"uint256"},{"internalType":"uint256","name":"feeRefund_","type":"uint256"},{"internalType":"uint256","name":"pledgeRate_","type":"uint256"}],"name":"updateConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"tokenId","type":"bytes32"},{"internalType":"uint48","name":"newValue","type":"uint48"}],"name":"updateSettleDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawStuckToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162005c7338038062005c738339810160408190526200003491620001ca565b600180556001600160a01b038116620000a95760405162461bcd60e51b815260206004820152602d60248201527f4665652077616c6c657420616464726573732063616e6e6f742062652074686560448201526c207a65726f206164647265737360981b606482015260840160405180910390fd5b620000b66000336200011b565b50620000e37f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929336200011b565b50620f4240600955600c80546001600160a01b0319166001600160a01b03929092169190911790556000600b819055600a55620001fc565b6000828152602081815260408083206001600160a01b038516845290915281205460ff16620001c0576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055620001773390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001620001c4565b5060005b92915050565b600060208284031215620001dd57600080fd5b81516001600160a01b0381168114620001f557600080fd5b9392505050565b615a67806200020c6000396000f3fe6080604052600436106103d95760003560e01c806379502c55116101fd578063bff4945011610118578063e46c02e3116100ab578063f01701501161007a578063f017015014610ffa578063f1ee8fdd14611118578063f564f0ae14611138578063f5b541a61461114b578063ffb126761461116d57600080fd5b8063e46c02e314610f62578063e4cb62c014610f8a578063e7a7594914610faa578063ef706adf14610fda57600080fd5b8063dc8beea9116100e7578063dc8beea914610eb9578063deb2ec6a14610ef2578063e12f3a6114610f12578063e3df748a14610f3257600080fd5b8063bff4945014610e0c578063cfcdeb7e14610e46578063d547741f14610e66578063d843b2c714610e8657600080fd5b8063985a7c1d11610190578063aaab596a1161015f578063aaab596a14610d91578063ad5c464814610db1578063b30080ac14610dcc578063bc205ad314610dec57600080fd5b8063985a7c1d14610caa578063a1bd91e114610cca578063a217fddf14610cea578063a85c38ef14610cff57600080fd5b80638a72ea6a116101cc5780638a72ea6a14610acf578063904194a314610bb557806391d1485414610c6f57806397d7577614610c8f57600080fd5b806379502c5514610a3057806381cc37b214610a6c57806382dc4a0514610a7f57806386aa7db014610aaf57600080fd5b806336568abe116102f85780635d3473e31161028b5780636a951f201161025a5780636a951f20146108b85780637400f52d146108d857806375b5908a146108f857806378447e7f146109185780637857f9fb1461093857600080fd5b80635d3473e314610809578063643268c91461083c578063645dd1fa14610852578063670017f41461086757600080fd5b80633baf6784116102c75780633baf6784146106a45780634a99533b146107be5780634ae25a86146107d35780635662ecc7146107f357600080fd5b806336568abe14610616578063368472161461063657806336b91f2b1461064b5780633b6e750f1461066b57600080fd5b80631f4846d8116103705780632d6705841161033f5780632d6705841461058e5780632f2ff15d146105ae57806331a0edec146105ce57806331a37c1e1461060157600080fd5b80631f4846d8146104fb57806321146fa21461051b578063248a9ca31461053b57806327cdbb9c1461057957600080fd5b806316b4cdb2116103ac57806316b4cdb21461046857806317b137ba1461048857806318b4f367146104a85780631f25a2d8146104db57600080fd5b806301ffc9a7146103de578063030d34231461041357806306f13da9146104355780630b8aacb914610448575b600080fd5b3480156103ea57600080fd5b506103fe6103f9366004614ed4565b61119d565b60405190151581526020015b60405180910390f35b34801561041f57600080fd5b5061043361042e366004614f1a565b6111d4565b005b61043361044336600461500f565b6111fa565b34801561045457600080fd5b5061043361046336600461509b565b6114f0565b34801561047457600080fd5b50610433610483366004615100565b6116f2565b34801561049457600080fd5b506104336104a3366004615122565b611b64565b3480156104b457600080fd5b506103fe6104c3366004615157565b60009081526005602052604090205460ff1660021490565b3480156104e757600080fd5b506104336104f6366004615170565b611b9a565b34801561050757600080fd5b50610433610516366004615122565b611db3565b34801561052757600080fd5b506104336105363660046151a9565b611de9565b34801561054757600080fd5b5061056b610556366004615157565b60009081526020819052604090206001015490565b60405190815260200161040a565b34801561058557600080fd5b50610433611edc565b34801561059a57600080fd5b506104336105a93660046151e4565b611eff565b3480156105ba57600080fd5b506104336105c936600461529f565b611f75565b3480156105da57600080fd5b506105e96003604360981b0181565b6040516001600160a01b03909116815260200161040a565b34801561060d57600080fd5b5060085461056b565b34801561062257600080fd5b5061043361063136600461529f565b611fa0565b34801561064257600080fd5b50610433611fd3565b34801561065757600080fd5b50610433610666366004614f1a565b611fe6565b34801561067757600080fd5b506103fe610686366004614f1a565b6001600160a01b031660009081526002602052604090205460ff1690565b3480156106b057600080fd5b506107b16106bf366004615157565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915250600090815260056020818152604092839020835161014081018552815460ff908116825260018301549382019390935260028201546001600160a01b039081169582019590955260038201546060820152600482015460808201529281015460a0840152600681015460c08401526007015480821660e084015261010080820490941693830193909352600160a81b909204909116151561012082015290565b60405161040a91906152cb565b3480156107ca57600080fd5b5060065461056b565b3480156107df57600080fd5b506104336107ee366004615122565b611ffa565b3480156107ff57600080fd5b5061056b60085481565b34801561081557600080fd5b506103fe610824366004615157565b60009081526005602052604090205460ff1660011490565b34801561084857600080fd5b5061056b60065481565b34801561085e57600080fd5b50610433612030565b34801561087357600080fd5b5061087c612050565b60405161040a91908151815260208083015190820152604080830151908201526060918201516001600160a01b03169181019190915260800190565b3480156108c457600080fd5b506104336108d3366004615157565b6120ba565b3480156108e457600080fd5b506104336108f3366004615157565b6121c6565b34801561090457600080fd5b5061043361091336600461500f565b61228f565b34801561092457600080fd5b50610433610933366004615100565b61258d565b34801561094457600080fd5b506109df610953366004615157565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915250600090815260076020908152604091829020825160a0810184528154815260018201549281019290925260028101546001600160a01b0390811693830193909352600301549182166060820152600160a01b90910460ff16608082015290565b60405161040a919081518152602080830151908201526040808301516001600160a01b03908116918301919091526060808401519091169082015260809182015160ff169181019190915260a00190565b348015610a3c57600080fd5b50600954600a54600b54600c54610a5c939291906001600160a01b031684565b60405161040a9493929190615361565b610433610a7a366004615100565b61280d565b348015610a8b57600080fd5b506103fe610a9a366004614f1a565b60026020526000908152604090205460ff1681565b348015610abb57600080fd5b50610433610aca366004615385565b612a8d565b348015610adb57600080fd5b50610b54610aea366004615157565b60056020819052600091825260409091208054600182015460028301546003840154600485015495850154600686015460079096015460ff9586169794966001600160a01b03948516969395949293909282821692610100810490911691600160a81b909104168a565b6040805160ff9b8c168152602081019a909a526001600160a01b03988916908a01526060890196909652608088019490945260a087019290925260c086015290941660e084015292166101008201529015156101208201526101400161040a565b348015610bc157600080fd5b50610c25610bd0366004615157565b600460205260009081526040902080546001909101546001600160a01b0382169165ffffffffffff600160a01b8204811692600160d01b90920416906001600160981b0381169060ff600160981b9091041685565b604080516001600160a01b0396909616865265ffffffffffff948516602087015292909316918401919091526001600160981b0316606083015260ff16608082015260a00161040a565b348015610c7b57600080fd5b506103fe610c8a36600461529f565b612ca7565b348015610c9b57600080fd5b506105e96002604360981b0181565b348015610cb657600080fd5b50610433610cc53660046153d1565b612cd0565b348015610cd657600080fd5b5061056b610ce5366004615157565b612d77565b348015610cf657600080fd5b5061056b600081565b348015610d0b57600080fd5b50610d5a610d1a366004615157565b6007602052600090815260409020805460018201546002830154600390930154919290916001600160a01b0391821691811690600160a01b900460ff1685565b6040805195865260208601949094526001600160a01b039283169385019390935216606083015260ff16608082015260a00161040a565b348015610d9d57600080fd5b50610433610dac366004615157565b612d9a565b348015610dbd57600080fd5b506105e96004604360981b0181565b348015610dd857600080fd5b50610433610de736600461547b565b6132f9565b348015610df857600080fd5b50610433610e0736600461547b565b61330e565b348015610e1857600080fd5b5061056b610e27366004615157565b600090815260076020526040902060030154600160a01b900460ff1690565b348015610e5257600080fd5b50610433610e61366004615122565b61340f565b348015610e7257600080fd5b50610433610e8136600461529f565b613445565b348015610e9257600080fd5b5061056b610ea1366004615157565b60009081526005602052604090206007015460ff1690565b348015610ec557600080fd5b506105e9610ed4366004615157565b6000908152600560205260409020600201546001600160a01b031690565b348015610efe57600080fd5b50610433610f0d366004615157565b61346a565b348015610f1e57600080fd5b5061056b610f2d366004614f1a565b61382c565b348015610f3e57600080fd5b5061056b610f4d366004615157565b60009081526005602052604090206004015490565b348015610f6e57600080fd5b506105e9732536fe9ab3f511540f2f9e2ec2a805005c3dd80081565b348015610f9657600080fd5b50610433610fa5366004615157565b613897565b348015610fb657600080fd5b5061056b610fc5366004615157565b60009081526005602052604090206003015490565b348015610fe657600080fd5b50610433610ff5366004615157565b613cb1565b34801561100657600080fd5b506110b9611015366004615157565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915250600090815260046020908152604091829020825160a08101845281546001600160a01b038116825265ffffffffffff600160a01b8204811694830194909452600160d01b9004909216928201929092526001909101546001600160981b038116606083015260ff600160981b90910416608082015290565b6040805182516001600160a01b0316815260208084015165ffffffffffff908116918301919091528383015116918101919091526060808301516001600160981b03169082015260809182015160ff169181019190915260a00161040a565b34801561112457600080fd5b506104336111333660046151a9565b614026565b6104336111463660046154a5565b6141ab565b34801561115757600080fd5b5061056b600080516020615a1283398151915281565b34801561117957600080fd5b506103fe611188366004615157565b60036020526000908152604090205460ff1681565b60006001600160e01b03198216637965db0b60e01b14806111ce57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60006111df81614361565b600c546111f69083906001600160a01b031661436b565b5050565b6112026143ed565b805182511461122c5760405162461bcd60e51b8152600401611223906154fb565b60405180910390fd5b6000805b835181101561144357600084828151811061124d5761124d615522565b60200260200101519050600084838151811061126b5761126b615522565b602090810291909101810151600084815260058352604080822060018082015484526004909552912060078201549294509092909160ff16146112c05760405162461bcd60e51b815260040161122390615538565b600181810154600160981b900460ff16146112ed5760405162461bcd60e51b815260040161122390615566565b6000831161130d5760405162461bcd60e51b815260040161122390615594565b828260060154836003015461132291906155d2565b10156113405760405162461bcd60e51b8152600401611223906155e5565b6007820154600160a81b900460ff16158061135e5750828260030154145b61137a5760405162461bcd60e51b81526004016112239061561c565b60028201546001600160a01b0316156113a55760405162461bcd60e51b815260040161122390615648565b815460009060ff16600019016113db5782600301548484600501546113ca9190615675565b6113d491906156a2565b90506113fd565b82600301548484600401546113f09190615675565b6113fa91906156a2565b90505b61140781886156b6565b965061143285858560070160019054906101000a90046001600160a01b031661142d3390565b614417565b505060019093019250611230915050565b50803410156114645760405162461bcd60e51b8152600401611223906156c9565b803411156114e657600061147882346155d2565b604051909150600090339083908381818185875af1925050503d80600081146114bd576040519150601f19603f3d011682016040523d82523d6000602084013e6114c2565b606091505b50509050806114e35760405162461bcd60e51b8152600401611223906156f5565b50505b506111f660018055565b6114f86143ed565b6000858152600460205260409020600180820154600160981b900460ff16146115535760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2102a37b5b2b760991b6044820152606401611223565b6001600160a01b0383161580159061158357506001600160a01b03831660009081526002602052604090205460ff165b61159f5760405162461bcd60e51b815260040161122390615648565b6000851180156115af5750600084115b6115f55760405162461bcd60e51b8152602060048201526017602482015276496e76616c696420416d6f756e74206f722056616c756560481b6044820152606401611223565b6000836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611635573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611659919061572c565b90506000611669866012846145c6565b90506000620f4240600960000154886116829190615675565b61168c91906156a2565b9050600061169c826012866145c6565b9050600060ff8c166001146116b157816116b3565b835b9050876116cb6001600160a01b03821633308561465b565b6116da8d8d8b8e8e898e6146c2565b505050505050506116ea60018055565b505050505050565b6116fa6143ed565b600080516020615a1283398151915261171281614361565b60008381526007602090815260408083208054845260058352818420600180820154865260049094529190932091820154909190600160981b900460ff1660031461176f5760405162461bcd60e51b815260040161122390615749565b80546001600160a01b031615801590611794575060018101546001600160981b031615155b6117d05760405162461bcd60e51b815260206004820152600d60248201526c151bdad95b88139bdd0814d95d609a1b6044820152606401611223565b8054600160a01b900465ffffffffffff166118295760405162461bcd60e51b815260206004820152601960248201527814d95d1d1b1a5b99c8151a5b5948139bdd0814dd185c9d1959603a1b6044820152606401611223565b6003830154600160a01b900460ff166001146118575760405162461bcd60e51b815260040161122390615771565b60028201546000906001600160a01b0316611874575060126118f0565b8260020160009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ed919061572c565b90505b600061192084600301548560050154876001015461190e9190615675565b61191891906156a2565b601284614892565b905060006119528560030154866004015488600101546119409190615675565b61194a91906156a2565b601285614892565b90506000620f42406009600201548361196b9190615675565b61197591906156a2565b905060008161198485856156b6565b61198e91906155d2565b60028801549091506001600160a01b0316611a815760028801546040516000916001600160a01b03169083908381818185875af1925050503d80600081146119f2576040519150601f19603f3d011682016040523d82523d6000602084013e6119f7565b606091505b5050600c546040519192506000916001600160a01b039091169085908381818185875af1925050503d8060008114611a4b576040519150601f19603f3d011682016040523d82523d6000602084013e611a50565b606091505b50509050818015611a5e5750805b611a7a5760405162461bcd60e51b81526004016112239061579f565b5050611ac0565b600280880154908901546001600160a01b0391821691611aa491839116846148e7565b600c54611abe906001600160a01b038381169116856148e7565b505b60038801805460ff60a01b1916600160a11b179055604080518c8152602081018c9052338183015290517fbac7c71779ccc41f8c859e9d622536f76f0375a85b23e1b3d4134f613a9fff54916060908290030190a17f94d22e970a1abb720b741045e471af3fa516f4e2ede6b665387332888f92f2138b828433604051611b4a9493929190615361565b60405180910390a15050505050505050506111f660018055565b60005b81518110156111f657611b92828281518110611b8557611b85615522565b6020026020010151612d9a565b600101611b67565b600080516020615a12833981519152611bb281614361565b6001600160a01b038516611bfa5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204164647265737360881b6044820152606401611223565b611c08600a620f42406156a2565b841115611c4b5760405162461bcd60e51b8152602060048201526011602482015270536574746c6520466565203c3d2031302560781b6044820152606401611223565b611c59600a620f42406156a2565b831115611c9c5760405162461bcd60e51b815260206004820152601160248201527043616e63656c20466565203c3d2031302560781b6044820152606401611223565b611caa6064620f42406156a2565b8210158015611cbc5750620f42408211155b611d085760405162461bcd60e51b815260206004820152601860248201527f506c656467652052617465206f7574206f662072616e676500000000000000006044820152606401611223565b600c54600b54600a54600954604080516001600160a01b03958616815260208101949094528301919091526060820152908616608082015260a0810185905260c0810184905260e081018390527f72fe78202ae1d56b2334bc8c804db955e2349789b271b7f55e8109f7122f0a11906101000160405180910390a150600c80546001600160a01b0319166001600160a01b039590951694909417909355600b91909155600a55600955565b60005b81518110156111f657611de1828281518110611dd457611dd4615522565b6020026020010151613897565b600101611db6565b600080516020615a12833981519152611e0181614361565b620151808265ffffffffffff161015611e5c5760405162461bcd60e51b815260206004820152601860248201527f4d696e696d756d2032346820666f7220736574746c696e6700000000000000006044820152606401611223565b600083815260046020908152604091829020805465ffffffffffff868116600160d01b8181026001600160d01b03851617855586518a8152930490911693820184905293810193909352917fd5042937eda12ebddebb9d9ecaf0d88595a67d0d28513340610674acbd48274b906060015b60405180910390a15050505050565b6000611ee781614361565b600c54611efc906001600160a01b0316614918565b50565b8051825114611f205760405162461bcd60e51b8152600401611223906154fb565b60005b8251811015611f7057611f68838281518110611f4157611f41615522565b6020026020010151838381518110611f5b57611f5b615522565b60200260200101516116f2565b600101611f23565b505050565b600082815260208190526040902060010154611f9081614361565b611f9a8383614990565b50505050565b6001600160a01b0381163314611fc95760405163334bd91960e11b815260040160405180910390fd5b611f708282614a22565b6000611fde81614361565b611efc614a8d565b6000611ff181614361565b6111f682614c1e565b60005b81518110156111f65761202882828151811061201b5761201b615522565b6020026020010151613cb1565b600101611ffd565b600061203b81614361565b600c54611efc906001600160a01b0316614c87565b612084604051806080016040528060008152602001600081526020016000815260200160006001600160a01b031681525090565b50604080516080810182526009548152600a546020820152600b5491810191909152600c546001600160a01b0316606082015290565b600080516020615a128339815191526120d281614361565b60008281526004602052604081206001808201549192600160981b90920460ff1691908214612102576001612105565b60025b905060ff82166001148061211c575060ff82166002145b6121685760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74204368616e676520546f6b656e205374617475730000000000006044820152606401611223565b60018301805460ff838116600160981b810260ff60981b19909316929092179092556040805188815292851660208401528201527f853e3a954af7889419a6922a1bc350b54c6217937a4a2aed1176ed3f5a1dfb5290606001611ecd565b600080516020615a128339815191526121de81614361565b60008281526004602052604090206001810154600160981b900460ff166003146122415760405162461bcd60e51b8152602060048201526014602482015273496e76616c696420546f6b656e2053746174757360601b6044820152606401611223565b60018101805460ff60981b1916600160991b1790556040518381527f6ac56c552b96d07b41e8ee97200f747e7476892e0e2e53e9803199bfe014b0a8906020015b60405180910390a1505050565b6122976143ed565b80518251146122b85760405162461bcd60e51b8152600401611223906154fb565b60005b82518110156114e65760008382815181106122d8576122d8615522565b6020026020010151905060008383815181106122f6576122f6615522565b602090810291909101810151600084815260058352604080822060018082015484526004909552912060078201549294509092909160ff161461234b5760405162461bcd60e51b815260040161122390615538565b600181810154600160981b900460ff16146123785760405162461bcd60e51b815260040161122390615566565b600083116123985760405162461bcd60e51b815260040161122390615594565b82826006015483600301546123ad91906155d2565b10156123cb5760405162461bcd60e51b8152600401611223906155e5565b6007820154600160a81b900460ff1615806123e95750828260030154145b6124055760405162461bcd60e51b81526004016112239061561c565b60028201546001600160a01b031661242f5760405162461bcd60e51b815260040161122390615648565b60028201546040805163313ce56760e01b815290516001600160a01b0390921691600091829182918291869163313ce5679160048083019260209291908290030181865afa158015612485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a9919061572c565b875490915060ff166000190161250957600087600301548989600501546124d09190615675565b6124da91906156a2565b90506124e8816012846145c6565b600789015490955061010090046001600160a01b0316935033925050612555565b600087600301548989600401546125209190615675565b61252a91906156a2565b9050612538816012846145c6565b945033600789015490945061010090046001600160a01b03169250505b61256c335b6001600160a01b03871690308761465b565b61257889898585614417565b5050600190970196506122bb95505050505050565b6125956143ed565b60008281526005602090815260408083206001808201548552600490935292206007830154909160ff909116146125de5760405162461bcd60e51b815260040161122390615538565b600181810154600160981b900460ff161461260b5760405162461bcd60e51b815260040161122390615566565b6000831161262b5760405162461bcd60e51b815260040161122390615594565b828260060154836003015461264091906155d2565b101561265e5760405162461bcd60e51b8152600401611223906155e5565b6007820154600160a81b900460ff16158061267c5750828260030154145b6126985760405162461bcd60e51b81526004016112239061561c565b60028201546001600160a01b03166126c25760405162461bcd60e51b815260040161122390615648565b60028201546040805163313ce56760e01b815290516001600160a01b0390921691600091829182918291869163313ce5679160048083019260209291908290030181865afa158015612718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273c919061572c565b875490915060ff166000190161279c57600087600301548989600501546127639190615675565b61276d91906156a2565b905061277b816012846145c6565b600789015490955061010090046001600160a01b03169350339250506127e8565b600087600301548989600401546127b39190615675565b6127bd91906156a2565b90506127cb816012846145c6565b945033600789015490945061010090046001600160a01b03169250505b6127f13361255a565b6127fd89898585614417565b505050505050506111f660018055565b6128156143ed565b60008281526005602090815260408083206001808201548552600490935292206007830154909160ff9091161461285e5760405162461bcd60e51b815260040161122390615538565b600181810154600160981b900460ff161461288b5760405162461bcd60e51b815260040161122390615566565b600083116128ab5760405162461bcd60e51b815260040161122390615594565b82826006015483600301546128c091906155d2565b10156128de5760405162461bcd60e51b8152600401611223906155e5565b6007820154600160a81b900460ff1615806128fc5750828260030154145b6129185760405162461bcd60e51b81526004016112239061561c565b60028201546001600160a01b0316156129435760405162461bcd60e51b815260040161122390615648565b81546000908190819060ff166000190161299657846003015486866005015461296c9190615675565b61297691906156a2565b600786015490935061010090046001600160a01b031691503390506129d1565b84600301548686600401546129ab9190615675565b6129b591906156a2565b925033600786015490925061010090046001600160a01b031690505b823410156129f15760405162461bcd60e51b8152600401611223906156c9565b82341115612a73576000612a0584346155d2565b604051909150600090339083908381818185875af1925050503d8060008114612a4a576040519150601f19603f3d011682016040523d82523d6000602084013e612a4f565b606091505b5050905080612a705760405162461bcd60e51b8152600401611223906156f5565b50505b612a7f87878484614417565b50505050506111f660018055565b600080516020615a12833981519152612aa581614361565b60008481526004602052604090206001600160a01b038416612b1b5760405162461bcd60e51b815260206004820152602960248201527f746f6b656e546f536574746c6550686173653a20496e76616c696420546f6b656044820152686e204164647265737360b81b6064820152608401611223565b6000836001600160981b031611612b835760405162461bcd60e51b815260206004820152602660248201527f746f6b656e546f536574746c6550686173653a496e76616c696420536574746c60448201526565205261746560d01b6064820152608401611223565b600181810154600160981b900460ff161480612bad57506001810154600160981b900460ff166002145b612c095760405162461bcd60e51b815260206004820152602760248201527f746f6b656e546f536574746c6550686173653a496e76616c696420546f6b656e6044820152662053746174757360c81b6064820152608401611223565b80546001820180546001600160981b0386166001600160a01b03199091168117600360981b179091556001600160a01b0386166001600160d01b03199092168217600160a01b4265ffffffffffff81169190910291909117845560408051898152602081019490945283019190915260608201527f973839ac031e9779c3158a52ae98cb3b0be8a378b1adc2b2ce2c14f89c81489590608001611ecd565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600080516020615a12833981519152612ce881614361565b60005b8351811015612d45578260026000868481518110612d0b57612d0b615522565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101612ceb565b507f6a980e8ca36409cff27b8778560e2a0f5183fea53171bc0aeff7317906c7c1f483836040516122829291906157cc565b600081815260056020526040812060068101546003909101546111ce91906155d2565b612da26143ed565b60008181526007602090815260408083208054845260058352818420600180820154865260049094529190932091820154909190600160981b900460ff16600314612dff5760405162461bcd60e51b815260040161122390615749565b80546001600160a01b031615801590612e24575060018101546001600160981b031615155b612e605760405162461bcd60e51b815260206004820152600d60248201526c151bdad95b88139bdd0814d95d609a1b6044820152606401611223565b8054600160a01b900465ffffffffffff16612eb95760405162461bcd60e51b815260206004820152601960248201527814d95d1d1b1a5b99c8151a5b5948139bdd0814dd185c9d1959603a1b6044820152606401611223565b60028301546001600160a01b03163314612f035760405162461bcd60e51b815260206004820152600b60248201526a53656c6c6572204f6e6c7960a81b6044820152606401611223565b6003830154600160a01b900460ff16600114612f315760405162461bcd60e51b815260040161122390615771565b60028201546000906001600160a01b0316612f4e57506012612fca565b8260020160009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc7919061572c565b90505b6000612fe884600301548560050154876001015461190e9190615675565b905060006130088560030154866004015488600101546119409190615675565b84546040805163313ce56760e01b815290519293506001600160a01b0390911691600091839163313ce567916004808201926020929091908290030181865afa158015613059573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307d919061572c565b600180880154908a01549192506000916130a991620f42409161190e916001600160981b031690615675565b90506000620f4240600960020154836130c29190615675565b6130cc91906156a2565b60028b0154600c549192506130f1916001600160a01b0387811692811691168461465b565b60028a015460038b0154613128916001600160a01b03908116911661311684866155d2565b6001600160a01b03881692919061465b565b600b54600090620f42409061313d9088615675565b61314791906156a2565b905060008161315689896156b6565b61316091906155d2565b60028c01549091506001600160a01b03166132535760028c01546040516000916001600160a01b03169083908381818185875af1925050503d80600081146131c4576040519150601f19603f3d011682016040523d82523d6000602084013e6131c9565b606091505b5050600c546040519192506000916001600160a01b039091169085908381818185875af1925050503d806000811461321d576040519150601f19603f3d011682016040523d82523d6000602084013e613222565b606091505b505090508180156132305750805b61324c5760405162461bcd60e51b81526004016112239061579f565b5050613292565b6002808c0154908d01546001600160a01b039182169161327691839116846148e7565b600c54613290906001600160a01b038381169116856148e7565b505b60038c01805460ff60a01b1916600160a11b1790557f94d22e970a1abb720b741045e471af3fa516f4e2ede6b665387332888f92f2138d8284336040516132dc9493929190615361565b60405180910390a1505050505050505050505050611efc60018055565b600061330481614361565b611f708383614cc0565b600061331981614361565b6001600160a01b0383161580159061334a57506001600160a01b03831660009081526002602052604090205460ff16155b61338e5760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420546f6b656e204164647265737360581b6044820152606401611223565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa1580156133d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f99190615825565b9050611f9a6001600160a01b03851684836148e7565b60005b81518110156111f65761343d82828151811061343057613430615522565b602002602001015161346a565b600101613412565b60008281526020819052604090206001015461346081614361565b611f9a8383614a22565b6134726143ed565b600080516020615a1283398151915261348a81614361565b60008281526007602090815260408083208054845260059092529091206003820154600160a01b900460ff166001146134d55760405162461bcd60e51b815260040161122390615771565b60028101546000906001600160a01b03166134f25750601261356e565b8160020160009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613547573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061356b919061572c565b90505b600061358c83600301548460040154866001015461190e9190615675565b905060006135ac8460030154856005015487600101546119409190615675565b6003860154600280880154908701549293506001600160a01b0391821692908216911661375c576000841180156135eb57506001600160a01b03821615155b15613695576000826001600160a01b03168560405160006040518083038185875af1925050503d806000811461363d576040519150601f19603f3d011682016040523d82523d6000602084013e613642565b606091505b50509050806136935760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722046756e647320746f2053656c6c6572204661696c0000006044820152606401611223565b505b6000831180156136ad57506001600160a01b03811615155b15613757576000816001600160a01b03168460405160006040518083038185875af1925050503d80600081146136ff576040519150601f19603f3d011682016040523d82523d6000602084013e613704565b606091505b50509050806137555760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722046756e647320746f2053656c6c6572204661696c0000006044820152606401611223565b505b6137cd565b60028601546001600160a01b0316841580159061378157506001600160a01b03831615155b1561379a5761379a6001600160a01b03821684876148e7565b6000841180156137b257506001600160a01b03821615155b156137cb576137cb6001600160a01b03821683866148e7565b505b60038701805460ff60a01b1916600360a01b179055604080518a81523360208201527f22369ba22944aadf9e9d6f4c51462417a50ea7876b9c62c7c46b5522e9c672cc91015b60405180910390a15050505050505050611efc60018055565b60405163e12f3a6160e01b81523060048201526000906001600160a01b0383169063e12f3a6190602401602060405180830381865afa158015613873573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ce9190615825565b61389f6143ed565b60008181526007602090815260408083208054845260058352818420600180820154865260049094529190932091820154909190600160981b900460ff166003146138fc5760405162461bcd60e51b815260040161122390615749565b80546139209065ffffffffffff600160d01b8204811691600160a01b90041661583e565b65ffffffffffff1642116139765760405162461bcd60e51b815260206004820152601b60248201527f536574746c696e672054696d65204e6f7420456e6465642059657400000000006044820152606401611223565b6003830154600160a01b900460ff166001146139a45760405162461bcd60e51b815260040161122390615771565b60038301546001600160a01b03163314806139d257506139d2600080516020615a1283398151915233612ca7565b613a175760405162461bcd60e51b81526020600482015260166024820152754275796572206f72204f70657261746f72204f6e6c7960501b6044820152606401611223565b60028201546000906001600160a01b0316613a3457506012613ab0565b8260020160009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aad919061572c565b90505b6000613ace84600301548560050154876001015461190e9190615675565b90506000613aee8560030154866004015488600101546119409190615675565b90506000620f424060096002015484613b079190615675565b613b12906002615675565b613b1c91906156a2565b9050600081613b2b85856156b6565b613b3591906155d2565b60028801549091506001600160a01b0316613c285760038801546040516000916001600160a01b03169083908381818185875af1925050503d8060008114613b99576040519150601f19603f3d011682016040523d82523d6000602084013e613b9e565b606091505b5050600c546040519192506000916001600160a01b039091169085908381818185875af1925050503d8060008114613bf2576040519150601f19603f3d011682016040523d82523d6000602084013e613bf7565b606091505b50509050818015613c055750805b613c215760405162461bcd60e51b81526004016112239061579f565b5050613c67565b600287015460038901546001600160a01b0391821691613c4b91839116846148e7565b600c54613c65906001600160a01b038381169116856148e7565b505b60038801805460ff60a01b1916600360a01b1790557f6353c0ce500c8ea1f1026c8f39a6e0c2d1b2f17034fcd8a4b021c72e6e293e51898284336040516138139493929190615361565b613cb96143ed565b600081815260056020526040902060078101546001600160a01b03610100909104163314613d1c5760405162461bcd60e51b815260206004820152601060248201526f4f66666572204f776e6572204f6e6c7960801b6044820152606401611223565b600781015460ff16600114613d435760405162461bcd60e51b815260040161122390615538565b600081600601548260030154613d5991906155d2565b905060008111613d7b5760405162461bcd60e51b8152600401611223906155e5565b60028201546000906001600160a01b0316613d9857506012613e14565b8260020160009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ded573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e11919061572c565b90505b825460009060ff1660001901613e4357613e3c846003015485600401548561190e9190615675565b9050613e5e565b613e5b846003015485600501548561190e9190615675565b90505b600a54600090620f424090613e739084615675565b613e7d91906156a2565b9050613e8981836155d2565b60028601549092506001600160a01b0316613f8157600785015460405160009161010090046001600160a01b03169084908381818185875af1925050503d8060008114613ef2576040519150601f19603f3d011682016040523d82523d6000602084013e613ef7565b606091505b5050600c546040519192506000916001600160a01b039091169084908381818185875af1925050503d8060008114613f4b576040519150601f19603f3d011682016040523d82523d6000602084013e613f50565b606091505b50509050818015613f5e5750805b613f7a5760405162461bcd60e51b81526004016112239061579f565b5050613fc6565b600285015460078601546001600160a01b0391821691613faa91839161010090910416856148e7565b600c54613fc4906001600160a01b038381169116846148e7565b505b60078501805460ff191660031790557ff65e543d34c6936603a3741b3eace109133f172d25637c2445b95c1f3288e9378683836140003390565b6040516140109493929190615361565b60405180910390a15050505050611efc60018055565b600080516020615a1283398151915261403e81614361565b620151808265ffffffffffff1610156140a75760405162461bcd60e51b815260206004820152602560248201527f637265617465546f6b656e3a204d696e696d756d2032346820666f7220736574604482015264746c696e6760d81b6064820152608401611223565b60008381526003602052604090205460ff16156141105760405162461bcd60e51b815260206004820152602160248201527f637265617465546f6b656e3a20546f6b656e20616c72656164792065786973746044820152607360f81b6064820152608401611223565b6000838152600360209081526040808320805460ff191660019081179091556004835292819020805465ffffffffffff8716600160d01b81026001600160d01b03909216919091178255938101805460ff60981b1916600160981b1790558151878152928301939093527f1da02fe9181848bf1b401dde762d155f0da084c24db69129a3c7479f970ddbcc910160405180910390a150505050565b6141b36143ed565b6000848152600460205260409020600180820154600160981b900460ff161461420e5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2102a37b5b2b760991b6044820152606401611223565b60008411801561421e5750600083115b6142645760405162461bcd60e51b8152602060048201526017602482015276496e76616c696420416d6f756e74206f722056616c756560481b6044820152606401611223565b600954600090620f4240906142799086615675565b61428391906156a2565b9050600060ff8816600114614298578161429a565b845b9050348111156142bc5760405162461bcd60e51b8152600401611223906156c9565b8034111561433e5760006142d082346155d2565b604051909150600090339083908381818185875af1925050503d8060008114614315576040519150601f19603f3d011682016040523d82523d6000602084013e61431a565b606091505b505090508061433b5760405162461bcd60e51b8152600401611223906156f5565b50505b61434e888860008989878a6146c2565b50505061435a60018055565b5050505050565b611efc8133614d31565b60006143768361382c565b604051635569f64b60e11b81526001600160a01b038481166004830152602482018390529192509084169063aad3ec96906044016020604051808303816000875af11580156143c9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9a9190615825565b60026001540361441057604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b60006005600086815260200190815260200160002090506040518060a00160405280868152602001858152602001836001600160a01b03168152602001846001600160a01b03168152602001600160ff168152506007600060086000815461447e90615864565b918290555081526020808201929092526040908101600090812084518155928401516001840155908301516002830180546001600160a01b039283166001600160a01b031990911617905560608401516003909301805460809095015160ff16600160a01b026001600160a81b031990951693909116929092179290921790556006820180548692906145129084906156b6565b9091555050600381015460068201540361456f5760078101805460ff1916600217905560408051868152600060208201527f37a30d6e3fcaec3144b11d51892b9eadbb0ec4d2a8a813d64bb6065c3adfcffa910160405180910390a15b600854604080519182526020820187905281018590526001600160a01b038084166060830152841660808201527fdc3effd7f2b46d1989f8b9ec5abba2e3c07eaa9caa9511c8af3c9444ecbb52f29060a001611ecd565b60008160ff168360ff16036145dc575082614654565b8160ff168360ff161015614610576145f4838361587d565b6145ff90600a61597a565b6146099085615675565b9050614654565b600061461c838561587d565b61462790600a61597a565b905061463381866156a2565b915061463f8186615989565b156146525761464f6001836156b6565b91505b505b9392505050565b6040516001600160a01b038481166024830152838116604483015260648201839052611f9a9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614d6a565b6040518061014001604052808860ff168152602001878152602001866001600160a01b0316815260200185815260200184815260200183815260200160008152602001600160ff1681526020016147163390565b6001600160a01b031681526020018215158152506005600060066000815461473d90615864565b9182905550815260208082019290925260409081016000208351815460ff191660ff918216178255928401516001820155908301516002820180546001600160a01b0319166001600160a01b03928316179055606084015160038301556080840151600483015560a0840151600583015560c084015160068084019190915560e0850151600790930180546101008088015161012090980151959096166001600160a81b031990911617959092169093029390931760ff60a81b1916600160a81b9115159190910217909155547f8f8f88015929d8eeb82fcc5c324b9713dc52572eae5cf9e6e80f7e2d81ae089890888888888888883360408051998a5260ff90981660208a0152968801959095526001600160a01b039384166060880152608087019290925260a086015260c085015290151560e0840152166101008201526101200160405180910390a150505050505050565b60008160ff168360ff16036148a8575082614654565b8160ff168360ff1610156148c0576145f4838361587d565b6148ca828461587d565b6148d590600a61597a565b6148df90856156a2565b949350505050565b6040516001600160a01b03838116602483015260448201839052611f7091859182169063a9059cbb90606401614690565b60405163430021db60e11b81523060048201526001600160a01b03821660248201526002604360981b019063860043b6906044015b6020604051808303816000875af115801561496c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f69190615825565b600061499c8383612ca7565b614a1a576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556149d23390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016111ce565b5060006111ce565b6000614a2e8383612ca7565b15614a1a576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016111ce565b6002604360981b016001600160a01b031663f098767a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614acf57600080fd5b505af1158015614ae3573d6000803e3d6000fd5b505050506002604360981b016001600160a01b0316634e606c476040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614b2957600080fd5b505af1158015614b3d573d6000803e3d6000fd5b5050604051631a33757d60e01b81526003604360981b019250631a33757d9150614b6c9060029060040161599d565b6020604051808303816000875af1158015614b8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614baf9190615825565b50604051631a33757d60e01b81526004604360981b0190631a33757d90614bdb9060029060040161599d565b6020604051808303816000875af1158015614bfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611efc9190615825565b6040516336b91f2b60e01b81526001600160a01b0382166004820152732536fe9ab3f511540f2f9e2ec2a805005c3dd800906336b91f2b90602401600060405180830381600087803b158015614c7357600080fd5b505af115801561435a573d6000803e3d6000fd5b604051634aa7d2f760e11b81523060048201526001600160a01b03821660248201526002604360981b019063954fa5ee9060440161494d565b604051632cc0202b60e21b81526001600160a01b03808416600483015282166024820152732536fe9ab3f511540f2f9e2ec2a805005c3dd8009063b30080ac90604401600060405180830381600087803b158015614d1d57600080fd5b505af11580156116ea573d6000803e3d6000fd5b614d3b8282612ca7565b6111f65760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401611223565b6000614d7f6001600160a01b03841683614dcd565b90508051600014158015614da4575080806020019051810190614da291906159c5565b155b15611f7057604051635274afe760e01b81526001600160a01b0384166004820152602401611223565b60606146548383600084600080856001600160a01b03168486604051614df391906159e2565b60006040518083038185875af1925050503d8060008114614e30576040519150601f19603f3d011682016040523d82523d6000602084013e614e35565b606091505b5091509150614e45868383614e4f565b9695505050505050565b606082614e6457614e5f82614eab565b614654565b8151158015614e7b57506001600160a01b0384163b155b15614ea457604051639996b31560e01b81526001600160a01b0385166004820152602401611223565b5080614654565b805115614ebb5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600060208284031215614ee657600080fd5b81356001600160e01b03198116811461465457600080fd5b80356001600160a01b0381168114614f1557600080fd5b919050565b600060208284031215614f2c57600080fd5b61465482614efe565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614f7457614f74614f35565b604052919050565b600067ffffffffffffffff821115614f9657614f96614f35565b5060051b60200190565b600082601f830112614fb157600080fd5b81356020614fc6614fc183614f7c565b614f4b565b8083825260208201915060208460051b870101935086841115614fe857600080fd5b602086015b848110156150045780358352918301918301614fed565b509695505050505050565b6000806040838503121561502257600080fd5b823567ffffffffffffffff8082111561503a57600080fd5b61504686838701614fa0565b9350602085013591508082111561505c57600080fd5b5061506985828601614fa0565b9150509250929050565b60ff81168114611efc57600080fd5b8015158114611efc57600080fd5b8035614f1581615082565b60008060008060008060c087890312156150b457600080fd5b86356150bf81615073565b95506020870135945060408701359350606087013592506150e260808801614efe565b915060a08701356150f281615082565b809150509295509295509295565b6000806040838503121561511357600080fd5b50508035926020909101359150565b60006020828403121561513457600080fd5b813567ffffffffffffffff81111561514b57600080fd5b6148df84828501614fa0565b60006020828403121561516957600080fd5b5035919050565b6000806000806080858703121561518657600080fd5b61518f85614efe565b966020860135965060408601359560600135945092505050565b600080604083850312156151bc57600080fd5b82359150602083013565ffffffffffff811681146151d957600080fd5b809150509250929050565b600080604083850312156151f757600080fd5b823567ffffffffffffffff8082111561520f57600080fd5b61521b86838701614fa0565b935060209150818501358181111561523257600080fd5b85019050601f8101861361524557600080fd5b8035615253614fc182614f7c565b81815260059190911b8201830190838101908883111561527257600080fd5b928401925b8284101561529057833582529284019290840190615277565b80955050505050509250929050565b600080604083850312156152b257600080fd5b823591506152c260208401614efe565b90509250929050565b815160ff16815261014081016020830151602083015260408301516152fb60408401826001600160a01b03169052565b50606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015161533860e084018260ff169052565b50610100838101516001600160a01b031690830152610120928301511515929091019190915290565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60008060006060848603121561539a57600080fd5b833592506153aa60208501614efe565b915060408401356001600160981b03811681146153c657600080fd5b809150509250925092565b600080604083850312156153e457600080fd5b823567ffffffffffffffff8111156153fb57600080fd5b8301601f8101851361540c57600080fd5b8035602061541c614fc183614f7c565b82815260059290921b8301810191818101908884111561543b57600080fd5b938201935b838510156154605761545185614efe565b82529382019390820190615440565b955061546f9050868201615090565b93505050509250929050565b6000806040838503121561548e57600080fd5b61549783614efe565b91506152c260208401614efe565b600080600080600060a086880312156154bd57600080fd5b85356154c881615073565b945060208601359350604086013592506060860135915060808601356154ed81615082565b809150509295509295909350565b6020808252600d908201526c125b9d985b1a5908125b9c1d5d609a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260149082015273496e76616c6964204f666665722053746174757360601b604082015260600190565b602080825260149082015273496e76616c696420746f6b656e2053746174757360601b604082015260600190565b6020808252600e908201526d125b9d985b1a5908105b5bdd5b9d60921b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156111ce576111ce6155bc565b60208082526018908201527f496e73756666696369656e7420416c6c6f636174696f6e730000000000000000604082015260600190565b602080825260129082015271119d5b1b13585d18da081c995c5d5a5c995960721b604082015260600190565b60208082526013908201527224b73b30b634b21027b33332b9102a37b5b2b760691b604082015260600190565b80820281158282048414176111ce576111ce6155bc565b634e487b7160e01b600052601260045260246000fd5b6000826156b1576156b161568c565b500490565b808201808211156111ce576111ce6155bc565b602080825260129082015271496e73756666696369656e742046756e647360701b604082015260600190565b6020808252601b908201527f526566756e64206f662065786365737320455448206661696c65640000000000604082015260600190565b60006020828403121561573e57600080fd5b815161465481615073565b6020808252600e908201526d496e76616c69642053746174757360901b604082015260600190565b602080825260149082015273496e76616c6964204f726465722053746174757360601b604082015260600190565b602080825260139082015272151c985b9cd9995c88119d5b991cc811985a5b606a1b604082015260600190565b604080825283519082018190526000906020906060840190828701845b8281101561580e5781516001600160a01b0316845292840192908401906001016157e9565b505050809250505082151560208301529392505050565b60006020828403121561583757600080fd5b5051919050565b65ffffffffffff81811683821601908082111561585d5761585d6155bc565b5092915050565b600060018201615876576158766155bc565b5060010190565b60ff82811682821603908111156111ce576111ce6155bc565b600181815b808511156158d15781600019048211156158b7576158b76155bc565b808516156158c457918102915b93841c939080029061589b565b509250929050565b6000826158e8575060016111ce565b816158f5575060006111ce565b816001811461590b576002811461591557615931565b60019150506111ce565b60ff841115615926576159266155bc565b50506001821b6111ce565b5060208310610133831016604e8410600b8410161715615954575081810a6111ce565b61595e8383615896565b8060001904821115615972576159726155bc565b029392505050565b600061465460ff8416836158d9565b6000826159985761599861568c565b500690565b60208101600383106159bf57634e487b7160e01b600052602160045260246000fd5b91905290565b6000602082840312156159d757600080fd5b815161465481615082565b6000825160005b81811015615a0357602081860181015185830152016159e9565b50600092019182525091905056fe97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929a26469706673582212202151861508fd2846a74e86692f9e392b0717cdde3d723dc52cfa016943613c2164736f6c6343000818003300000000000000000000000010f4861365511ae1a11dbd2210bcccad42bcbf1a
Deployed Bytecode
0x6080604052600436106103d95760003560e01c806379502c55116101fd578063bff4945011610118578063e46c02e3116100ab578063f01701501161007a578063f017015014610ffa578063f1ee8fdd14611118578063f564f0ae14611138578063f5b541a61461114b578063ffb126761461116d57600080fd5b8063e46c02e314610f62578063e4cb62c014610f8a578063e7a7594914610faa578063ef706adf14610fda57600080fd5b8063dc8beea9116100e7578063dc8beea914610eb9578063deb2ec6a14610ef2578063e12f3a6114610f12578063e3df748a14610f3257600080fd5b8063bff4945014610e0c578063cfcdeb7e14610e46578063d547741f14610e66578063d843b2c714610e8657600080fd5b8063985a7c1d11610190578063aaab596a1161015f578063aaab596a14610d91578063ad5c464814610db1578063b30080ac14610dcc578063bc205ad314610dec57600080fd5b8063985a7c1d14610caa578063a1bd91e114610cca578063a217fddf14610cea578063a85c38ef14610cff57600080fd5b80638a72ea6a116101cc5780638a72ea6a14610acf578063904194a314610bb557806391d1485414610c6f57806397d7577614610c8f57600080fd5b806379502c5514610a3057806381cc37b214610a6c57806382dc4a0514610a7f57806386aa7db014610aaf57600080fd5b806336568abe116102f85780635d3473e31161028b5780636a951f201161025a5780636a951f20146108b85780637400f52d146108d857806375b5908a146108f857806378447e7f146109185780637857f9fb1461093857600080fd5b80635d3473e314610809578063643268c91461083c578063645dd1fa14610852578063670017f41461086757600080fd5b80633baf6784116102c75780633baf6784146106a45780634a99533b146107be5780634ae25a86146107d35780635662ecc7146107f357600080fd5b806336568abe14610616578063368472161461063657806336b91f2b1461064b5780633b6e750f1461066b57600080fd5b80631f4846d8116103705780632d6705841161033f5780632d6705841461058e5780632f2ff15d146105ae57806331a0edec146105ce57806331a37c1e1461060157600080fd5b80631f4846d8146104fb57806321146fa21461051b578063248a9ca31461053b57806327cdbb9c1461057957600080fd5b806316b4cdb2116103ac57806316b4cdb21461046857806317b137ba1461048857806318b4f367146104a85780631f25a2d8146104db57600080fd5b806301ffc9a7146103de578063030d34231461041357806306f13da9146104355780630b8aacb914610448575b600080fd5b3480156103ea57600080fd5b506103fe6103f9366004614ed4565b61119d565b60405190151581526020015b60405180910390f35b34801561041f57600080fd5b5061043361042e366004614f1a565b6111d4565b005b61043361044336600461500f565b6111fa565b34801561045457600080fd5b5061043361046336600461509b565b6114f0565b34801561047457600080fd5b50610433610483366004615100565b6116f2565b34801561049457600080fd5b506104336104a3366004615122565b611b64565b3480156104b457600080fd5b506103fe6104c3366004615157565b60009081526005602052604090205460ff1660021490565b3480156104e757600080fd5b506104336104f6366004615170565b611b9a565b34801561050757600080fd5b50610433610516366004615122565b611db3565b34801561052757600080fd5b506104336105363660046151a9565b611de9565b34801561054757600080fd5b5061056b610556366004615157565b60009081526020819052604090206001015490565b60405190815260200161040a565b34801561058557600080fd5b50610433611edc565b34801561059a57600080fd5b506104336105a93660046151e4565b611eff565b3480156105ba57600080fd5b506104336105c936600461529f565b611f75565b3480156105da57600080fd5b506105e96003604360981b0181565b6040516001600160a01b03909116815260200161040a565b34801561060d57600080fd5b5060085461056b565b34801561062257600080fd5b5061043361063136600461529f565b611fa0565b34801561064257600080fd5b50610433611fd3565b34801561065757600080fd5b50610433610666366004614f1a565b611fe6565b34801561067757600080fd5b506103fe610686366004614f1a565b6001600160a01b031660009081526002602052604090205460ff1690565b3480156106b057600080fd5b506107b16106bf366004615157565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915250600090815260056020818152604092839020835161014081018552815460ff908116825260018301549382019390935260028201546001600160a01b039081169582019590955260038201546060820152600482015460808201529281015460a0840152600681015460c08401526007015480821660e084015261010080820490941693830193909352600160a81b909204909116151561012082015290565b60405161040a91906152cb565b3480156107ca57600080fd5b5060065461056b565b3480156107df57600080fd5b506104336107ee366004615122565b611ffa565b3480156107ff57600080fd5b5061056b60085481565b34801561081557600080fd5b506103fe610824366004615157565b60009081526005602052604090205460ff1660011490565b34801561084857600080fd5b5061056b60065481565b34801561085e57600080fd5b50610433612030565b34801561087357600080fd5b5061087c612050565b60405161040a91908151815260208083015190820152604080830151908201526060918201516001600160a01b03169181019190915260800190565b3480156108c457600080fd5b506104336108d3366004615157565b6120ba565b3480156108e457600080fd5b506104336108f3366004615157565b6121c6565b34801561090457600080fd5b5061043361091336600461500f565b61228f565b34801561092457600080fd5b50610433610933366004615100565b61258d565b34801561094457600080fd5b506109df610953366004615157565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915250600090815260076020908152604091829020825160a0810184528154815260018201549281019290925260028101546001600160a01b0390811693830193909352600301549182166060820152600160a01b90910460ff16608082015290565b60405161040a919081518152602080830151908201526040808301516001600160a01b03908116918301919091526060808401519091169082015260809182015160ff169181019190915260a00190565b348015610a3c57600080fd5b50600954600a54600b54600c54610a5c939291906001600160a01b031684565b60405161040a9493929190615361565b610433610a7a366004615100565b61280d565b348015610a8b57600080fd5b506103fe610a9a366004614f1a565b60026020526000908152604090205460ff1681565b348015610abb57600080fd5b50610433610aca366004615385565b612a8d565b348015610adb57600080fd5b50610b54610aea366004615157565b60056020819052600091825260409091208054600182015460028301546003840154600485015495850154600686015460079096015460ff9586169794966001600160a01b03948516969395949293909282821692610100810490911691600160a81b909104168a565b6040805160ff9b8c168152602081019a909a526001600160a01b03988916908a01526060890196909652608088019490945260a087019290925260c086015290941660e084015292166101008201529015156101208201526101400161040a565b348015610bc157600080fd5b50610c25610bd0366004615157565b600460205260009081526040902080546001909101546001600160a01b0382169165ffffffffffff600160a01b8204811692600160d01b90920416906001600160981b0381169060ff600160981b9091041685565b604080516001600160a01b0396909616865265ffffffffffff948516602087015292909316918401919091526001600160981b0316606083015260ff16608082015260a00161040a565b348015610c7b57600080fd5b506103fe610c8a36600461529f565b612ca7565b348015610c9b57600080fd5b506105e96002604360981b0181565b348015610cb657600080fd5b50610433610cc53660046153d1565b612cd0565b348015610cd657600080fd5b5061056b610ce5366004615157565b612d77565b348015610cf657600080fd5b5061056b600081565b348015610d0b57600080fd5b50610d5a610d1a366004615157565b6007602052600090815260409020805460018201546002830154600390930154919290916001600160a01b0391821691811690600160a01b900460ff1685565b6040805195865260208601949094526001600160a01b039283169385019390935216606083015260ff16608082015260a00161040a565b348015610d9d57600080fd5b50610433610dac366004615157565b612d9a565b348015610dbd57600080fd5b506105e96004604360981b0181565b348015610dd857600080fd5b50610433610de736600461547b565b6132f9565b348015610df857600080fd5b50610433610e0736600461547b565b61330e565b348015610e1857600080fd5b5061056b610e27366004615157565b600090815260076020526040902060030154600160a01b900460ff1690565b348015610e5257600080fd5b50610433610e61366004615122565b61340f565b348015610e7257600080fd5b50610433610e8136600461529f565b613445565b348015610e9257600080fd5b5061056b610ea1366004615157565b60009081526005602052604090206007015460ff1690565b348015610ec557600080fd5b506105e9610ed4366004615157565b6000908152600560205260409020600201546001600160a01b031690565b348015610efe57600080fd5b50610433610f0d366004615157565b61346a565b348015610f1e57600080fd5b5061056b610f2d366004614f1a565b61382c565b348015610f3e57600080fd5b5061056b610f4d366004615157565b60009081526005602052604090206004015490565b348015610f6e57600080fd5b506105e9732536fe9ab3f511540f2f9e2ec2a805005c3dd80081565b348015610f9657600080fd5b50610433610fa5366004615157565b613897565b348015610fb657600080fd5b5061056b610fc5366004615157565b60009081526005602052604090206003015490565b348015610fe657600080fd5b50610433610ff5366004615157565b613cb1565b34801561100657600080fd5b506110b9611015366004615157565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915250600090815260046020908152604091829020825160a08101845281546001600160a01b038116825265ffffffffffff600160a01b8204811694830194909452600160d01b9004909216928201929092526001909101546001600160981b038116606083015260ff600160981b90910416608082015290565b6040805182516001600160a01b0316815260208084015165ffffffffffff908116918301919091528383015116918101919091526060808301516001600160981b03169082015260809182015160ff169181019190915260a00161040a565b34801561112457600080fd5b506104336111333660046151a9565b614026565b6104336111463660046154a5565b6141ab565b34801561115757600080fd5b5061056b600080516020615a1283398151915281565b34801561117957600080fd5b506103fe611188366004615157565b60036020526000908152604090205460ff1681565b60006001600160e01b03198216637965db0b60e01b14806111ce57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60006111df81614361565b600c546111f69083906001600160a01b031661436b565b5050565b6112026143ed565b805182511461122c5760405162461bcd60e51b8152600401611223906154fb565b60405180910390fd5b6000805b835181101561144357600084828151811061124d5761124d615522565b60200260200101519050600084838151811061126b5761126b615522565b602090810291909101810151600084815260058352604080822060018082015484526004909552912060078201549294509092909160ff16146112c05760405162461bcd60e51b815260040161122390615538565b600181810154600160981b900460ff16146112ed5760405162461bcd60e51b815260040161122390615566565b6000831161130d5760405162461bcd60e51b815260040161122390615594565b828260060154836003015461132291906155d2565b10156113405760405162461bcd60e51b8152600401611223906155e5565b6007820154600160a81b900460ff16158061135e5750828260030154145b61137a5760405162461bcd60e51b81526004016112239061561c565b60028201546001600160a01b0316156113a55760405162461bcd60e51b815260040161122390615648565b815460009060ff16600019016113db5782600301548484600501546113ca9190615675565b6113d491906156a2565b90506113fd565b82600301548484600401546113f09190615675565b6113fa91906156a2565b90505b61140781886156b6565b965061143285858560070160019054906101000a90046001600160a01b031661142d3390565b614417565b505060019093019250611230915050565b50803410156114645760405162461bcd60e51b8152600401611223906156c9565b803411156114e657600061147882346155d2565b604051909150600090339083908381818185875af1925050503d80600081146114bd576040519150601f19603f3d011682016040523d82523d6000602084013e6114c2565b606091505b50509050806114e35760405162461bcd60e51b8152600401611223906156f5565b50505b506111f660018055565b6114f86143ed565b6000858152600460205260409020600180820154600160981b900460ff16146115535760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2102a37b5b2b760991b6044820152606401611223565b6001600160a01b0383161580159061158357506001600160a01b03831660009081526002602052604090205460ff165b61159f5760405162461bcd60e51b815260040161122390615648565b6000851180156115af5750600084115b6115f55760405162461bcd60e51b8152602060048201526017602482015276496e76616c696420416d6f756e74206f722056616c756560481b6044820152606401611223565b6000836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611635573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611659919061572c565b90506000611669866012846145c6565b90506000620f4240600960000154886116829190615675565b61168c91906156a2565b9050600061169c826012866145c6565b9050600060ff8c166001146116b157816116b3565b835b9050876116cb6001600160a01b03821633308561465b565b6116da8d8d8b8e8e898e6146c2565b505050505050506116ea60018055565b505050505050565b6116fa6143ed565b600080516020615a1283398151915261171281614361565b60008381526007602090815260408083208054845260058352818420600180820154865260049094529190932091820154909190600160981b900460ff1660031461176f5760405162461bcd60e51b815260040161122390615749565b80546001600160a01b031615801590611794575060018101546001600160981b031615155b6117d05760405162461bcd60e51b815260206004820152600d60248201526c151bdad95b88139bdd0814d95d609a1b6044820152606401611223565b8054600160a01b900465ffffffffffff166118295760405162461bcd60e51b815260206004820152601960248201527814d95d1d1b1a5b99c8151a5b5948139bdd0814dd185c9d1959603a1b6044820152606401611223565b6003830154600160a01b900460ff166001146118575760405162461bcd60e51b815260040161122390615771565b60028201546000906001600160a01b0316611874575060126118f0565b8260020160009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ed919061572c565b90505b600061192084600301548560050154876001015461190e9190615675565b61191891906156a2565b601284614892565b905060006119528560030154866004015488600101546119409190615675565b61194a91906156a2565b601285614892565b90506000620f42406009600201548361196b9190615675565b61197591906156a2565b905060008161198485856156b6565b61198e91906155d2565b60028801549091506001600160a01b0316611a815760028801546040516000916001600160a01b03169083908381818185875af1925050503d80600081146119f2576040519150601f19603f3d011682016040523d82523d6000602084013e6119f7565b606091505b5050600c546040519192506000916001600160a01b039091169085908381818185875af1925050503d8060008114611a4b576040519150601f19603f3d011682016040523d82523d6000602084013e611a50565b606091505b50509050818015611a5e5750805b611a7a5760405162461bcd60e51b81526004016112239061579f565b5050611ac0565b600280880154908901546001600160a01b0391821691611aa491839116846148e7565b600c54611abe906001600160a01b038381169116856148e7565b505b60038801805460ff60a01b1916600160a11b179055604080518c8152602081018c9052338183015290517fbac7c71779ccc41f8c859e9d622536f76f0375a85b23e1b3d4134f613a9fff54916060908290030190a17f94d22e970a1abb720b741045e471af3fa516f4e2ede6b665387332888f92f2138b828433604051611b4a9493929190615361565b60405180910390a15050505050505050506111f660018055565b60005b81518110156111f657611b92828281518110611b8557611b85615522565b6020026020010151612d9a565b600101611b67565b600080516020615a12833981519152611bb281614361565b6001600160a01b038516611bfa5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964204164647265737360881b6044820152606401611223565b611c08600a620f42406156a2565b841115611c4b5760405162461bcd60e51b8152602060048201526011602482015270536574746c6520466565203c3d2031302560781b6044820152606401611223565b611c59600a620f42406156a2565b831115611c9c5760405162461bcd60e51b815260206004820152601160248201527043616e63656c20466565203c3d2031302560781b6044820152606401611223565b611caa6064620f42406156a2565b8210158015611cbc5750620f42408211155b611d085760405162461bcd60e51b815260206004820152601860248201527f506c656467652052617465206f7574206f662072616e676500000000000000006044820152606401611223565b600c54600b54600a54600954604080516001600160a01b03958616815260208101949094528301919091526060820152908616608082015260a0810185905260c0810184905260e081018390527f72fe78202ae1d56b2334bc8c804db955e2349789b271b7f55e8109f7122f0a11906101000160405180910390a150600c80546001600160a01b0319166001600160a01b039590951694909417909355600b91909155600a55600955565b60005b81518110156111f657611de1828281518110611dd457611dd4615522565b6020026020010151613897565b600101611db6565b600080516020615a12833981519152611e0181614361565b620151808265ffffffffffff161015611e5c5760405162461bcd60e51b815260206004820152601860248201527f4d696e696d756d2032346820666f7220736574746c696e6700000000000000006044820152606401611223565b600083815260046020908152604091829020805465ffffffffffff868116600160d01b8181026001600160d01b03851617855586518a8152930490911693820184905293810193909352917fd5042937eda12ebddebb9d9ecaf0d88595a67d0d28513340610674acbd48274b906060015b60405180910390a15050505050565b6000611ee781614361565b600c54611efc906001600160a01b0316614918565b50565b8051825114611f205760405162461bcd60e51b8152600401611223906154fb565b60005b8251811015611f7057611f68838281518110611f4157611f41615522565b6020026020010151838381518110611f5b57611f5b615522565b60200260200101516116f2565b600101611f23565b505050565b600082815260208190526040902060010154611f9081614361565b611f9a8383614990565b50505050565b6001600160a01b0381163314611fc95760405163334bd91960e11b815260040160405180910390fd5b611f708282614a22565b6000611fde81614361565b611efc614a8d565b6000611ff181614361565b6111f682614c1e565b60005b81518110156111f65761202882828151811061201b5761201b615522565b6020026020010151613cb1565b600101611ffd565b600061203b81614361565b600c54611efc906001600160a01b0316614c87565b612084604051806080016040528060008152602001600081526020016000815260200160006001600160a01b031681525090565b50604080516080810182526009548152600a546020820152600b5491810191909152600c546001600160a01b0316606082015290565b600080516020615a128339815191526120d281614361565b60008281526004602052604081206001808201549192600160981b90920460ff1691908214612102576001612105565b60025b905060ff82166001148061211c575060ff82166002145b6121685760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74204368616e676520546f6b656e205374617475730000000000006044820152606401611223565b60018301805460ff838116600160981b810260ff60981b19909316929092179092556040805188815292851660208401528201527f853e3a954af7889419a6922a1bc350b54c6217937a4a2aed1176ed3f5a1dfb5290606001611ecd565b600080516020615a128339815191526121de81614361565b60008281526004602052604090206001810154600160981b900460ff166003146122415760405162461bcd60e51b8152602060048201526014602482015273496e76616c696420546f6b656e2053746174757360601b6044820152606401611223565b60018101805460ff60981b1916600160991b1790556040518381527f6ac56c552b96d07b41e8ee97200f747e7476892e0e2e53e9803199bfe014b0a8906020015b60405180910390a1505050565b6122976143ed565b80518251146122b85760405162461bcd60e51b8152600401611223906154fb565b60005b82518110156114e65760008382815181106122d8576122d8615522565b6020026020010151905060008383815181106122f6576122f6615522565b602090810291909101810151600084815260058352604080822060018082015484526004909552912060078201549294509092909160ff161461234b5760405162461bcd60e51b815260040161122390615538565b600181810154600160981b900460ff16146123785760405162461bcd60e51b815260040161122390615566565b600083116123985760405162461bcd60e51b815260040161122390615594565b82826006015483600301546123ad91906155d2565b10156123cb5760405162461bcd60e51b8152600401611223906155e5565b6007820154600160a81b900460ff1615806123e95750828260030154145b6124055760405162461bcd60e51b81526004016112239061561c565b60028201546001600160a01b031661242f5760405162461bcd60e51b815260040161122390615648565b60028201546040805163313ce56760e01b815290516001600160a01b0390921691600091829182918291869163313ce5679160048083019260209291908290030181865afa158015612485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a9919061572c565b875490915060ff166000190161250957600087600301548989600501546124d09190615675565b6124da91906156a2565b90506124e8816012846145c6565b600789015490955061010090046001600160a01b0316935033925050612555565b600087600301548989600401546125209190615675565b61252a91906156a2565b9050612538816012846145c6565b945033600789015490945061010090046001600160a01b03169250505b61256c335b6001600160a01b03871690308761465b565b61257889898585614417565b5050600190970196506122bb95505050505050565b6125956143ed565b60008281526005602090815260408083206001808201548552600490935292206007830154909160ff909116146125de5760405162461bcd60e51b815260040161122390615538565b600181810154600160981b900460ff161461260b5760405162461bcd60e51b815260040161122390615566565b6000831161262b5760405162461bcd60e51b815260040161122390615594565b828260060154836003015461264091906155d2565b101561265e5760405162461bcd60e51b8152600401611223906155e5565b6007820154600160a81b900460ff16158061267c5750828260030154145b6126985760405162461bcd60e51b81526004016112239061561c565b60028201546001600160a01b03166126c25760405162461bcd60e51b815260040161122390615648565b60028201546040805163313ce56760e01b815290516001600160a01b0390921691600091829182918291869163313ce5679160048083019260209291908290030181865afa158015612718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273c919061572c565b875490915060ff166000190161279c57600087600301548989600501546127639190615675565b61276d91906156a2565b905061277b816012846145c6565b600789015490955061010090046001600160a01b03169350339250506127e8565b600087600301548989600401546127b39190615675565b6127bd91906156a2565b90506127cb816012846145c6565b945033600789015490945061010090046001600160a01b03169250505b6127f13361255a565b6127fd89898585614417565b505050505050506111f660018055565b6128156143ed565b60008281526005602090815260408083206001808201548552600490935292206007830154909160ff9091161461285e5760405162461bcd60e51b815260040161122390615538565b600181810154600160981b900460ff161461288b5760405162461bcd60e51b815260040161122390615566565b600083116128ab5760405162461bcd60e51b815260040161122390615594565b82826006015483600301546128c091906155d2565b10156128de5760405162461bcd60e51b8152600401611223906155e5565b6007820154600160a81b900460ff1615806128fc5750828260030154145b6129185760405162461bcd60e51b81526004016112239061561c565b60028201546001600160a01b0316156129435760405162461bcd60e51b815260040161122390615648565b81546000908190819060ff166000190161299657846003015486866005015461296c9190615675565b61297691906156a2565b600786015490935061010090046001600160a01b031691503390506129d1565b84600301548686600401546129ab9190615675565b6129b591906156a2565b925033600786015490925061010090046001600160a01b031690505b823410156129f15760405162461bcd60e51b8152600401611223906156c9565b82341115612a73576000612a0584346155d2565b604051909150600090339083908381818185875af1925050503d8060008114612a4a576040519150601f19603f3d011682016040523d82523d6000602084013e612a4f565b606091505b5050905080612a705760405162461bcd60e51b8152600401611223906156f5565b50505b612a7f87878484614417565b50505050506111f660018055565b600080516020615a12833981519152612aa581614361565b60008481526004602052604090206001600160a01b038416612b1b5760405162461bcd60e51b815260206004820152602960248201527f746f6b656e546f536574746c6550686173653a20496e76616c696420546f6b656044820152686e204164647265737360b81b6064820152608401611223565b6000836001600160981b031611612b835760405162461bcd60e51b815260206004820152602660248201527f746f6b656e546f536574746c6550686173653a496e76616c696420536574746c60448201526565205261746560d01b6064820152608401611223565b600181810154600160981b900460ff161480612bad57506001810154600160981b900460ff166002145b612c095760405162461bcd60e51b815260206004820152602760248201527f746f6b656e546f536574746c6550686173653a496e76616c696420546f6b656e6044820152662053746174757360c81b6064820152608401611223565b80546001820180546001600160981b0386166001600160a01b03199091168117600360981b179091556001600160a01b0386166001600160d01b03199092168217600160a01b4265ffffffffffff81169190910291909117845560408051898152602081019490945283019190915260608201527f973839ac031e9779c3158a52ae98cb3b0be8a378b1adc2b2ce2c14f89c81489590608001611ecd565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b600080516020615a12833981519152612ce881614361565b60005b8351811015612d45578260026000868481518110612d0b57612d0b615522565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055600101612ceb565b507f6a980e8ca36409cff27b8778560e2a0f5183fea53171bc0aeff7317906c7c1f483836040516122829291906157cc565b600081815260056020526040812060068101546003909101546111ce91906155d2565b612da26143ed565b60008181526007602090815260408083208054845260058352818420600180820154865260049094529190932091820154909190600160981b900460ff16600314612dff5760405162461bcd60e51b815260040161122390615749565b80546001600160a01b031615801590612e24575060018101546001600160981b031615155b612e605760405162461bcd60e51b815260206004820152600d60248201526c151bdad95b88139bdd0814d95d609a1b6044820152606401611223565b8054600160a01b900465ffffffffffff16612eb95760405162461bcd60e51b815260206004820152601960248201527814d95d1d1b1a5b99c8151a5b5948139bdd0814dd185c9d1959603a1b6044820152606401611223565b60028301546001600160a01b03163314612f035760405162461bcd60e51b815260206004820152600b60248201526a53656c6c6572204f6e6c7960a81b6044820152606401611223565b6003830154600160a01b900460ff16600114612f315760405162461bcd60e51b815260040161122390615771565b60028201546000906001600160a01b0316612f4e57506012612fca565b8260020160009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fa3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc7919061572c565b90505b6000612fe884600301548560050154876001015461190e9190615675565b905060006130088560030154866004015488600101546119409190615675565b84546040805163313ce56760e01b815290519293506001600160a01b0390911691600091839163313ce567916004808201926020929091908290030181865afa158015613059573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307d919061572c565b600180880154908a01549192506000916130a991620f42409161190e916001600160981b031690615675565b90506000620f4240600960020154836130c29190615675565b6130cc91906156a2565b60028b0154600c549192506130f1916001600160a01b0387811692811691168461465b565b60028a015460038b0154613128916001600160a01b03908116911661311684866155d2565b6001600160a01b03881692919061465b565b600b54600090620f42409061313d9088615675565b61314791906156a2565b905060008161315689896156b6565b61316091906155d2565b60028c01549091506001600160a01b03166132535760028c01546040516000916001600160a01b03169083908381818185875af1925050503d80600081146131c4576040519150601f19603f3d011682016040523d82523d6000602084013e6131c9565b606091505b5050600c546040519192506000916001600160a01b039091169085908381818185875af1925050503d806000811461321d576040519150601f19603f3d011682016040523d82523d6000602084013e613222565b606091505b505090508180156132305750805b61324c5760405162461bcd60e51b81526004016112239061579f565b5050613292565b6002808c0154908d01546001600160a01b039182169161327691839116846148e7565b600c54613290906001600160a01b038381169116856148e7565b505b60038c01805460ff60a01b1916600160a11b1790557f94d22e970a1abb720b741045e471af3fa516f4e2ede6b665387332888f92f2138d8284336040516132dc9493929190615361565b60405180910390a1505050505050505050505050611efc60018055565b600061330481614361565b611f708383614cc0565b600061331981614361565b6001600160a01b0383161580159061334a57506001600160a01b03831660009081526002602052604090205460ff16155b61338e5760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420546f6b656e204164647265737360581b6044820152606401611223565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa1580156133d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f99190615825565b9050611f9a6001600160a01b03851684836148e7565b60005b81518110156111f65761343d82828151811061343057613430615522565b602002602001015161346a565b600101613412565b60008281526020819052604090206001015461346081614361565b611f9a8383614a22565b6134726143ed565b600080516020615a1283398151915261348a81614361565b60008281526007602090815260408083208054845260059092529091206003820154600160a01b900460ff166001146134d55760405162461bcd60e51b815260040161122390615771565b60028101546000906001600160a01b03166134f25750601261356e565b8160020160009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613547573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061356b919061572c565b90505b600061358c83600301548460040154866001015461190e9190615675565b905060006135ac8460030154856005015487600101546119409190615675565b6003860154600280880154908701549293506001600160a01b0391821692908216911661375c576000841180156135eb57506001600160a01b03821615155b15613695576000826001600160a01b03168560405160006040518083038185875af1925050503d806000811461363d576040519150601f19603f3d011682016040523d82523d6000602084013e613642565b606091505b50509050806136935760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722046756e647320746f2053656c6c6572204661696c0000006044820152606401611223565b505b6000831180156136ad57506001600160a01b03811615155b15613757576000816001600160a01b03168460405160006040518083038185875af1925050503d80600081146136ff576040519150601f19603f3d011682016040523d82523d6000602084013e613704565b606091505b50509050806137555760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722046756e647320746f2053656c6c6572204661696c0000006044820152606401611223565b505b6137cd565b60028601546001600160a01b0316841580159061378157506001600160a01b03831615155b1561379a5761379a6001600160a01b03821684876148e7565b6000841180156137b257506001600160a01b03821615155b156137cb576137cb6001600160a01b03821683866148e7565b505b60038701805460ff60a01b1916600360a01b179055604080518a81523360208201527f22369ba22944aadf9e9d6f4c51462417a50ea7876b9c62c7c46b5522e9c672cc91015b60405180910390a15050505050505050611efc60018055565b60405163e12f3a6160e01b81523060048201526000906001600160a01b0383169063e12f3a6190602401602060405180830381865afa158015613873573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ce9190615825565b61389f6143ed565b60008181526007602090815260408083208054845260058352818420600180820154865260049094529190932091820154909190600160981b900460ff166003146138fc5760405162461bcd60e51b815260040161122390615749565b80546139209065ffffffffffff600160d01b8204811691600160a01b90041661583e565b65ffffffffffff1642116139765760405162461bcd60e51b815260206004820152601b60248201527f536574746c696e672054696d65204e6f7420456e6465642059657400000000006044820152606401611223565b6003830154600160a01b900460ff166001146139a45760405162461bcd60e51b815260040161122390615771565b60038301546001600160a01b03163314806139d257506139d2600080516020615a1283398151915233612ca7565b613a175760405162461bcd60e51b81526020600482015260166024820152754275796572206f72204f70657261746f72204f6e6c7960501b6044820152606401611223565b60028201546000906001600160a01b0316613a3457506012613ab0565b8260020160009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aad919061572c565b90505b6000613ace84600301548560050154876001015461190e9190615675565b90506000613aee8560030154866004015488600101546119409190615675565b90506000620f424060096002015484613b079190615675565b613b12906002615675565b613b1c91906156a2565b9050600081613b2b85856156b6565b613b3591906155d2565b60028801549091506001600160a01b0316613c285760038801546040516000916001600160a01b03169083908381818185875af1925050503d8060008114613b99576040519150601f19603f3d011682016040523d82523d6000602084013e613b9e565b606091505b5050600c546040519192506000916001600160a01b039091169085908381818185875af1925050503d8060008114613bf2576040519150601f19603f3d011682016040523d82523d6000602084013e613bf7565b606091505b50509050818015613c055750805b613c215760405162461bcd60e51b81526004016112239061579f565b5050613c67565b600287015460038901546001600160a01b0391821691613c4b91839116846148e7565b600c54613c65906001600160a01b038381169116856148e7565b505b60038801805460ff60a01b1916600360a01b1790557f6353c0ce500c8ea1f1026c8f39a6e0c2d1b2f17034fcd8a4b021c72e6e293e51898284336040516138139493929190615361565b613cb96143ed565b600081815260056020526040902060078101546001600160a01b03610100909104163314613d1c5760405162461bcd60e51b815260206004820152601060248201526f4f66666572204f776e6572204f6e6c7960801b6044820152606401611223565b600781015460ff16600114613d435760405162461bcd60e51b815260040161122390615538565b600081600601548260030154613d5991906155d2565b905060008111613d7b5760405162461bcd60e51b8152600401611223906155e5565b60028201546000906001600160a01b0316613d9857506012613e14565b8260020160009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ded573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e11919061572c565b90505b825460009060ff1660001901613e4357613e3c846003015485600401548561190e9190615675565b9050613e5e565b613e5b846003015485600501548561190e9190615675565b90505b600a54600090620f424090613e739084615675565b613e7d91906156a2565b9050613e8981836155d2565b60028601549092506001600160a01b0316613f8157600785015460405160009161010090046001600160a01b03169084908381818185875af1925050503d8060008114613ef2576040519150601f19603f3d011682016040523d82523d6000602084013e613ef7565b606091505b5050600c546040519192506000916001600160a01b039091169084908381818185875af1925050503d8060008114613f4b576040519150601f19603f3d011682016040523d82523d6000602084013e613f50565b606091505b50509050818015613f5e5750805b613f7a5760405162461bcd60e51b81526004016112239061579f565b5050613fc6565b600285015460078601546001600160a01b0391821691613faa91839161010090910416856148e7565b600c54613fc4906001600160a01b038381169116846148e7565b505b60078501805460ff191660031790557ff65e543d34c6936603a3741b3eace109133f172d25637c2445b95c1f3288e9378683836140003390565b6040516140109493929190615361565b60405180910390a15050505050611efc60018055565b600080516020615a1283398151915261403e81614361565b620151808265ffffffffffff1610156140a75760405162461bcd60e51b815260206004820152602560248201527f637265617465546f6b656e3a204d696e696d756d2032346820666f7220736574604482015264746c696e6760d81b6064820152608401611223565b60008381526003602052604090205460ff16156141105760405162461bcd60e51b815260206004820152602160248201527f637265617465546f6b656e3a20546f6b656e20616c72656164792065786973746044820152607360f81b6064820152608401611223565b6000838152600360209081526040808320805460ff191660019081179091556004835292819020805465ffffffffffff8716600160d01b81026001600160d01b03909216919091178255938101805460ff60981b1916600160981b1790558151878152928301939093527f1da02fe9181848bf1b401dde762d155f0da084c24db69129a3c7479f970ddbcc910160405180910390a150505050565b6141b36143ed565b6000848152600460205260409020600180820154600160981b900460ff161461420e5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2102a37b5b2b760991b6044820152606401611223565b60008411801561421e5750600083115b6142645760405162461bcd60e51b8152602060048201526017602482015276496e76616c696420416d6f756e74206f722056616c756560481b6044820152606401611223565b600954600090620f4240906142799086615675565b61428391906156a2565b9050600060ff8816600114614298578161429a565b845b9050348111156142bc5760405162461bcd60e51b8152600401611223906156c9565b8034111561433e5760006142d082346155d2565b604051909150600090339083908381818185875af1925050503d8060008114614315576040519150601f19603f3d011682016040523d82523d6000602084013e61431a565b606091505b505090508061433b5760405162461bcd60e51b8152600401611223906156f5565b50505b61434e888860008989878a6146c2565b50505061435a60018055565b5050505050565b611efc8133614d31565b60006143768361382c565b604051635569f64b60e11b81526001600160a01b038481166004830152602482018390529192509084169063aad3ec96906044016020604051808303816000875af11580156143c9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9a9190615825565b60026001540361441057604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b60006005600086815260200190815260200160002090506040518060a00160405280868152602001858152602001836001600160a01b03168152602001846001600160a01b03168152602001600160ff168152506007600060086000815461447e90615864565b918290555081526020808201929092526040908101600090812084518155928401516001840155908301516002830180546001600160a01b039283166001600160a01b031990911617905560608401516003909301805460809095015160ff16600160a01b026001600160a81b031990951693909116929092179290921790556006820180548692906145129084906156b6565b9091555050600381015460068201540361456f5760078101805460ff1916600217905560408051868152600060208201527f37a30d6e3fcaec3144b11d51892b9eadbb0ec4d2a8a813d64bb6065c3adfcffa910160405180910390a15b600854604080519182526020820187905281018590526001600160a01b038084166060830152841660808201527fdc3effd7f2b46d1989f8b9ec5abba2e3c07eaa9caa9511c8af3c9444ecbb52f29060a001611ecd565b60008160ff168360ff16036145dc575082614654565b8160ff168360ff161015614610576145f4838361587d565b6145ff90600a61597a565b6146099085615675565b9050614654565b600061461c838561587d565b61462790600a61597a565b905061463381866156a2565b915061463f8186615989565b156146525761464f6001836156b6565b91505b505b9392505050565b6040516001600160a01b038481166024830152838116604483015260648201839052611f9a9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614d6a565b6040518061014001604052808860ff168152602001878152602001866001600160a01b0316815260200185815260200184815260200183815260200160008152602001600160ff1681526020016147163390565b6001600160a01b031681526020018215158152506005600060066000815461473d90615864565b9182905550815260208082019290925260409081016000208351815460ff191660ff918216178255928401516001820155908301516002820180546001600160a01b0319166001600160a01b03928316179055606084015160038301556080840151600483015560a0840151600583015560c084015160068084019190915560e0850151600790930180546101008088015161012090980151959096166001600160a81b031990911617959092169093029390931760ff60a81b1916600160a81b9115159190910217909155547f8f8f88015929d8eeb82fcc5c324b9713dc52572eae5cf9e6e80f7e2d81ae089890888888888888883360408051998a5260ff90981660208a0152968801959095526001600160a01b039384166060880152608087019290925260a086015260c085015290151560e0840152166101008201526101200160405180910390a150505050505050565b60008160ff168360ff16036148a8575082614654565b8160ff168360ff1610156148c0576145f4838361587d565b6148ca828461587d565b6148d590600a61597a565b6148df90856156a2565b949350505050565b6040516001600160a01b03838116602483015260448201839052611f7091859182169063a9059cbb90606401614690565b60405163430021db60e11b81523060048201526001600160a01b03821660248201526002604360981b019063860043b6906044015b6020604051808303816000875af115801561496c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f69190615825565b600061499c8383612ca7565b614a1a576000838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556149d23390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016111ce565b5060006111ce565b6000614a2e8383612ca7565b15614a1a576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016111ce565b6002604360981b016001600160a01b031663f098767a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614acf57600080fd5b505af1158015614ae3573d6000803e3d6000fd5b505050506002604360981b016001600160a01b0316634e606c476040518163ffffffff1660e01b8152600401600060405180830381600087803b158015614b2957600080fd5b505af1158015614b3d573d6000803e3d6000fd5b5050604051631a33757d60e01b81526003604360981b019250631a33757d9150614b6c9060029060040161599d565b6020604051808303816000875af1158015614b8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614baf9190615825565b50604051631a33757d60e01b81526004604360981b0190631a33757d90614bdb9060029060040161599d565b6020604051808303816000875af1158015614bfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611efc9190615825565b6040516336b91f2b60e01b81526001600160a01b0382166004820152732536fe9ab3f511540f2f9e2ec2a805005c3dd800906336b91f2b90602401600060405180830381600087803b158015614c7357600080fd5b505af115801561435a573d6000803e3d6000fd5b604051634aa7d2f760e11b81523060048201526001600160a01b03821660248201526002604360981b019063954fa5ee9060440161494d565b604051632cc0202b60e21b81526001600160a01b03808416600483015282166024820152732536fe9ab3f511540f2f9e2ec2a805005c3dd8009063b30080ac90604401600060405180830381600087803b158015614d1d57600080fd5b505af11580156116ea573d6000803e3d6000fd5b614d3b8282612ca7565b6111f65760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401611223565b6000614d7f6001600160a01b03841683614dcd565b90508051600014158015614da4575080806020019051810190614da291906159c5565b155b15611f7057604051635274afe760e01b81526001600160a01b0384166004820152602401611223565b60606146548383600084600080856001600160a01b03168486604051614df391906159e2565b60006040518083038185875af1925050503d8060008114614e30576040519150601f19603f3d011682016040523d82523d6000602084013e614e35565b606091505b5091509150614e45868383614e4f565b9695505050505050565b606082614e6457614e5f82614eab565b614654565b8151158015614e7b57506001600160a01b0384163b155b15614ea457604051639996b31560e01b81526001600160a01b0385166004820152602401611223565b5080614654565b805115614ebb5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b600060208284031215614ee657600080fd5b81356001600160e01b03198116811461465457600080fd5b80356001600160a01b0381168114614f1557600080fd5b919050565b600060208284031215614f2c57600080fd5b61465482614efe565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614f7457614f74614f35565b604052919050565b600067ffffffffffffffff821115614f9657614f96614f35565b5060051b60200190565b600082601f830112614fb157600080fd5b81356020614fc6614fc183614f7c565b614f4b565b8083825260208201915060208460051b870101935086841115614fe857600080fd5b602086015b848110156150045780358352918301918301614fed565b509695505050505050565b6000806040838503121561502257600080fd5b823567ffffffffffffffff8082111561503a57600080fd5b61504686838701614fa0565b9350602085013591508082111561505c57600080fd5b5061506985828601614fa0565b9150509250929050565b60ff81168114611efc57600080fd5b8015158114611efc57600080fd5b8035614f1581615082565b60008060008060008060c087890312156150b457600080fd5b86356150bf81615073565b95506020870135945060408701359350606087013592506150e260808801614efe565b915060a08701356150f281615082565b809150509295509295509295565b6000806040838503121561511357600080fd5b50508035926020909101359150565b60006020828403121561513457600080fd5b813567ffffffffffffffff81111561514b57600080fd5b6148df84828501614fa0565b60006020828403121561516957600080fd5b5035919050565b6000806000806080858703121561518657600080fd5b61518f85614efe565b966020860135965060408601359560600135945092505050565b600080604083850312156151bc57600080fd5b82359150602083013565ffffffffffff811681146151d957600080fd5b809150509250929050565b600080604083850312156151f757600080fd5b823567ffffffffffffffff8082111561520f57600080fd5b61521b86838701614fa0565b935060209150818501358181111561523257600080fd5b85019050601f8101861361524557600080fd5b8035615253614fc182614f7c565b81815260059190911b8201830190838101908883111561527257600080fd5b928401925b8284101561529057833582529284019290840190615277565b80955050505050509250929050565b600080604083850312156152b257600080fd5b823591506152c260208401614efe565b90509250929050565b815160ff16815261014081016020830151602083015260408301516152fb60408401826001600160a01b03169052565b50606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015161533860e084018260ff169052565b50610100838101516001600160a01b031690830152610120928301511515929091019190915290565b938452602084019290925260408301526001600160a01b0316606082015260800190565b60008060006060848603121561539a57600080fd5b833592506153aa60208501614efe565b915060408401356001600160981b03811681146153c657600080fd5b809150509250925092565b600080604083850312156153e457600080fd5b823567ffffffffffffffff8111156153fb57600080fd5b8301601f8101851361540c57600080fd5b8035602061541c614fc183614f7c565b82815260059290921b8301810191818101908884111561543b57600080fd5b938201935b838510156154605761545185614efe565b82529382019390820190615440565b955061546f9050868201615090565b93505050509250929050565b6000806040838503121561548e57600080fd5b61549783614efe565b91506152c260208401614efe565b600080600080600060a086880312156154bd57600080fd5b85356154c881615073565b945060208601359350604086013592506060860135915060808601356154ed81615082565b809150509295509295909350565b6020808252600d908201526c125b9d985b1a5908125b9c1d5d609a1b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b602080825260149082015273496e76616c6964204f666665722053746174757360601b604082015260600190565b602080825260149082015273496e76616c696420746f6b656e2053746174757360601b604082015260600190565b6020808252600e908201526d125b9d985b1a5908105b5bdd5b9d60921b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156111ce576111ce6155bc565b60208082526018908201527f496e73756666696369656e7420416c6c6f636174696f6e730000000000000000604082015260600190565b602080825260129082015271119d5b1b13585d18da081c995c5d5a5c995960721b604082015260600190565b60208082526013908201527224b73b30b634b21027b33332b9102a37b5b2b760691b604082015260600190565b80820281158282048414176111ce576111ce6155bc565b634e487b7160e01b600052601260045260246000fd5b6000826156b1576156b161568c565b500490565b808201808211156111ce576111ce6155bc565b602080825260129082015271496e73756666696369656e742046756e647360701b604082015260600190565b6020808252601b908201527f526566756e64206f662065786365737320455448206661696c65640000000000604082015260600190565b60006020828403121561573e57600080fd5b815161465481615073565b6020808252600e908201526d496e76616c69642053746174757360901b604082015260600190565b602080825260149082015273496e76616c6964204f726465722053746174757360601b604082015260600190565b602080825260139082015272151c985b9cd9995c88119d5b991cc811985a5b606a1b604082015260600190565b604080825283519082018190526000906020906060840190828701845b8281101561580e5781516001600160a01b0316845292840192908401906001016157e9565b505050809250505082151560208301529392505050565b60006020828403121561583757600080fd5b5051919050565b65ffffffffffff81811683821601908082111561585d5761585d6155bc565b5092915050565b600060018201615876576158766155bc565b5060010190565b60ff82811682821603908111156111ce576111ce6155bc565b600181815b808511156158d15781600019048211156158b7576158b76155bc565b808516156158c457918102915b93841c939080029061589b565b509250929050565b6000826158e8575060016111ce565b816158f5575060006111ce565b816001811461590b576002811461591557615931565b60019150506111ce565b60ff841115615926576159266155bc565b50506001821b6111ce565b5060208310610133831016604e8410600b8410161715615954575081810a6111ce565b61595e8383615896565b8060001904821115615972576159726155bc565b029392505050565b600061465460ff8416836158d9565b6000826159985761599861568c565b500690565b60208101600383106159bf57634e487b7160e01b600052602160045260246000fd5b91905290565b6000602082840312156159d757600080fd5b815161465481615082565b6000825160005b81811015615a0357602081860181015185830152016159e9565b50600092019182525091905056fe97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b929a26469706673582212202151861508fd2846a74e86692f9e392b0717cdde3d723dc52cfa016943613c2164736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000010f4861365511ae1a11dbd2210bcccad42bcbf1a
-----Decoded View---------------
Arg [0] : feeWalletAddress (address): 0x10F4861365511AE1a11dbD2210bCCCad42BCBF1A
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000010f4861365511ae1a11dbd2210bcccad42bcbf1a
Deployed Bytecode Sourcemap
42350:40660:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8487:204;;;;;;;;;;-1:-1:-1;8487:204:0;;;;;:::i;:::-;;:::i;:::-;;;566:14:1;;559:22;541:41;;529:2;514:18;8487:204:0;;;;;;;;54589:135;;;;;;;;;;-1:-1:-1;54589:135:0;;;;;:::i;:::-;;:::i;:::-;;71823:1798;;;;;;:::i;:::-;;:::i;55934:1100::-;;;;;;;;;;-1:-1:-1;55934:1100:0;;;;;:::i;:::-;;:::i;51634:1997::-;;;;;;;;;;-1:-1:-1;51634:1997:0;;;;;:::i;:::-;;:::i;69020:175::-;;;;;;;;;;-1:-1:-1;69020:175:0;;;;;:::i;:::-;;:::i;76859:132::-;;;;;;;;;;-1:-1:-1;76859:132:0;;;;;:::i;:::-;76920:4;76944:15;;;:6;:15;;;;;:25;:39;:25;42579:1;76944:39;;76859:132;74127:952;;;;;;;;;;-1:-1:-1;74127:952:0;;;;;:::i;:::-;;:::i;69308:181::-;;;;;;;;;;-1:-1:-1;69308:181:0;;;;;:::i;:::-;;:::i;48929:389::-;;;;;;;;;;-1:-1:-1;48929:389:0;;;;;:::i;:::-;;:::i;9767:122::-;;;;;;;;;;-1:-1:-1;9767:122:0;;;;;:::i;:::-;9832:7;9859:12;;;;;;;;;;:22;;;;9767:122;;;;5745:25:1;;;5733:2;5718:18;9767:122:0;5599:177:1;54349:114:0;;;;;;;;;;;;;:::i;53838:284::-;;;;;;;;;;-1:-1:-1;53838:284:0;;;;;:::i;:::-;;:::i;10199:138::-;;;;;;;;;;-1:-1:-1;10199:138:0;;;;;:::i;:::-;;:::i;40116:96::-;;;;;;;;;;;;-1:-1:-1;;;;;40116:96:0;;;;;-1:-1:-1;;;;;7370:32:1;;;7352:51;;7340:2;7325:18;40116:96:0;7183:226:1;78930:96:0;;;;;;;;;;-1:-1:-1;79007:11:0;;78930:96;;11336:251;;;;;;;;;;-1:-1:-1;11336:251:0;;;;;:::i;:::-;;:::i;54241:100::-;;;;;;;;;;;;;:::i;54829:152::-;;;;;;;;;;-1:-1:-1;54829:152:0;;;;;:::i;:::-;;:::i;78416:116::-;;;;;;;;;;-1:-1:-1;78416:116:0;;;;;:::i;:::-;-1:-1:-1;;;;;78503:21:0;78479:4;78503:21;;;:14;:21;;;;;;;;;78416:116;77737:105;;;;;;;;;;-1:-1:-1;77737:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77824:10:0;;;;:6;:10;;;;;;;;;77817:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;77817:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;77817:17:0;;;;;;;;;;;;;77737:105;;;;;;;;:::i;78679:96::-;;;;;;;;;;-1:-1:-1;78756:11:0;;78679:96;;68760:173;;;;;;;;;;-1:-1:-1;68760:173:0;;;;;:::i;:::-;;:::i;43494:26::-;;;;;;;;;;;;;;;;76644:130;;;;;;;;;;-1:-1:-1;76644:130:0;;;;;:::i;:::-;76704:4;76728:15;;;:6;:15;;;;;:25;:38;:25;42543:1;76728:38;;76644:130;43415:26;;;;;;;;;;;;;;;;54471:110;;;;;;;;;;;;;:::i;78158:92::-;;;;;;;;;;;;;:::i;:::-;;;;;;9072:13:1;;9054:32;;9142:4;9130:17;;;9124:24;9102:20;;;9095:54;9205:4;9193:17;;;9187:24;9165:20;;;9158:54;9272:4;9260:17;;;9254:24;-1:-1:-1;;;;;9250:50:1;9228:20;;;9221:80;;;;9041:3;9026:19;;8859:448;47856:513:0;;;;;;;;;;-1:-1:-1;47856:513:0;;;;;:::i;:::-;;:::i;48454:324::-;;;;;;;;;;-1:-1:-1;48454:324:0;;;;;:::i;:::-;;:::i;69675:1962::-;;;;;;;;;;-1:-1:-1;69675:1962:0;;;;;:::i;:::-;;:::i;58434:1607::-;;;;;;;;;;-1:-1:-1;58434:1607:0;;;;;:::i;:::-;;:::i;77922:105::-;;;;;;;;;;-1:-1:-1;77922:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78009:10:0;;;;:6;:10;;;;;;;;;78002:17;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;78002:17:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;78002:17:0;;;;;;;;;;77922:105;;;;;;;9776:13:1;;9758:32;;9846:4;9834:17;;;9828:24;9806:20;;;9799:54;9900:4;9888:17;;;9882:24;-1:-1:-1;;;;;9982:21:1;;;9960:20;;;9953:51;;;;10064:4;10052:17;;;10046:24;10042:33;;;10020:20;;;10013:63;10136:4;10124:17;;;10118:24;10144:4;10114:35;10092:20;;;10085:65;;;;9745:3;9730:19;;9565:591;43527:20:0;;;;;;;;;;-1:-1:-1;43527:20:0;;;;;;;;;;;;;-1:-1:-1;;;;;43527:20:0;;;;;;;;;;;;;:::i;60203:1571::-;;;;;;:::i;:::-;;:::i;43219:46::-;;;;;;;;;;-1:-1:-1;43219:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;46870:901;;;;;;;;;;-1:-1:-1;46870:901:0;;;;;:::i;:::-;;:::i;43369:39::-;;;;;;;;;;-1:-1:-1;43369:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43369:39:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;43369:39:0;;;;;;;;;;11452:4:1;11440:17;;;11422:36;;11489:2;11474:18;;11467:34;;;;-1:-1:-1;;;;;11575:15:1;;;11555:18;;;11548:43;11622:2;11607:18;;11600:34;;;;11665:3;11650:19;;11643:35;;;;11528:3;11694:19;;11687:35;;;;11753:3;11738:19;;11731:35;11803:17;;;11797:3;11782:19;;11775:46;11858:15;;11852:3;11837:19;;11830:44;11918:14;;11911:22;11905:3;11890:19;;11883:51;11409:3;11394:19;43369:39:0;11037:903:1;43323:39:0;;;;;;;;;;-1:-1:-1;43323:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43323:39:0;;;;-1:-1:-1;;;43323:39:0;;;;;-1:-1:-1;;;43323:39:0;;;;;-1:-1:-1;;;;;43323:39:0;;;;-1:-1:-1;;;43323:39:0;;;;;;;;;;-1:-1:-1;;;;;12214:32:1;;;;12196:51;;12266:14;12316:15;;;12311:2;12296:18;;12289:43;12368:15;;;;12348:18;;;12341:43;;;;-1:-1:-1;;;;;12420:53:1;12415:2;12400:18;;12393:81;12523:4;12511:17;12505:3;12490:19;;12483:46;12183:3;12168:19;43323:39:0;11945:590:1;8783:138:0;;;;;;;;;;-1:-1:-1;8783:138:0;;;;;:::i;:::-;;:::i;39864:81::-;;;;;;;;;;;;-1:-1:-1;;;;;39864:81:0;;75289:317;;;;;;;;;;-1:-1:-1;75289:317:0;;;;;:::i;:::-;;:::i;75995:158::-;;;;;;;;;;-1:-1:-1;75995:158:0;;;;;:::i;:::-;;:::i;8095:49::-;;;;;;;;;;-1:-1:-1;8095:49:0;8140:4;8095:49;;43448:39;;;;;;;;;;-1:-1:-1;43448:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;43448:39:0;;;;;;;-1:-1:-1;;;43448:39:0;;;;;;;;;;13990:25:1;;;14046:2;14031:18;;14024:34;;;;-1:-1:-1;;;;;14132:15:1;;;14112:18;;;14105:43;;;;14184:15;14179:2;14164:18;;14157:43;14249:4;14237:17;14231:3;14216:19;;14209:46;13977:3;13962:19;43448:39:0;13735:526:1;63834:2546:0;;;;;;;;;;-1:-1:-1;63834:2546:0;;;;;:::i;:::-;;:::i;40219:96::-;;;;;;;;;;;;-1:-1:-1;;;;;40219:96:0;;54989:233;;;;;;;;;;-1:-1:-1;54989:233:0;;;;;:::i;:::-;;:::i;81417:333::-;;;;;;;;;;-1:-1:-1;81417:333:0;;;;;:::i;:::-;;:::i;77279:118::-;;;;;;;;;;-1:-1:-1;77279:118:0;;;;;:::i;:::-;77340:7;77367:15;;;:6;:15;;;;;:22;;;-1:-1:-1;;;77367:22:0;;;;;77279:118;68473:183;;;;;;;;;;-1:-1:-1;68473:183:0;;;;;:::i;:::-;;:::i;10630:140::-;;;;;;;;;;-1:-1:-1;10630:140:0;;;;;:::i;:::-;;:::i;77076:118::-;;;;;;;;;;-1:-1:-1;77076:118:0;;;;;:::i;:::-;77137:7;77164:15;;;:6;:15;;;;;:22;;;;;;77076:118;76439:120;;;;;;;;;;-1:-1:-1;76439:120:0;;;;;:::i;:::-;76501:7;76528:15;;;:6;:15;;;;;:23;;;-1:-1:-1;;;;;76528:23:0;;76439:120;49403:2014;;;;;;;;;;-1:-1:-1;49403:2014:0;;;;;:::i;:::-;;:::i;40604:154::-;;;;;;;;;;-1:-1:-1;40604:154:0;;;;;:::i;:::-;;:::i;76238:116::-;;;;;;;;;;-1:-1:-1;76238:116:0;;;;;:::i;:::-;76298:7;76325:15;;;:6;:15;;;;;:21;;;;76238:116;36352:99;;;;;;;;;;;;36408:42;36352:99;;66475:1900;;;;;;;;;;-1:-1:-1;66475:1900:0;;;;;:::i;:::-;;:::i;75792:118::-;;;;;;;;;;-1:-1:-1;75792:118:0;;;;;:::i;:::-;75853:7;75880:15;;;:6;:15;;;;;:22;;;;75792:118;61860:1894;;;;;;;;;;-1:-1:-1;61860:1894:0;;;;;:::i;:::-;;:::i;77542:115::-;;;;;;;;;;-1:-1:-1;77542:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77639:10:0;;;;:6;:10;;;;;;;;;77632:17;;;;;;;;;-1:-1:-1;;;;;77632:17:0;;;;;-1:-1:-1;;;77632:17:0;;;;;;;;;;;-1:-1:-1;;;77632:17:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;77632:17:0;;;;;;;-1:-1:-1;;;77632:17:0;;;;;;;;;77542:115;;;;;15183:13:1;;-1:-1:-1;;;;;15179:39:1;15161:58;;15266:4;15254:17;;;15248:24;15291:14;15343:21;;;15321:20;;;15314:51;;;;15413:17;;;15407:24;15403:33;15381:20;;;15374:63;;;;15497:4;15485:17;;;15479:24;-1:-1:-1;;;;;15475:71:1;15453:20;;;15446:101;15607:4;15595:17;;;15589:24;15615:4;15585:35;15563:20;;;15556:65;;;;15148:3;15133:19;77542:115:0;14968:659:1;45987:508:0;;;;;;;;;;-1:-1:-1;45987:508:0;;;;;:::i;:::-;;:::i;57179:1045::-;;;;;;:::i;:::-;;:::i;43144:66::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43144:66:0;;43272:44;;;;;;;;;;-1:-1:-1;43272:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;8487:204;8572:4;-1:-1:-1;;;;;;8596:47:0;;-1:-1:-1;;;8596:47:0;;:87;;-1:-1:-1;;;;;;;;;;5992:40:0;;;8647:36;8589:94;8487:204;-1:-1:-1;;8487:204:0:o;54589:135::-;8140:4;8379:16;8140:4;8379:10;:16::i;:::-;54699;;54679:37:::1;::::0;54691:6;;-1:-1:-1;;;;;54699:16:0::1;54679:11;:37::i;:::-;54589:135:::0;;:::o;71823:1798::-;34844:21;:19;:21::i;:::-;71967:7:::1;:14;71948:8;:15;:33;71940:59;;;;-1:-1:-1::0;;;71940:59:0::1;;;;;;;:::i;:::-;;;;;;;;;72010:22;72052:9:::0;72047:1194:::1;72071:8;:15;72067:1;:19;72047:1194;;;72108:15;72126:8;72135:1;72126:11;;;;;;;;:::i;:::-;;;;;;;72108:29;;72152:14;72169:7;72177:1;72169:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;72194:19:::1;72216:15:::0;;;:6:::1;:15:::0;;;;;;72275:13:::1;::::0;;::::1;::::0;72268:21;;:6:::1;:21:::0;;;;;72314:12:::1;::::0;::::1;::::0;72169:10;;-1:-1:-1;72216:15:0;;72268:21;;72314:33:::1;:12;:33;72306:66;;;;-1:-1:-1::0;;;72306:66:0::1;;;;;;;:::i;:::-;43042:1;72395:12:::0;;::::1;::::0;-1:-1:-1;;;72395:12:0;::::1;:35;:12;:35;72387:68;;;;-1:-1:-1::0;;;72387:68:0::1;;;;;;;:::i;:::-;72487:1;72478:6;:10;72470:37;;;;-1:-1:-1::0;;;72470:37:0::1;;;;;;;:::i;:::-;72567:6;72545:5;:18;;;72530:5;:12;;;:33;;;;:::i;:::-;:43;;72522:80;;;;-1:-1:-1::0;;;72522:80:0::1;;;;;;;:::i;:::-;72625:15;::::0;::::1;::::0;-1:-1:-1;;;72625:15:0;::::1;;;:24;::::0;:50:::1;;;72669:6;72653:5;:12;;;:22;72625:50;72617:81;;;;-1:-1:-1::0;;;72617:81:0::1;;;;;;;:::i;:::-;72721:13;::::0;::::1;::::0;-1:-1:-1;;;;;72721:13:0::1;:27:::0;72713:59:::1;;;;-1:-1:-1::0;;;72713:59:0::1;;;;;;;:::i;:::-;72824:15:::0;;72787:18:::1;::::0;72824:28:::1;:15;-1:-1:-1::0;;72824:28:0;72820:215:::1;;72916:5;:12;;;72906:6;72887:5;:16;;;:25;;;;:::i;:::-;72886:42;;;;:::i;:::-;72873:55;;72820:215;;;73007:5;:12;;;72997:6;72983:5;:11;;;:20;;;;:::i;:::-;72982:37;;;;:::i;:::-;72969:50;;72820:215;73049:28;73067:10:::0;73049:28;::::1;:::i;:::-;;;73171:58;73182:7;73191:6;73199:5;:15;;;;;;;;;;-1:-1:-1::0;;;;;73199:15:0::1;73216:12;4078:10:::0;;3998:98;73216:12:::1;73171:10;:58::i;:::-;-1:-1:-1::0;;72088:3:0::1;::::0;;::::1;::::0;-1:-1:-1;72047:1194:0::1;::::0;-1:-1:-1;;72047:1194:0::1;;;73272:14;73259:9;:27;;73251:58;;;;-1:-1:-1::0;;;73251:58:0::1;;;;;;;:::i;:::-;73375:14;73363:9;:26;73359:255;;;73406:20;73429:26;73441:14:::0;73429:9:::1;:26;:::i;:::-;73494:40;::::0;73406:49;;-1:-1:-1;73471:18:0::1;::::0;73494:10:::1;::::0;73406:49;;73471:18;73494:40;73471:18;73494:40;73406:49;73494:10;:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73470:64;;;73557:13;73549:53;;;;-1:-1:-1::0;;;73549:53:0::1;;;;;;;:::i;:::-;73391:223;;73359:255;71929:1692;34888:20:::0;34179:1;35430:21;;35247:212;55934:1100;34844:21;:19;:21::i;:::-;56106:19:::1;56128:15:::0;;;:6:::1;:15;::::0;;;;43042:1:::1;56162:12:::0;;::::1;::::0;-1:-1:-1;;;56162:12:0;::::1;:35;:12;:35;56154:61;;;::::0;-1:-1:-1;;;56154:61:0;;20724:2:1;56154:61:0::1;::::0;::::1;20706:21:1::0;20763:2;20743:18;;;20736:30;-1:-1:-1;;;20782:18:1;;;20775:43;20835:18;;56154:61:0::1;20522:337:1::0;56154:61:0::1;-1:-1:-1::0;;;;;56234:21:0;::::1;::::0;;::::1;::::0;:48:::1;;-1:-1:-1::0;;;;;;56259:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;::::1;;56234:48;56226:80;;;;-1:-1:-1::0;;;56226:80:0::1;;;;;;;:::i;:::-;56334:1;56325:6;:10;:23;;;;;56347:1;56339:5;:9;56325:23;56317:59;;;::::0;-1:-1:-1;;;56317:59:0;;21066:2:1;56317:59:0::1;::::0;::::1;21048:21:1::0;21105:2;21085:18;;;21078:30;-1:-1:-1;;;21124:18:1;;;21117:53;21187:18;;56317:59:0::1;20864:347:1::0;56317:59:0::1;56389:20;56427:7;-1:-1:-1::0;;;;;56412:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56389:57;;56457:21;56481:46;56501:5;56508:2;56512:14;56481:19;:46::i;:::-;56457:70;;56538:18;42502:7;56568:6;:17;;;56560:5;:25;;;;:::i;:::-;56559:34;;;;:::i;:::-;56538:55;;56604:26;56633:51;56653:10;56665:2;56669:14;56633:19;:51::i;:::-;56604:80:::0;-1:-1:-1;56697:23:0::1;56723:22;::::0;::::1;42543:1;56723:22;:59;;56764:18;56723:59;;;56748:13;56723:59;56697:85:::0;-1:-1:-1;56818:7:0;56837:71:::1;-1:-1:-1::0;;;;;56837:25:0;::::1;4078:10:::0;56885:4:::1;56697:85:::0;56837:25:::1;:71::i;:::-;56950:76;56960:9;56971:7;56980;56989:6;56997:5;57004:10;57016:9;56950;:76::i;:::-;56095:939;;;;;;;34888:20:::0;34179:1;35430:21;;35247:212;34888:20;55934:1100;;;;;;:::o;51634:1997::-;34844:21;:19;:21::i;:::-;-1:-1:-1;;;;;;;;;;;8379:16:0::1;8390:4;8379:10;:16::i;:::-;51742:19:::2;51764:15:::0;;;:6:::2;:15;::::0;;;;;;;51819:13;;51812:21;;:6:::2;:21:::0;;;;;51873:13:::2;::::0;;::::2;::::0;51866:21;;:6:::2;:21:::0;;;;;;;51936:12;;::::2;::::0;51812:21;;51866;-1:-1:-1;;;51936:12:0;::::2;:35;:12;43134:1;51936:35;51928:62;;;;-1:-1:-1::0;;;51928:62:0::2;;;;;;;:::i;:::-;52009:11:::0;;-1:-1:-1;;;;;52009:11:0::2;:25:::0;;::::2;::::0;:49:::2;;-1:-1:-1::0;52038:16:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;52038:16:0::2;:20:::0;;52009:49:::2;52001:75;;;::::0;-1:-1:-1;;;52001:75:0;;22013:2:1;52001:75:0::2;::::0;::::2;21995:21:1::0;22052:2;22032:18;;;22025:30;-1:-1:-1;;;22071:18:1;;;22064:43;22124:18;;52001:75:0::2;21811:337:1::0;52001:75:0::2;52112:16:::0;;-1:-1:-1;;;52112:16:0;::::2;;;52104:58;;;::::0;-1:-1:-1;;;52104:58:0;;22355:2:1;52104:58:0::2;::::0;::::2;22337:21:1::0;22394:2;22374:18;;;22367:30;-1:-1:-1;;;22413:18:1;;;22406:55;22478:18;;52104:58:0::2;22153:349:1::0;52104:58:0::2;52181:12;::::0;::::2;::::0;-1:-1:-1;;;52181:12:0;::::2;:33;:12;42819:1;52181:33;52173:66;;;;-1:-1:-1::0;;;52173:66:0::2;;;;;;;:::i;:::-;52287:13;::::0;::::2;::::0;52252:20:::2;::::0;-1:-1:-1;;;;;52287:13:0::2;52283:169;;-1:-1:-1::0;52348:2:0::2;52283:169;;;52415:5;:13;;;;;;;;;;-1:-1:-1::0;;;;;52415:13:0::2;-1:-1:-1::0;;;;;52400:38:0::2;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52383:57;;52283:169;52535:18;52556:85;52608:5;:12;;;52588:5;:16;;;52573:5;:12;;;:31;;;;:::i;:::-;52572:48;;;;:::i;:::-;52622:2;52626:14;52556:15;:85::i;:::-;52535:106;;52652:13;52668:80;52715:5;:12;;;52700:5;:11;;;52685:5;:12;;;:26;;;;:::i;:::-;52684:43;;;;:::i;:::-;52729:2;52733:14;52668:15;:80::i;:::-;52652:96;;52799:17;42502:7;52828:6;:16;;;52820:5;:24;;;;:::i;:::-;52819:33;;;;:::i;:::-;52799:53:::0;-1:-1:-1;52863:18:0::2;52799:53:::0;52884:18:::2;52892:10:::0;52884:5;:18:::2;:::i;:::-;:30;;;;:::i;:::-;52929:13;::::0;::::2;::::0;52863:51;;-1:-1:-1;;;;;;52929:13:0::2;52925:512;;53015:12;::::0;::::2;::::0;:40:::2;::::0;52997:13:::2;::::0;-1:-1:-1;;;;;53015:12:0::2;::::0;53040:10;;52997:13;53015:40;52997:13;53015:40;53040:10;53015:12;:40:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;53089:16:0;;:43:::2;::::0;52996:59;;-1:-1:-1;53071:13:0::2;::::0;-1:-1:-1;;;;;53089:16:0;;::::2;::::0;53118:9;;53071:13;53089:43;53071:13;53089:43;53118:9;53089:16;:43:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53070:62;;;53155:8;:20;;;;;53167:8;53155:20;53147:52;;;;-1:-1:-1::0;;;53147:52:0::2;;;;;;;:::i;:::-;52958:253;;52925:512;;;53284:13;::::0;;::::2;::::0;53335:12;;::::2;::::0;-1:-1:-1;;;;;53284:13:0;;::::2;::::0;53313:47:::2;::::0;53284:13;;53335:12:::2;53349:10:::0;53313:21:::2;:47::i;:::-;53397:16:::0;;53375:50:::2;::::0;-1:-1:-1;;;;;53375:21:0;;::::2;::::0;53397:16:::2;53415:9:::0;53375:21:::2;:50::i;:::-;53217:220;52925:512;53449:12;::::0;::::2;:41:::0;;-1:-1:-1;;;;53449:41:0::2;-1:-1:-1::0;;;53449:41:0::2;::::0;;53508::::2;::::0;;23406:25:1;;;23462:2;23447:18;;23440:34;;;4078:10:0;23490:18:1;;;23483:60;53508:41:0;;::::2;::::0;23394:2:1;53508:41:0;;;;;;::::2;53565:58;53578:7:::0;53587:10;53599:9;4078:10;53565:58:::2;;;;;;;;;:::i;:::-;;;;;;;;51731:1900;;;;;;;;34876:1:::1;34888:20:::0;34179:1;35430:21;;35247:212;69020:175;69095:9;69090:98;69114:8;:15;69110:1;:19;69090:98;;;69151:25;69164:8;69173:1;69164:11;;;;;;;;:::i;:::-;;;;;;;69151:12;:25::i;:::-;69131:3;;69090:98;;74127:952;-1:-1:-1;;;;;;;;;;;8379:16:0;8390:4;8379:10;:16::i;:::-;-1:-1:-1;;;;;74305:24:0;::::1;74297:52;;;::::0;-1:-1:-1;;;74297:52:0;;23756:2:1;74297:52:0::1;::::0;::::1;23738:21:1::0;23795:2;23775:18;;;23768:30;-1:-1:-1;;;23814:18:1;;;23807:45;23869:18;;74297:52:0::1;23554:339:1::0;74297:52:0::1;74382:9;74389:2;42502:7;74382:9;:::i;:::-;74368:10;:23;;74360:53;;;::::0;-1:-1:-1;;;74360:53:0;;24100:2:1;74360:53:0::1;::::0;::::1;24082:21:1::0;24139:2;24119:18;;;24112:30;-1:-1:-1;;;24158:18:1;;;24151:47;24215:18;;74360:53:0::1;23898:341:1::0;74360:53:0::1;74446:9;74453:2;42502:7;74446:9;:::i;:::-;74432:10;:23;;74424:53;;;::::0;-1:-1:-1;;;74424:53:0;;24446:2:1;74424:53:0::1;::::0;::::1;24428:21:1::0;24485:2;24465:18;;;24458:30;-1:-1:-1;;;24504:18:1;;;24497:47;24561:18;;74424:53:0::1;24244:341:1::0;74424:53:0::1;74563:10;74570:3;42502:7;74563:10;:::i;:::-;74548:11;:25;;:48;;;;;42502:7;74577:11;:19;;74548:48;74540:85;;;::::0;-1:-1:-1;;;74540:85:0;;24792:2:1;74540:85:0::1;::::0;::::1;24774:21:1::0;24831:2;24811:18;;;24804:30;24870:26;24850:18;;;24843:54;24914:18;;74540:85:0::1;24590:348:1::0;74540:85:0::1;74668:16:::0;;74699;;74730;;74668:6:::1;74761:17:::0;74641:249:::1;::::0;;-1:-1:-1;;;;;74668:16:0;;::::1;25324:34:1::0;;25389:2;25374:18;;25367:34;;;;25417:18;;25410:34;;;;25475:2;25460:18;;25453:34;25524:15;;;25518:3;25503:19;;25496:44;25304:3;25556:19;;25549:35;;;25615:3;25600:19;;25593:35;;;25659:3;25644:19;;25637:35;;;74641:249:0::1;::::0;25273:3:1;25258:19;74641:249:0::1;;;;;;;-1:-1:-1::0;74920:16:0;:29;;-1:-1:-1;;;;;;74920:29:0::1;-1:-1:-1::0;;;;;74920:29:0;;;::::1;::::0;;;::::1;::::0;;;74960:16;:29;;;;75000:16;:29;74920:6:::1;75040:31:::0;74127:952::o;69308:181::-;69386:9;69381:101;69405:8;:15;69401:1;:19;69381:101;;;69442:28;69458:8;69467:1;69458:11;;;;;;;;:::i;:::-;;;;;;;69442:15;:28::i;:::-;69422:3;;69381:101;;48929:389;-1:-1:-1;;;;;;;;;;;8379:16:0;8390:4;8379:10;:16::i;:::-;49057:12:::1;49045:8;:24;;;;49037:61;;;::::0;-1:-1:-1;;;49037:61:0;;25885:2:1;49037:61:0::1;::::0;::::1;25867:21:1::0;25924:2;25904:18;;;25897:30;25963:26;25943:18;;;25936:54;26007:18;;49037:61:0::1;25683:348:1::0;49037:61:0::1;49109:20;49132:15:::0;;;:6:::1;:15;::::0;;;;;;;;49176:21;;::::1;49208:32:::0;;::::1;-1:-1:-1::0;;;49208:32:0;;::::1;-1:-1:-1::0;;;;;49208:32:0;::::1;;::::0;;49256:54;;26234:25:1;;;49176:21:0;::::1;::::0;;::::1;26308:18:1::0;;;26301:43;;;26360:18;;;26353:43;;;;49132:15:0;49256:54:::1;::::0;26222:2:1;26207:18;49256:54:0::1;;;;;;;;49026:292;;48929:389:::0;;;:::o;54349:114::-;8140:4;8379:16;8140:4;8379:10;:16::i;:::-;54438;;54423:32:::1;::::0;-1:-1:-1;;;;;54438:16:0::1;54423:14;:32::i;:::-;54349:114:::0;:::o;53838:284::-;53964:6;:13;53945:8;:15;:32;53937:58;;;;-1:-1:-1;;;53937:58:0;;;;;;;:::i;:::-;54011:9;54006:109;54030:8;:15;54026:1;:19;54006:109;;;54067:36;54080:8;54089:1;54080:11;;;;;;;;:::i;:::-;;;;;;;54093:6;54100:1;54093:9;;;;;;;;:::i;:::-;;;;;;;54067:12;:36::i;:::-;54047:3;;54006:109;;;;53838:284;;:::o;10199:138::-;9832:7;9859:12;;;;;;;;;;:22;;;8379:16;8390:4;8379:10;:16::i;:::-;10304:25:::1;10315:4;10321:7;10304:10;:25::i;:::-;;10199:138:::0;;;:::o;11336:251::-;-1:-1:-1;;;;;11430:34:0;;4078:10;11430:34;11426:104;;11488:30;;-1:-1:-1;;;11488:30:0;;;;;;;;;;;11426:104;11542:37;11554:4;11560:18;11542:11;:37::i;54241:100::-;8140:4;8379:16;8140:4;8379:10;:16::i;:::-;54316:17:::1;:15;:17::i;54829:152::-:0;8140:4;8379:16;8140:4;8379:10;:16::i;:::-;54934:39:::1;54959:13;54934:24;:39::i;68760:173::-:0;68834:9;68829:97;68853:8;:15;68849:1;:19;68829:97;;;68890:24;68902:8;68911:1;68902:11;;;;;;;;:::i;:::-;;;;;;;68890;:24::i;:::-;68870:3;;68829:97;;54471:110;8140:4;8379:16;8140:4;8379:10;:16::i;:::-;54556;;54543:30:::1;::::0;-1:-1:-1;;;;;54556:16:0::1;54543:12;:30::i;78158:92::-:0;78203:13;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78203:13:0;-1:-1:-1;78229:13:0;;;;;;;;78236:6;78229:13;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;78229:13:0;;;;;;78158:92::o;47856:513::-;-1:-1:-1;;;;;;;;;;;8379:16:0;8390:4;8379:10;:16::i;:::-;47948:20:::1;47971:15:::0;;;:6:::1;:15;::::0;;;;48016:13:::1;::::0;;::::1;::::0;47971:15;;-1:-1:-1;;;48016:13:0;;::::1;;;::::0;47948:20;48057:33;::::1;:79;;43042:1;48057:79;;;43089:1;48057:79;48040:96:::0;-1:-1:-1;48157:33:0::1;::::0;::::1;43042:1;48157:33;::::0;:72:::1;;-1:-1:-1::0;48194:35:0::1;::::0;::::1;43089:1;48194:35;48157:72;48149:111;;;::::0;-1:-1:-1;;;48149:111:0;;26609:2:1;48149:111:0::1;::::0;::::1;26591:21:1::0;26648:2;26628:18;;;26621:30;26687:28;26667:18;;;26660:56;26733:18;;48149:111:0::1;26407:350:1::0;48149:111:0::1;48273:13;::::0;::::1;:24:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;48273:24:0;::::1;-1:-1:-1::0;;;;48273:24:0;;::::1;::::0;;;::::1;::::0;;;48313:48:::1;::::0;;26956:25:1;;;27017:17;;;27012:2;26997:18;;26990:45;27051:18;;27044:45;48313:48:0::1;::::0;26944:2:1;26929:18;48313:48:0::1;26762:333:1::0;48454:324:0;-1:-1:-1;;;;;;;;;;;8379:16:0;8390:4;8379:10;:16::i;:::-;48552:20:::1;48575:15:::0;;;:6:::1;:15;::::0;;;;48609:13:::1;::::0;::::1;::::0;-1:-1:-1;;;48609:13:0;::::1;:36;:13;43134:1;48609:36;48601:69;;;::::0;-1:-1:-1;;;48601:69:0;;27302:2:1;48601:69:0::1;::::0;::::1;27284:21:1::0;27341:2;27321:18;;;27314:30;-1:-1:-1;;;27360:18:1;;;27353:50;27420:18;;48601:69:0::1;27100:344:1::0;48601:69:0::1;48681:13;::::0;::::1;:37:::0;;-1:-1:-1;;;;48681:37:0::1;-1:-1:-1::0;;;48681:37:0::1;::::0;;48734:36:::1;::::0;5745:25:1;;;48734:36:0::1;::::0;5733:2:1;5718:18;48734:36:0::1;;;;;;;;48541:237;48454:324:::0;;:::o;69675:1962::-;34844:21;:19;:21::i;:::-;69808:7:::1;:14;69789:8;:15;:33;69781:59;;;;-1:-1:-1::0;;;69781:59:0::1;;;;;;;:::i;:::-;69856:9;69851:1779;69875:8;:15;69871:1;:19;69851:1779;;;69912:15;69930:8;69939:1;69930:11;;;;;;;;:::i;:::-;;;;;;;69912:29;;69956:14;69973:7;69981:1;69973:10;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;69998:19:::1;70020:15:::0;;;:6:::1;:15:::0;;;;;;70079:13:::1;::::0;;::::1;::::0;70072:21;;:6:::1;:21:::0;;;;;70118:12:::1;::::0;::::1;::::0;69973:10;;-1:-1:-1;70020:15:0;;70072:21;;70118:33:::1;:12;:33;70110:66;;;;-1:-1:-1::0;;;70110:66:0::1;;;;;;;:::i;:::-;43042:1;70199:12:::0;;::::1;::::0;-1:-1:-1;;;70199:12:0;::::1;:35;:12;:35;70191:68;;;;-1:-1:-1::0;;;70191:68:0::1;;;;;;;:::i;:::-;70291:1;70282:6;:10;70274:37;;;;-1:-1:-1::0;;;70274:37:0::1;;;;;;;:::i;:::-;70371:6;70349:5;:18;;;70334:5;:12;;;:33;;;;:::i;:::-;:43;;70326:80;;;;-1:-1:-1::0;;;70326:80:0::1;;;;;;;:::i;:::-;70429:15;::::0;::::1;::::0;-1:-1:-1;;;70429:15:0;::::1;;;:24;::::0;:50:::1;;;70473:6;70457:5;:12;;;:22;70429:50;70421:81;;;;-1:-1:-1::0;;;70421:81:0::1;;;;;;;:::i;:::-;70525:13;::::0;::::1;::::0;-1:-1:-1;;;;;70525:13:0::1;70517:59;;;;-1:-1:-1::0;;;70517:59:0::1;;;;;;;:::i;:::-;70663:13;::::0;::::1;::::0;70810:40:::1;::::0;;-1:-1:-1;;;70810:40:0;;;;-1:-1:-1;;;;;70663:13:0;;::::1;::::0;70638:15:::1;::::0;;;;;;;70663:13;;70810:38:::1;::::0;:40:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;70663:13;70810:40:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70869:15:::0;;70787:63;;-1:-1:-1;70869:28:0::1;:15;-1:-1:-1::0;;70869:28:0;70865:585:::1;;70918:24;70975:5;:12;;;70965:6;70946:5;:16;;;:25;;;;:::i;:::-;70945:42;;;;:::i;:::-;70918:69;;71024:57;71044:16;71062:2;71066:14;71024:19;:57::i;:::-;71108:15;::::0;::::1;::::0;71006:75;;-1:-1:-1;71108:15:0::1;::::0;::::1;-1:-1:-1::0;;;;;71108:15:0::1;::::0;-1:-1:-1;4078:10:0;71142:21:::1;;70899:280;70865:585;;;71204:19;71251:5;:12;;;71241:6;71227:5;:11;;;:20;;;;:::i;:::-;71226:37;;;;:::i;:::-;71204:59;;71300:52;71320:11;71333:2;71337:14;71300:19;:52::i;:::-;71282:70:::0;-1:-1:-1;4078:10:0;71419:15:::1;::::0;::::1;::::0;71371:20;;-1:-1:-1;71419:15:0::1;::::0;::::1;-1:-1:-1::0;;;;;71419:15:0::1;::::0;-1:-1:-1;;70865:585:0::1;71464:71;4078:10:::0;71490:12:::1;-1:-1:-1::0;;;;;71464:25:0;::::1;::::0;71512:4:::1;71519:15:::0;71464:25:::1;:71::i;:::-;71576:42;71587:7;71596:6;71604:5;71611:6;71576:10;:42::i;:::-;-1:-1:-1::0;;69892:3:0::1;::::0;;::::1;::::0;-1:-1:-1;69851:1779:0::1;::::0;-1:-1:-1;;;;;;69851:1779:0::1;58434:1607:::0;34844:21;:19;:21::i;:::-;58519:19:::1;58541:15:::0;;;:6:::1;:15;::::0;;;;;;;58596:13:::1;::::0;;::::1;::::0;58589:21;;:6:::1;:21:::0;;;;;58631:12:::1;::::0;::::1;::::0;58589:21;;58631:33:::1;:12:::0;;::::1;:33;58623:66;;;;-1:-1:-1::0;;;58623:66:0::1;;;;;;;:::i;:::-;43042:1;58708:12:::0;;::::1;::::0;-1:-1:-1;;;58708:12:0;::::1;:35;:12;:35;58700:68;;;;-1:-1:-1::0;;;58700:68:0::1;;;;;;;:::i;:::-;58796:1;58787:6;:10;58779:37;;;;-1:-1:-1::0;;;58779:37:0::1;;;;;;;:::i;:::-;58872:6;58850:5;:18;;;58835:5;:12;;;:33;;;;:::i;:::-;:43;;58827:80;;;;-1:-1:-1::0;;;58827:80:0::1;;;;;;;:::i;:::-;58926:15;::::0;::::1;::::0;-1:-1:-1;;;58926:15:0;::::1;;;:24;::::0;:50:::1;;;58970:6;58954:5;:12;;;:22;58926:50;58918:81;;;;-1:-1:-1::0;;;58918:81:0::1;;;;;;;:::i;:::-;59018:13;::::0;::::1;::::0;-1:-1:-1;;;;;59018:13:0::1;59010:59;;;;-1:-1:-1::0;;;59010:59:0::1;;;;;;;:::i;:::-;59148:13;::::0;::::1;::::0;59279:40:::1;::::0;;-1:-1:-1;;;59279:40:0;;;;-1:-1:-1;;;;;59148:13:0;;::::1;::::0;59123:15:::1;::::0;;;;;;;59148:13;;59279:38:::1;::::0;:40:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;59148:13;59279:40:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59334:15:::0;;59256:63;;-1:-1:-1;59334:28:0::1;:15;-1:-1:-1::0;;59334:28:0;59330:545:::1;;59379:24;59436:5;:12;;;59426:6;59407:5;:16;;;:25;;;;:::i;:::-;59406:42;;;;:::i;:::-;59379:69;;59481:57;59501:16;59519:2;59523:14;59481:19;:57::i;:::-;59561:15;::::0;::::1;::::0;59463:75;;-1:-1:-1;59561:15:0::1;::::0;::::1;-1:-1:-1::0;;;;;59561:15:0::1;::::0;-1:-1:-1;4078:10:0;59591:21:::1;;59364:260;59330:545;;;59645:19;59692:5;:12;;;59682:6;59668:5;:11;;;:20;;;;:::i;:::-;59667:37;;;;:::i;:::-;59645:59;;59737:52;59757:11;59770:2;59774:14;59737:19;:52::i;:::-;59719:70:::0;-1:-1:-1;4078:10:0;59848:15:::1;::::0;::::1;::::0;59804:20;;-1:-1:-1;59848:15:0::1;::::0;::::1;-1:-1:-1::0;;;;;59848:15:0::1;::::0;-1:-1:-1;;59330:545:0::1;59885:71;4078:10:::0;59911:12:::1;3998:98:::0;59885:71:::1;59991:42;60002:7;60011:6;60019:5;60026:6;59991:10;:42::i;:::-;58508:1533;;;;;;;34888:20:::0;34179:1;35430:21;;35247:212;60203:1571;34844:21;:19;:21::i;:::-;60299:19:::1;60321:15:::0;;;:6:::1;:15;::::0;;;;;;;60376:13:::1;::::0;;::::1;::::0;60369:21;;:6:::1;:21:::0;;;;;60411:12:::1;::::0;::::1;::::0;60369:21;;60411:33:::1;:12:::0;;::::1;:33;60403:66;;;;-1:-1:-1::0;;;60403:66:0::1;;;;;;;:::i;:::-;43042:1;60488:12:::0;;::::1;::::0;-1:-1:-1;;;60488:12:0;::::1;:35;:12;:35;60480:68;;;;-1:-1:-1::0;;;60480:68:0::1;;;;;;;:::i;:::-;60576:1;60567:6;:10;60559:37;;;;-1:-1:-1::0;;;60559:37:0::1;;;;;;;:::i;:::-;60652:6;60630:5;:18;;;60615:5;:12;;;:33;;;;:::i;:::-;:43;;60607:80;;;;-1:-1:-1::0;;;60607:80:0::1;;;;;;;:::i;:::-;60706:15;::::0;::::1;::::0;-1:-1:-1;;;60706:15:0;::::1;;;:24;::::0;:50:::1;;;60750:6;60734:5;:12;;;:22;60706:50;60698:81;;;;-1:-1:-1::0;;;60698:81:0::1;;;;;;;:::i;:::-;60798:13;::::0;::::1;::::0;-1:-1:-1;;;;;60798:13:0::1;:27:::0;60790:59:::1;;;;-1:-1:-1::0;;;60790:59:0::1;;;;;;;:::i;:::-;60986:15:::0;;60904:18:::1;::::0;;;;;60986:28:::1;:15;-1:-1:-1::0;;60986:28:0;60982:347:::1;;61074:5;:12;;;61064:6;61045:5;:16;;;:25;;;;:::i;:::-;61044:42;;;;:::i;:::-;61109:15;::::0;::::1;::::0;61031:55;;-1:-1:-1;61109:15:0::1;::::0;::::1;-1:-1:-1::0;;;;;61109:15:0::1;::::0;-1:-1:-1;4078:10:0;61139:21:::1;;60982:347;;;61231:5;:12;;;61221:6;61207:5;:11;;;:20;;;;:::i;:::-;61206:37;;;;:::i;:::-;61193:50:::0;-1:-1:-1;4078:10:0;61302:15:::1;::::0;::::1;::::0;61258:20;;-1:-1:-1;61302:15:0::1;::::0;::::1;-1:-1:-1::0;;;;;61302:15:0::1;::::0;-1:-1:-1;60982:347:0::1;61360:10;61347:9;:23;;61339:54;;;;-1:-1:-1::0;;;61339:54:0::1;;;;;;;:::i;:::-;61459:10;61447:9;:22;61443:247;;;61486:20;61509:22;61521:10:::0;61509:9:::1;:22;:::i;:::-;61570:40;::::0;61486:45;;-1:-1:-1;61547:18:0::1;::::0;61570:10:::1;::::0;61486:45;;61547:18;61570:40;61547:18;61570:40;61486:45;61570:10;:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61546:64;;;61633:13;61625:53;;;;-1:-1:-1::0;;;61625:53:0::1;;;;;;;:::i;:::-;61471:219;;61443:247;61724:42;61735:7;61744:6;61752:5;61759:6;61724:10;:42::i;:::-;60288:1486;;;;;34888:20:::0;34179:1;35430:21;;35247:212;46870:901;-1:-1:-1;;;;;;;;;;;8379:16:0;8390:4;8379:10;:16::i;:::-;47067:20:::1;47090:15:::0;;;:6:::1;:15;::::0;;;;-1:-1:-1;;;;;47124:26:0;::::1;47116:80;;;::::0;-1:-1:-1;;;47116:80:0;;27651:2:1;47116:80:0::1;::::0;::::1;27633:21:1::0;27690:2;27670:18;;;27663:30;27729:34;27709:18;;;27702:62;-1:-1:-1;;;27780:18:1;;;27773:39;27829:19;;47116:80:0::1;27449:405:1::0;47116:80:0::1;47228:1;47215:10;-1:-1:-1::0;;;;;47215:14:0::1;;47207:65;;;::::0;-1:-1:-1;;;47207:65:0;;28061:2:1;47207:65:0::1;::::0;::::1;28043:21:1::0;28100:2;28080:18;;;28073:30;28139:34;28119:18;;;28112:62;-1:-1:-1;;;28190:18:1;;;28183:36;28236:19;;47207:65:0::1;27859:402:1::0;47207:65:0::1;43042:1;47305:13:::0;;::::1;::::0;-1:-1:-1;;;47305:13:0;::::1;:36;:13;:36;::::0;:78:::1;;-1:-1:-1::0;47345:13:0::1;::::0;::::1;::::0;-1:-1:-1;;;47345:13:0;::::1;:38;:13;43089:1;47345:38;47305:78;47283:167;;;::::0;-1:-1:-1;;;47283:167:0;;28468:2:1;47283:167:0::1;::::0;::::1;28450:21:1::0;28507:2;28487:18;;;28480:30;28546:34;28526:18;;;28519:62;-1:-1:-1;;;28597:18:1;;;28590:37;28644:19;;47283:167:0::1;28266:403:1::0;47283:167:0::1;47461:27:::0;;;47499:17;::::1;:30:::0;;-1:-1:-1;;;;;47499:30:0;::::1;-1:-1:-1::0;;;;;;47586:35:0;;;;;-1:-1:-1;;;47586:35:0::1;::::0;;;-1:-1:-1;;;;;47461:27:0;::::1;-1:-1:-1::0;;;;;;47632:43:0;;;;;-1:-1:-1;;;47659:15:0::1;47632:43;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;47693:70:::1;::::0;;28905:25:1;;;28961:2;28946:18;;28939:60;;;;29015:18;;29008:81;;;;29120:2;29105:18;;29098:34;47693:70:0::1;::::0;28892:3:1;28877:19;47693:70:0::1;28674:464:1::0;8783:138:0;8860:4;8884:12;;;;;;;;;;;-1:-1:-1;;;;;8884:29:0;;;;;;;;;;;;;;;8783:138::o;75289:317::-;-1:-1:-1;;;;;;;;;;;8379:16:0;8390:4;8379:10;:16::i;:::-;75415:9:::1;75410:125;75434:14;:21;75430:1;:25;75410:125;;;75513:10;75477:14;:33;75492:14;75507:1;75492:17;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;75477:33:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;75477:33:0;:46;;-1:-1:-1;;75477:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;75457:3:0::1;75410:125;;;;75550:48;75571:14;75587:10;75550:48;;;;;;;:::i;75995:158::-:0;76065:7;76117:15;;;:6;:15;;;;;:28;;;;76092:22;;;;;:53;;76117:28;76092:53;:::i;63834:2546::-;34844:21;:19;:21::i;:::-;63904:19:::1;63926:15:::0;;;:6:::1;:15;::::0;;;;;;;63981:13;;63974:21;;:6:::1;:21:::0;;;;;64035:13:::1;::::0;;::::1;::::0;64028:21;;:6:::1;:21:::0;;;;;;;64098:12;;::::1;::::0;63974:21;;64028;-1:-1:-1;;;64098:12:0;::::1;:35;:12;43134:1;64098:35;64090:62;;;;-1:-1:-1::0;;;64090:62:0::1;;;;;;;:::i;:::-;64171:11:::0;;-1:-1:-1;;;;;64171:11:0::1;:25:::0;;::::1;::::0;:49:::1;;-1:-1:-1::0;64200:16:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;64200:16:0::1;:20:::0;;64171:49:::1;64163:75;;;::::0;-1:-1:-1;;;64163:75:0;;22013:2:1;64163:75:0::1;::::0;::::1;21995:21:1::0;22052:2;22032:18;;;22025:30;-1:-1:-1;;;22071:18:1;;;22064:43;22124:18;;64163:75:0::1;21811:337:1::0;64163:75:0::1;64274:16:::0;;-1:-1:-1;;;64274:16:0;::::1;;;64266:58;;;::::0;-1:-1:-1;;;64266:58:0;;22355:2:1;64266:58:0::1;::::0;::::1;22337:21:1::0;22394:2;22374:18;;;22367:30;-1:-1:-1;;;22413:18:1;;;22406:55;22478:18;;64266:58:0::1;22153:349:1::0;64266:58:0::1;64343:12;::::0;::::1;::::0;-1:-1:-1;;;;;64343:12:0::1;4078:10:::0;64343:28:::1;64335:52;;;::::0;-1:-1:-1;;;64335:52:0;;30095:2:1;64335:52:0::1;::::0;::::1;30077:21:1::0;30134:2;30114:18;;;30107:30;-1:-1:-1;;;30153:18:1;;;30146:41;30204:18;;64335:52:0::1;29893:335:1::0;64335:52:0::1;64406:12;::::0;::::1;::::0;-1:-1:-1;;;64406:12:0;::::1;:33;:12;42819:1;64406:33;64398:66;;;;-1:-1:-1::0;;;64398:66:0::1;;;;;;;:::i;:::-;64513:13;::::0;::::1;::::0;64477:21:::1;::::0;-1:-1:-1;;;;;64513:13:0::1;64509:171;;-1:-1:-1::0;64575:2:0::1;64509:171;;;64643:5;:13;;;;;;;;;;-1:-1:-1::0;;;;;64643:13:0::1;-1:-1:-1::0;;;;;64628:38:0::1;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64610:58;;64509:171;64692:18;64713:86;64765:5;:12;;;64745:5;:16;;;64730:5;:12;;;:31;;;;:::i;64713:86::-;64692:107;;64810:13;64826:81;64873:5;:12;;;64858:5;:11;;;64843:5;:12;;;:26;;;;:::i;64826:81::-;64979:11:::0;;65024:38:::1;::::0;;-1:-1:-1;;;65024:38:0;;;;64810:97;;-1:-1:-1;;;;;;64979:11:0;;::::1;::::0;64956:13:::1;::::0;64979:11;;65024:36:::1;::::0;:38:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;64979:11;65024:38:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65162:16;::::0;;::::1;::::0;65147:12;;::::1;::::0;65002:60;;-1:-1:-1;65108:19:0::1;::::0;65130:76:::1;::::0;42502:7:::1;::::0;65147:31:::1;::::0;-1:-1:-1;;;;;65162:16:0::1;::::0;65147:31:::1;:::i;65130:76::-;65108:98;;65217:22;42502:7;65257:6;:16;;;65243:11;:30;;;;:::i;:::-;65242:39;;;;:::i;:::-;65370:12;::::0;::::1;::::0;65384:16;;65217:64;;-1:-1:-1;65346:71:0::1;::::0;-1:-1:-1;;;;;65346:23:0;;::::1;::::0;65370:12;::::1;::::0;65384:16:::1;65217:64:::0;65346:23:::1;:71::i;:::-;65498:12;::::0;::::1;::::0;65512:11:::1;::::0;::::1;::::0;65474:80:::1;::::0;-1:-1:-1;;;;;65498:12:0;;::::1;::::0;65512:11:::1;65525:28;65539:14:::0;65525:11;:28:::1;:::i;:::-;-1:-1:-1::0;;;;;65474:23:0;::::1;::::0;:80;;:23:::1;:80::i;:::-;65634:16:::0;;65605:17:::1;::::0;42502:7:::1;::::0;65626:24:::1;::::0;:5;:24:::1;:::i;:::-;65625:33;;;;:::i;:::-;65605:53:::0;-1:-1:-1;65669:18:0::1;65605:53:::0;65690:18:::1;65698:10:::0;65690:5;:18:::1;:::i;:::-;:30;;;;:::i;:::-;65735:13;::::0;::::1;::::0;65669:51;;-1:-1:-1;;;;;;65735:13:0::1;65731:512;;65821:12;::::0;::::1;::::0;:40:::1;::::0;65803:13:::1;::::0;-1:-1:-1;;;;;65821:12:0::1;::::0;65846:10;;65803:13;65821:40;65803:13;65821:40;65846:10;65821:12;:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;65895:16:0;;:43:::1;::::0;65802:59;;-1:-1:-1;65877:13:0::1;::::0;-1:-1:-1;;;;;65895:16:0;;::::1;::::0;65924:9;;65877:13;65895:43;65877:13;65895:43;65924:9;65895:16;:43:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65876:62;;;65961:8;:20;;;;;65973:8;65961:20;65953:52;;;;-1:-1:-1::0;;;65953:52:0::1;;;;;;;:::i;:::-;65764:253;;65731:512;;;66090:13;::::0;;::::1;::::0;66141:12;;::::1;::::0;-1:-1:-1;;;;;66090:13:0;;::::1;::::0;66119:47:::1;::::0;66090:13;;66141:12:::1;66155:10:::0;66119:21:::1;:47::i;:::-;66203:16:::0;;66181:50:::1;::::0;-1:-1:-1;;;;;66181:21:0;;::::1;::::0;66203:16:::1;66221:9:::0;66181:21:::1;:50::i;:::-;66023:220;65731:512;66255:12;::::0;::::1;:41:::0;;-1:-1:-1;;;;66255:41:0::1;-1:-1:-1::0;;;66255:41:0::1;::::0;;66314:58:::1;66327:7:::0;66336:10;66348:9;4078:10;66314:58:::1;;;;;;;;;:::i;:::-;;;;;;;;63893:2487;;;;;;;;;;;;34888:20:::0;34179:1;35430:21;;35247:212;54989:233;8140:4;8379:16;8140:4;8379:10;:16::i;:::-;55150:64:::1;55183:15;55200:13;55150:32;:64::i;81417:333::-:0;8140:4;8379:16;8140:4;8379:10;:16::i;:::-;-1:-1:-1;;;;;81531:20:0;::::1;::::0;;::::1;::::0;:47:::1;;-1:-1:-1::0;;;;;;81556:22:0;::::1;;::::0;;;:14:::1;:22;::::0;;;;;::::1;;81555:23;81531:47;81523:81;;;::::0;-1:-1:-1;;;81523:81:0;;30435:2:1;81523:81:0::1;::::0;::::1;30417:21:1::0;30474:2;30454:18;;;30447:30;-1:-1:-1;;;30493:18:1;;;30486:51;30554:18;;81523:81:0::1;30233:345:1::0;81523:81:0::1;81642:39;::::0;-1:-1:-1;;;81642:39:0;;81675:4:::1;81642:39;::::0;::::1;7352:51:1::0;81615:24:0::1;::::0;-1:-1:-1;;;;;81642:24:0;::::1;::::0;::::1;::::0;7325:18:1;;81642:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81615:66:::0;-1:-1:-1;81692:50:0::1;-1:-1:-1::0;;;;;81692:27:0;::::1;81720:3:::0;81615:66;81692:27:::1;:50::i;68473:183::-:0;68552:9;68547:102;68571:8;:15;68567:1;:19;68547:102;;;68608:29;68625:8;68634:1;68625:11;;;;;;;;:::i;:::-;;;;;;;68608:16;:29::i;:::-;68588:3;;68547:102;;10630:140;9832:7;9859:12;;;;;;;;;;:22;;;8379:16;8390:4;8379:10;:16::i;:::-;10736:26:::1;10748:4;10754:7;10736:11;:26::i;49403:2014::-:0;34844:21;:19;:21::i;:::-;-1:-1:-1;;;;;;;;;;;8379:16:0::1;8390:4;8379:10;:16::i;:::-;49501:19:::2;49523:15:::0;;;:6:::2;:15;::::0;;;;;;;49578:13;;49571:21;;:6:::2;:21:::0;;;;;;49611:12:::2;::::0;::::2;::::0;-1:-1:-1;;;49611:12:0;::::2;:33;:12;42660:1;49611:33;49603:66;;;;-1:-1:-1::0;;;49603:66:0::2;;;;;;;:::i;:::-;49733:13;::::0;::::2;::::0;49698:20:::2;::::0;-1:-1:-1;;;;;49733:13:0::2;49729:169;;-1:-1:-1::0;49794:2:0::2;49729:169;;;49861:5;:13;;;;;;;;;;-1:-1:-1::0;;;;;49861:13:0::2;-1:-1:-1::0;;;;;49846:38:0::2;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49829:57;;49729:169;49945:24;49972:149;50033:5;:12;;;50018:5;:11;;;50003:5;:12;;;:26;;;;:::i;49972:149::-;49945:176;;50132:25;50160:154;50226:5;:12;;;50206:5;:16;;;50191:5;:12;;;:31;;;;:::i;50160:154::-;50341:11;::::0;::::2;::::0;50380:12:::2;::::0;;::::2;::::0;50428:13;;::::2;::::0;50132:182;;-1:-1:-1;;;;;;50341:11:0;;::::2;::::0;50380:12;;::::2;::::0;50428:13:::2;50424:886;;50522:1;50503:16;:20;:43;;;;-1:-1:-1::0;;;;;;50527:19:0;::::2;::::0;::::2;50503:43;50499:209;;;50568:12;50585:5;-1:-1:-1::0;;;;;50585:10:0::2;50603:16;50585:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50567:57;;;50651:7;50643:49;;;::::0;-1:-1:-1;;;50643:49:0;;30974:2:1;50643:49:0::2;::::0;::::2;30956:21:1::0;31013:2;30993:18;;;30986:30;31052:31;31032:18;;;31025:59;31101:18;;50643:49:0::2;30772:353:1::0;50643:49:0::2;50548:160;50499:209;50746:1;50726:17;:21;:45;;;;-1:-1:-1::0;;;;;;50751:20:0;::::2;::::0;::::2;50726:45;50722:213;;;50793:12;50810:6;-1:-1:-1::0;;;;;50810:11:0::2;50829:17;50810:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50792:59;;;50878:7;50870:49;;;::::0;-1:-1:-1;;;50870:49:0;;30974:2:1;50870:49:0::2;::::0;::::2;30956:21:1::0;31013:2;30993:18;;;30986:30;31052:31;31032:18;;;31025:59;31101:18;;50870:49:0::2;30772:353:1::0;50870:49:0::2;50773:162;50722:213;50424:886;;;50992:13;::::0;::::2;::::0;-1:-1:-1;;;;;50992:13:0::2;51025:20:::0;;;;;:43:::2;;-1:-1:-1::0;;;;;;51049:19:0;::::2;::::0;::::2;51025:43;51021:130;;;51089:46;-1:-1:-1::0;;;;;51089:21:0;::::2;51111:5:::0;51118:16;51089:21:::2;:46::i;:::-;51189:1;51169:17;:21;:45;;;;-1:-1:-1::0;;;;;;51194:20:0;::::2;::::0;::::2;51169:45;51165:134;;;51235:48;-1:-1:-1::0;;;;;51235:21:0;::::2;51257:6:::0;51265:17;51235:21:::2;:48::i;:::-;50952:358;50424:886;42974:1;51322:12:::0;::::2;:37:::0;;-1:-1:-1;;;;51322:37:0::2;-1:-1:-1::0;;;51322:37:0::2;::::0;;51375:34:::2;::::0;;31304:25:1;;;4078:10:0;31360:2:1;31345:18;;31338:60;51375:34:0::2;::::0;31277:18:1;51375:34:0::2;;;;;;;;49490:1927;;;;;;;34876:1:::1;34888:20:::0;34179:1;35430:21;;35247:212;40604:154;40695:55;;-1:-1:-1;;;40695:55:0;;40744:4;40695:55;;;7352:51:1;40668:7:0;;-1:-1:-1;;;;;40695:40:0;;;;;7325:18:1;;40695:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;66475:1900::-;34844:21;:19;:21::i;:::-;66548:19:::1;66570:15:::0;;;:6:::1;:15;::::0;;;;;;;66625:13;;66618:21;;:6:::1;:21:::0;;;;;66679:13:::1;::::0;;::::1;::::0;66672:21;;:6:::1;:21:::0;;;;;;;66742:12;;::::1;::::0;66618:21;;66672;-1:-1:-1;;;66742:12:0;::::1;:35;:12;43134:1;66742:35;66734:62;;;;-1:-1:-1::0;;;66734:62:0::1;;;;;;;:::i;:::-;66852:20:::0;;66833:39:::1;::::0;66852:20:::1;-1:-1:-1::0;;;66852:20:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;66833:16:0;::::1;;:39;:::i;:::-;66815:57;;:15;:57;66807:97;;;::::0;-1:-1:-1;;;66807:97:0;;31792:2:1;66807:97:0::1;::::0;::::1;31774:21:1::0;31831:2;31811:18;;;31804:30;31870:29;31850:18;;;31843:57;31917:18;;66807:97:0::1;31590:351:1::0;66807:97:0::1;66923:12;::::0;::::1;::::0;-1:-1:-1;;;66923:12:0;::::1;:33;:12;42819:1;66923:33;66915:66;;;;-1:-1:-1::0;;;66915:66:0::1;;;;;;;:::i;:::-;67000:11;::::0;::::1;::::0;-1:-1:-1;;;;;67000:11:0::1;4078:10:::0;67000:27:::1;::::0;:67:::1;;-1:-1:-1::0;67031:36:0::1;-1:-1:-1::0;;;;;;;;;;;4078:10:0;8783:138;:::i;67031:36::-:1;66992:102;;;::::0;-1:-1:-1;;;66992:102:0;;32148:2:1;66992:102:0::1;::::0;::::1;32130:21:1::0;32187:2;32167:18;;;32160:30;-1:-1:-1;;;32206:18:1;;;32199:52;32268:18;;66992:102:0::1;31946:346:1::0;66992:102:0::1;67143:13;::::0;::::1;::::0;67107:21:::1;::::0;-1:-1:-1;;;;;67143:13:0::1;67139:171;;-1:-1:-1::0;67205:2:0::1;67139:171;;;67273:5;:13;;;;;;;;;;-1:-1:-1::0;;;;;67273:13:0::1;-1:-1:-1::0;;;;;67258:38:0::1;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67240:58;;67139:171;67322:18;67343:86;67395:5;:12;;;67375:5;:16;;;67360:5;:12;;;:31;;;;:::i;67343:86::-;67322:107;;67440:13;67456:81;67503:5;:12;;;67488:5;:11;;;67473:5;:12;;;:26;;;;:::i;67456:81::-;67440:97;;67587:17;42502:7;67621:6;:16;;;67608:10;:29;;;;:::i;:::-;:33;::::0;67640:1:::1;67608:33;:::i;:::-;67607:42;;;;:::i;:::-;67587:62:::0;-1:-1:-1;67660:18:0::1;67587:62:::0;67681:18:::1;67689:10:::0;67681:5;:18:::1;:::i;:::-;:30;;;;:::i;:::-;67726:13;::::0;::::1;::::0;67660:51;;-1:-1:-1;;;;;;67726:13:0::1;67722:510;;67812:11;::::0;::::1;::::0;:39:::1;::::0;67794:13:::1;::::0;-1:-1:-1;;;;;67812:11:0::1;::::0;67836:10;;67794:13;67812:39;67794:13;67812:39;67836:10;67812:11;:39:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;67885:16:0;;:43:::1;::::0;67793:58;;-1:-1:-1;67867:13:0::1;::::0;-1:-1:-1;;;;;67885:16:0;;::::1;::::0;67914:9;;67867:13;67885:43;67867:13;67885:43;67914:9;67885:16;:43:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67866:62;;;67951:8;:20;;;;;67963:8;67951:20;67943:52;;;;-1:-1:-1::0;;;67943:52:0::1;;;;;;;:::i;:::-;67755:252;;67722:510;;;68080:13;::::0;::::1;::::0;68131:11:::1;::::0;::::1;::::0;-1:-1:-1;;;;;68080:13:0;;::::1;::::0;68109:46:::1;::::0;68080:13;;68131:11:::1;68144:10:::0;68109:21:::1;:46::i;:::-;68192:16:::0;;68170:50:::1;::::0;-1:-1:-1;;;;;68170:21:0;;::::1;::::0;68192:16:::1;68210:9:::0;68170:21:::1;:50::i;:::-;68013:219;67722:510;42926:1;68244:12:::0;::::1;:44:::0;;-1:-1:-1;;;;68244:44:0::1;-1:-1:-1::0;;;68244:44:0::1;::::0;;68306:61:::1;68322:7:::0;68331:10;68343:9;4078:10;68306:61:::1;;;;;;;;;:::i;61860:1894::-:0;34844:21;:19;:21::i;:::-;61929:19:::1;61951:15:::0;;;:6:::1;:15;::::0;;;;61987::::1;::::0;::::1;::::0;-1:-1:-1;;;;;61987:15:0::1;::::0;;::::1;;4078:10:::0;61987:31:::1;61979:60;;;::::0;-1:-1:-1;;;61979:60:0;;32499:2:1;61979:60:0::1;::::0;::::1;32481:21:1::0;32538:2;32518:18;;;32511:30;-1:-1:-1;;;32557:18:1;;;32550:46;32613:18;;61979:60:0::1;32297:340:1::0;61979:60:0::1;62058:12;::::0;::::1;::::0;:33:::1;:12;42660:1;62058:33;62050:66;;;;-1:-1:-1::0;;;62050:66:0::1;;;;;;;:::i;:::-;62129:20;62167:5;:18;;;62152:5;:12;;;:33;;;;:::i;:::-;62129:56;;62219:1;62204:12;:16;62196:53;;;;-1:-1:-1::0;;;62196:53:0::1;;;;;;;:::i;:::-;62326:13;::::0;::::1;::::0;62291:20:::1;::::0;-1:-1:-1;;;;;62326:13:0::1;62322:169;;-1:-1:-1::0;62387:2:0::1;62322:169;;;62454:5;:13;;;;;;;;;;-1:-1:-1::0;;;;;62454:13:0::1;-1:-1:-1::0;;;;;62439:38:0::1;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62422:57;;62322:169;62537:15:::0;;62503:19:::1;::::0;62537:28:::1;:15;-1:-1:-1::0;;62537:28:0;62533:457:::1;;62596:165;62661:5;:12;;;62646:5;:11;;;62631:12;:26;;;;:::i;62596:165::-;62582:179;;62533:457;;;62808:170;62878:5;:12;;;62858:5;:16;;;62843:12;:31;;;;:::i;62808:170::-;62794:184;;62533:457;63035:16:::0;;63000:17:::1;::::0;42502:7:::1;::::0;63021:30:::1;::::0;:11;:30:::1;:::i;:::-;63020:39;;;;:::i;:::-;63000:59:::0;-1:-1:-1;63070:24:0::1;63000:59:::0;63070:24;::::1;:::i;:::-;63130:13;::::0;::::1;::::0;63070:24;;-1:-1:-1;;;;;;63130:13:0::1;63126:497;;63220:15;::::0;::::1;::::0;:44:::1;::::0;63202:13:::1;::::0;63220:15:::1;::::0;::::1;-1:-1:-1::0;;;;;63220:15:0::1;::::0;63248:11;;63202:13;63220:44;63202:13;63220:44;63248:11;63220:15;:44:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;63298:16:0;;:43:::1;::::0;63201:63;;-1:-1:-1;63280:13:0::1;::::0;-1:-1:-1;;;;;63298:16:0;;::::1;::::0;63327:9;;63280:13;63298:43;63280:13;63298:43;63327:9;63298:16;:43:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63279:62;;;63364:8;:20;;;;;63376:8;63364:20;63356:52;;;;-1:-1:-1::0;;;63356:52:0::1;;;;;;;:::i;:::-;63159:261;;63126:497;;;63466:13;::::0;::::1;::::0;63517:15:::1;::::0;::::1;::::0;-1:-1:-1;;;;;63466:13:0;;::::1;::::0;63495:51:::1;::::0;63466:13;;::::1;63517:15:::0;;::::1;;63534:11:::0;63495:21:::1;:51::i;:::-;63583:16:::0;;63561:50:::1;::::0;-1:-1:-1;;;;;63561:21:0;;::::1;::::0;63583:16:::1;63601:9:::0;63561:21:::1;:50::i;:::-;63426:197;63126:497;63635:12;::::0;::::1;:37:::0;;-1:-1:-1;;63635:37:0::1;42753:1;63635:37;::::0;;63688:58:::1;63700:7:::0;63709:11;63722:9;63733:12:::1;4078:10:::0;;3998:98;63733:12:::1;63688:58;;;;;;;;;:::i;:::-;;;;;;;;61918:1836;;;;;34888:20:::0;34179:1;35430:21;;35247:212;45987:508;-1:-1:-1;;;;;;;;;;;8379:16:0;8390:4;8379:10;:16::i;:::-;46118:12:::1;46100:14;:30;;;;46092:80;;;::::0;-1:-1:-1;;;46092:80:0;;32844:2:1;46092:80:0::1;::::0;::::1;32826:21:1::0;32883:2;32863:18;;;32856:30;32922:34;32902:18;;;32895:62;-1:-1:-1;;;32973:18:1;;;32966:35;33018:19;;46092:80:0::1;32642:401:1::0;46092:80:0::1;46196:21;::::0;;;:12:::1;:21;::::0;;;;;::::1;;46195:22;46187:68;;;::::0;-1:-1:-1;;;46187:68:0;;33250:2:1;46187:68:0::1;::::0;::::1;33232:21:1::0;33289:2;33269:18;;;33262:30;33328:34;33308:18;;;33301:62;-1:-1:-1;;;33379:18:1;;;33372:31;33420:19;;46187:68:0::1;33048:397:1::0;46187:68:0::1;46266:21;::::0;;;:12:::1;:21;::::0;;;;;;;:28;;-1:-1:-1;;46266:28:0::1;46290:4;46266:28:::0;;::::1;::::0;;;46328:6:::1;:15:::0;;;;;;46354:38;;::::1;::::0;::::1;-1:-1:-1::0;;;46354:38:0;::::1;-1:-1:-1::0;;;;;46354:38:0;;::::1;::::0;;;::::1;::::0;;46403:13;;::::1;:35:::0;;-1:-1:-1;;;;46403:35:0::1;-1:-1:-1::0;;;46403:35:0::1;::::0;;46454:33;;33623:25:1;;;33664:18;;;33657:55;;;;46454:33:0::1;::::0;33596:18:1;46454:33:0::1;;;;;;;46081:414;45987:508:::0;;;:::o;57179:1045::-;34844:21;:19;:21::i;:::-;57354:19:::1;57376:15:::0;;;:6:::1;:15;::::0;;;;43042:1:::1;57410:12:::0;;::::1;::::0;-1:-1:-1;;;57410:12:0;::::1;:35;:12;:35;57402:61;;;::::0;-1:-1:-1;;;57402:61:0;;20724:2:1;57402:61:0::1;::::0;::::1;20706:21:1::0;20763:2;20743:18;;;20736:30;-1:-1:-1;;;20782:18:1;;;20775:43;20835:18;;57402:61:0::1;20522:337:1::0;57402:61:0::1;57491:1;57482:6;:10;:23;;;;;57504:1;57496:5;:9;57482:23;57474:59;;;::::0;-1:-1:-1;;;57474:59:0;;21066:2:1;57474:59:0::1;::::0;::::1;21048:21:1::0;21105:2;21085:18;;;21078:30;-1:-1:-1;;;21124:18:1;;;21117:53;21187:18;;57474:59:0::1;20864:347:1::0;57474:59:0::1;57597:6;:17:::0;57567:18:::1;::::0;42502:7:::1;::::0;57589:25:::1;::::0;:5;:25:::1;:::i;:::-;57588:34;;;;:::i;:::-;57567:55:::0;-1:-1:-1;57635:18:0::1;57656:22;::::0;::::1;42543:1;57656:22;:43;;57689:10;57656:43;;;57681:5;57656:43;57635:64;;57732:9;57718:10;:23;;57710:54;;;;-1:-1:-1::0;;;57710:54:0::1;;;;;;;:::i;:::-;57867:10;57855:9;:22;57851:247;;;57894:20;57917:22;57929:10:::0;57917:9:::1;:22;:::i;:::-;57978:40;::::0;57894:45;;-1:-1:-1;57955:18:0::1;::::0;57978:10:::1;::::0;57894:45;;57955:18;57978:40;57955:18;57978:40;57894:45;57978:10;:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57954:64;;;58041:13;58033:53;;;;-1:-1:-1::0;;;58033:53:0::1;;;;;;;:::i;:::-;57879:219;;57851:247;58137:79;58147:9;58158:7;58175:1;58179:6;58187:5;58194:10;58206:9;58137;:79::i;:::-;57343:881;;;34888:20:::0;34179:1;35430:21;;35247:212;34888:20;57179:1045;;;;;:::o;9136:105::-;9203:30;9214:4;4078:10;9203;:30::i;41100:198::-;41174:23;41200:25;41219:5;41200:18;:25::i;:::-;41236:54;;-1:-1:-1;;;41236:54:0;;-1:-1:-1;;;;;33915:32:1;;;41236:54:0;;;33897:51:1;33964:18;;;33957:34;;;41174:51:0;;-1:-1:-1;41236:27:0;;;;;;33870:18:1;;41236:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34924:315::-;34222:1;35053:7;;:18;35049:88;;35095:30;;-1:-1:-1;;;35095:30:0;;;;;;;;;;;35049:88;34222:1;35214:7;:17;34924:315::o;80494:568::-;80598:19;80620:6;:15;80627:7;80620:15;;;;;;;;;;;80598:37;;80692:56;;;;;;;;80698:7;80692:56;;;;80707:6;80692:56;;;;80715:6;-1:-1:-1;;;;;80692:56:0;;;;;80723:5;-1:-1:-1;;;;;80692:56:0;;;;;42819:1;80692:56;;;;;80668:6;:21;80677:11;;80675:13;;;;;:::i;:::-;;;;;-1:-1:-1;80668:21:0;;;;;;;;;;;;;;-1:-1:-1;80668:21:0;;;:80;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;80668:80:0;;;-1:-1:-1;;;;;;80668:80:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;80668:80:0;-1:-1:-1;;;;;;80668:80:0;;;;;;;;;;;;;;;;;80802:18;;;:28;;80824:6;;-1:-1:-1;80802:28:0;;80824:6;;80802:28;:::i;:::-;;;;-1:-1:-1;;80867:12:0;;;;80845:18;;;;:34;80841:143;;80896:12;;;:34;;-1:-1:-1;;80896:34:0;42705:1;80896:34;;;80950:22;;;34324:25:1;;;-1:-1:-1;34380:2:1;34365:18;;34358:34;80950:22:0;;34297:18:1;80950:22:0;;;;;;;80841:143;81010:11;;81001:53;;;34662:25:1;;;34718:2;34703:18;;34696:34;;;34746:18;;34739:34;;;-1:-1:-1;;;;;34847:15:1;;;34842:2;34827:18;;34820:43;34900:15;;34894:3;34879:19;;34872:44;81001:53:0;;34649:3:1;34634:19;81001:53:0;34403:519:1;82417:590:0;82555:14;82609;82591:32;;:14;:32;;;82587:413;;-1:-1:-1;82649:5:0;82587:413;;;82693:14;82676:31;;:14;:31;;;82672:328;;;82749:31;82766:14;82749;:31;:::i;:::-;82742:39;;:2;:39;:::i;:::-;82733:49;;:5;:49;:::i;:::-;82724:58;;82672:328;;;82815:12;82837:31;82854:14;82837;:31;:::i;:::-;82830:39;;:2;:39;:::i;:::-;82815:54;-1:-1:-1;82893:12:0;82815:54;82893:5;:12;:::i;:::-;82884:21;-1:-1:-1;82924:12:0;82932:4;82924:5;:12;:::i;:::-;:17;82920:69;;82962:11;82972:1;82962:11;;:::i;:::-;;;82920:69;82800:200;82672:328;82417:590;;;;;:::o;28321:190::-;28449:53;;-1:-1:-1;;;;;36835:15:1;;;28449:53:0;;;36817:34:1;36887:15;;;36867:18;;;36860:43;36919:18;;;36912:34;;;28422:81:0;;28442:5;;28464:18;;;;;36752::1;;28449:53:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28449:53:0;;;;;;;;;;;28422:19;:81::i;79696:529::-;79989:108;;;;;;;;79995:9;79989:108;;;;;;80006:7;79989:108;;;;80015:7;-1:-1:-1;;;;;79989:108:0;;;;;80024:6;79989:108;;;;80032:5;79989:108;;;;80039:10;79989:108;;;;80051:1;79989:108;;;;42660:1;79989:108;;;;;;80073:12;4078:10;;3998:98;80073:12;-1:-1:-1;;;;;79989:108:0;;;;;80087:9;79989:108;;;;;79952:6;:21;79961:11;;79959:13;;;;;:::i;:::-;;;;;-1:-1:-1;79952:21:0;;;;;;;;;;;;;;-1:-1:-1;79952:21:0;:145;;;;-1:-1:-1;;79952:145:0;;;;;;;;;;;;-1:-1:-1;79952:145:0;;;;;;;;;;;;-1:-1:-1;;;;;;79952:145:0;-1:-1:-1;;;;;79952:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;79952:145:0;;;;;;;;;;;;;;;-1:-1:-1;;;;79952:145:0;-1:-1:-1;;;79952:145:0;;;;;;;;;;;80124:11;80115:102;;80137:9;80148:7;80157;80166:6;80174:5;80181:10;80193:9;4078:10;80115:102;;;37318:25:1;;;37391:4;37379:17;;;37374:2;37359:18;;37352:45;37413:18;;;37406:34;;;;-1:-1:-1;;;;;37514:15:1;;;37509:2;37494:18;;37487:43;37561:3;37546:19;;37539:35;;;;37467:3;37590:19;;37583:35;37649:3;37634:19;;37627:35;37706:14;;37699:22;37693:3;37678:19;;37671:51;37759:15;37753:3;37738:19;;37731:44;37305:3;37290:19;80115:102:0;;;;;;;79696:529;;;;;;;:::o;81842:471::-;81976:14;82030;82012:32;;:14;:32;;;82008:298;;-1:-1:-1;82070:5:0;82008:298;;;82114:14;82097:31;;:14;:31;;;82093:213;;;82170:31;82187:14;82170;:31;:::i;82093:213::-;82261:31;82278:14;82261;:31;:::i;:::-;82254:39;;:2;:39;:::i;:::-;82245:49;;:5;:49;:::i;:::-;82236:58;81842:471;-1:-1:-1;;;;81842:471:0:o;27914:162::-;28024:43;;-1:-1:-1;;;;;33915:32:1;;;28024:43:0;;;33897:51:1;33964:18;;;33957:34;;;27997:71:0;;28017:5;;28039:14;;;;;33870:18:1;;28024:43:0;33723:274:1;40766:162:0;40876:44;;-1:-1:-1;;;40876:44:0;;40904:4;40876:44;;;37998:34:1;-1:-1:-1;;;;;38068:15:1;;38048:18;;;38041:43;-1:-1:-1;;;;;39902:42:0;40876:19;;37933:18:1;;40876:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12213:324::-;12290:4;12312:22;12320:4;12326:7;12312;:22::i;:::-;12307:223;;12351:6;:12;;;;;;;;;;;-1:-1:-1;;;;;12351:29:0;;;;;;;;;:36;;-1:-1:-1;;12351:36:0;12383:4;12351:36;;;12434:12;4078:10;;3998:98;12434:12;-1:-1:-1;;;;;12407:40:0;12425:7;-1:-1:-1;;;;;12407:40:0;12419:4;12407:40;;;;;;;;;;-1:-1:-1;12469:4:0;12462:11;;12307:223;-1:-1:-1;12513:5:0;12506:12;;12781:325;12859:4;12880:22;12888:4;12894:7;12880;:22::i;:::-;12876:223;;;12951:5;12919:12;;;;;;;;;;;-1:-1:-1;;;;;12919:29:0;;;;;;;;;;:37;;-1:-1:-1;;12919:37:0;;;12976:40;4078:10;;12919:12;;12976:40;;12951:5;12976:40;-1:-1:-1;13038:4:0;13031:11;;41306:353;-1:-1:-1;;;;;;;;;;41404:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;41446:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41486:40:0;;-1:-1:-1;;;41486:40:0;;-1:-1:-1;;;;;40169:42:0;-1:-1:-1;41486:14:0;;-1:-1:-1;41486:40:0;;41501:24;;41486:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41574:40:0;;-1:-1:-1;;;41574:40:0;;-1:-1:-1;;;;;40272:42:0;41574:14;;:40;;41589:24;;41574:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36460:127::-;36533:46;;-1:-1:-1;;;36533:46:0;;-1:-1:-1;;;;;7370:32:1;;36533:46:0;;;7352:51:1;36408:42:0;;36533:35;;7325:18:1;;36533:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40936:156;41042:42;;-1:-1:-1;;;41042:42:0;;41068:4;41042:42;;;37998:34:1;-1:-1:-1;;;;;38068:15:1;;38048:18;;;38041:43;-1:-1:-1;;;;;39902:42:0;41042:17;;37933:18:1;;41042:42:0;37786:304:1;36595:187:0;36702:72;;-1:-1:-1;;;36702:72:0;;-1:-1:-1;;;;;38016:15:1;;;36702:72:0;;;37998:34:1;38068:15;;38048:18;;;38041:43;36408:42:0;;36702:43;;37933:18:1;;36702:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9377:201;9466:22;9474:4;9480:7;9466;:22::i;:::-;9461:110;;9512:47;;-1:-1:-1;;;9512:47:0;;-1:-1:-1;;;;;33915:32:1;;9512:47:0;;;33897:51:1;33964:18;;;33957:34;;;33870:18;;9512:47:0;33723:274:1;30725:638:0;31149:23;31175:33;-1:-1:-1;;;;;31175:27:0;;31203:4;31175:27;:33::i;:::-;31149:59;;31223:10;:17;31244:1;31223:22;;:57;;;;;31261:10;31250:30;;;;;;;;;;;;:::i;:::-;31249:31;31223:57;31219:137;;;31304:40;;-1:-1:-1;;;31304:40:0;;-1:-1:-1;;;;;7370:32:1;;31304:40:0;;;7352:51:1;7325:18;;31304:40:0;7183:226:1;23118:153:0;23193:12;23225:38;23247:6;23255:4;23261:1;23193:12;23851;23865:23;23892:6;-1:-1:-1;;;;;23892:11:0;23911:5;23918:4;23892:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23850:73;;;;23941:55;23968:6;23976:7;23985:10;23941:26;:55::i;:::-;23934:62;23606:398;-1:-1:-1;;;;;;23606:398:0:o;25082:595::-;25223:12;25258:7;25253:417;;25282:19;25290:10;25282:7;:19::i;:::-;25253:417;;;25510:17;;:22;:49;;;;-1:-1:-1;;;;;;25536:18:0;;;:23;25510:49;25506:121;;;25587:24;;-1:-1:-1;;;25587:24:0;;-1:-1:-1;;;;;7370:32:1;;25587:24:0;;;7352:51:1;7325:18;;25587:24:0;7183:226:1;25506:121:0;-1:-1:-1;25648:10:0;25641:17;;26230:528;26363:17;;:21;26359:392;;26595:10;26589:17;26652:15;26639:10;26635:2;26631:19;26624:44;26359:392;26722:17;;-1:-1:-1;;;26722:17:0;;;;;;;;;;;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:173;661:20;;-1:-1:-1;;;;;710:31:1;;700:42;;690:70;;756:1;753;746:12;690:70;593:173;;;:::o;771:186::-;830:6;883:2;871:9;862:7;858:23;854:32;851:52;;;899:1;896;889:12;851:52;922:29;941:9;922:29;:::i;962:127::-;1023:10;1018:3;1014:20;1011:1;1004:31;1054:4;1051:1;1044:15;1078:4;1075:1;1068:15;1094:275;1165:2;1159:9;1230:2;1211:13;;-1:-1:-1;;1207:27:1;1195:40;;1265:18;1250:34;;1286:22;;;1247:62;1244:88;;;1312:18;;:::i;:::-;1348:2;1341:22;1094:275;;-1:-1:-1;1094:275:1:o;1374:183::-;1434:4;1467:18;1459:6;1456:30;1453:56;;;1489:18;;:::i;:::-;-1:-1:-1;1534:1:1;1530:14;1546:4;1526:25;;1374:183::o;1562:668::-;1616:5;1669:3;1662:4;1654:6;1650:17;1646:27;1636:55;;1687:1;1684;1677:12;1636:55;1723:6;1710:20;1749:4;1773:60;1789:43;1829:2;1789:43;:::i;:::-;1773:60;:::i;:::-;1855:3;1879:2;1874:3;1867:15;1907:4;1902:3;1898:14;1891:21;;1964:4;1958:2;1955:1;1951:10;1943:6;1939:23;1935:34;1921:48;;1992:3;1984:6;1981:15;1978:35;;;2009:1;2006;1999:12;1978:35;2045:4;2037:6;2033:17;2059:142;2075:6;2070:3;2067:15;2059:142;;;2141:17;;2129:30;;2179:12;;;;2092;;2059:142;;;-1:-1:-1;2219:5:1;1562:668;-1:-1:-1;;;;;;1562:668:1:o;2235:595::-;2353:6;2361;2414:2;2402:9;2393:7;2389:23;2385:32;2382:52;;;2430:1;2427;2420:12;2382:52;2470:9;2457:23;2499:18;2540:2;2532:6;2529:14;2526:34;;;2556:1;2553;2546:12;2526:34;2579:61;2632:7;2623:6;2612:9;2608:22;2579:61;:::i;:::-;2569:71;;2693:2;2682:9;2678:18;2665:32;2649:48;;2722:2;2712:8;2709:16;2706:36;;;2738:1;2735;2728:12;2706:36;;2761:63;2816:7;2805:8;2794:9;2790:24;2761:63;:::i;:::-;2751:73;;;2235:595;;;;;:::o;2835:114::-;2919:4;2912:5;2908:16;2901:5;2898:27;2888:55;;2939:1;2936;2929:12;2954:118;3040:5;3033:13;3026:21;3019:5;3016:32;3006:60;;3062:1;3059;3052:12;3077:128;3142:20;;3171:28;3142:20;3171:28;:::i;3210:659::-;3309:6;3317;3325;3333;3341;3349;3402:3;3390:9;3381:7;3377:23;3373:33;3370:53;;;3419:1;3416;3409:12;3370:53;3458:9;3445:23;3477:29;3500:5;3477:29;:::i;:::-;3525:5;-1:-1:-1;3577:2:1;3562:18;;3549:32;;-1:-1:-1;3628:2:1;3613:18;;3600:32;;-1:-1:-1;3679:2:1;3664:18;;3651:32;;-1:-1:-1;3702:39:1;3736:3;3721:19;;3702:39;:::i;:::-;3692:49;;3793:3;3782:9;3778:19;3765:33;3807:30;3829:7;3807:30;:::i;:::-;3856:7;3846:17;;;3210:659;;;;;;;;:::o;3874:248::-;3942:6;3950;4003:2;3991:9;3982:7;3978:23;3974:32;3971:52;;;4019:1;4016;4009:12;3971:52;-1:-1:-1;;4042:23:1;;;4112:2;4097:18;;;4084:32;;-1:-1:-1;3874:248:1:o;4127:348::-;4211:6;4264:2;4252:9;4243:7;4239:23;4235:32;4232:52;;;4280:1;4277;4270:12;4232:52;4320:9;4307:23;4353:18;4345:6;4342:30;4339:50;;;4385:1;4382;4375:12;4339:50;4408:61;4461:7;4452:6;4441:9;4437:22;4408:61;:::i;4480:180::-;4539:6;4592:2;4580:9;4571:7;4567:23;4563:32;4560:52;;;4608:1;4605;4598:12;4560:52;-1:-1:-1;4631:23:1;;4480:180;-1:-1:-1;4480:180:1:o;4665:391::-;4751:6;4759;4767;4775;4828:3;4816:9;4807:7;4803:23;4799:33;4796:53;;;4845:1;4842;4835:12;4796:53;4868:29;4887:9;4868:29;:::i;:::-;4858:39;4944:2;4929:18;;4916:32;;-1:-1:-1;4995:2:1;4980:18;;4967:32;;5046:2;5031:18;5018:32;;-1:-1:-1;4665:391:1;-1:-1:-1;;;4665:391:1:o;5061:348::-;5128:6;5136;5189:2;5177:9;5168:7;5164:23;5160:32;5157:52;;;5205:1;5202;5195:12;5157:52;5241:9;5228:23;5218:33;;5301:2;5290:9;5286:18;5273:32;5345:14;5338:5;5334:26;5327:5;5324:37;5314:65;;5375:1;5372;5365:12;5314:65;5398:5;5388:15;;;5061:348;;;;;:::o;5781:1138::-;5899:6;5907;5960:2;5948:9;5939:7;5935:23;5931:32;5928:52;;;5976:1;5973;5966:12;5928:52;6016:9;6003:23;6045:18;6086:2;6078:6;6075:14;6072:34;;;6102:1;6099;6092:12;6072:34;6125:61;6178:7;6169:6;6158:9;6154:22;6125:61;:::i;:::-;6115:71;;6205:2;6195:12;;6260:2;6249:9;6245:18;6232:32;6289:2;6279:8;6276:16;6273:36;;;6305:1;6302;6295:12;6273:36;6328:24;;;-1:-1:-1;6383:4:1;6375:13;;6371:27;-1:-1:-1;6361:55:1;;6412:1;6409;6402:12;6361:55;6448:2;6435:16;6471:60;6487:43;6527:2;6487:43;:::i;6471:60::-;6565:15;;;6647:1;6643:10;;;;6635:19;;6631:28;;;6596:12;;;;6671:19;;;6668:39;;;6703:1;6700;6693:12;6668:39;6727:11;;;;6747:142;6763:6;6758:3;6755:15;6747:142;;;6829:17;;6817:30;;6780:12;;;;6867;;;;6747:142;;;6908:5;6898:15;;;;;;;5781:1138;;;;;:::o;6924:254::-;6992:6;7000;7053:2;7041:9;7032:7;7028:23;7024:32;7021:52;;;7069:1;7066;7059:12;7021:52;7105:9;7092:23;7082:33;;7134:38;7168:2;7157:9;7153:18;7134:38;:::i;:::-;7124:48;;6924:254;;;;;:::o;7785:1069::-;7995:13;;7663:4;7652:16;7640:29;;7965:3;7950:19;;8076:4;8068:6;8064:17;8058:24;8051:4;8040:9;8036:20;8029:54;8130:4;8122:6;8118:17;8112:24;8145:54;8193:4;8182:9;8178:20;8164:12;-1:-1:-1;;;;;7742:31:1;7730:44;;7676:104;8145:54;;8255:4;8247:6;8243:17;8237:24;8230:4;8219:9;8215:20;8208:54;8318:4;8310:6;8306:17;8300:24;8293:4;8282:9;8278:20;8271:54;8381:4;8373:6;8369:17;8363:24;8356:4;8345:9;8341:20;8334:54;8444:4;8436:6;8432:17;8426:24;8419:4;8408:9;8404:20;8397:54;8500:4;8492:6;8488:17;8482:24;8515:54;8563:4;8552:9;8548:20;8532:14;7663:4;7652:16;7640:29;;7596:75;8515:54;-1:-1:-1;8588:6:1;8631:15;;;8625:22;-1:-1:-1;;;;;7742:31:1;8691:18;;;7730:44;8729:6;8772:15;;;8766:22;375:13;368:21;8829:18;;;;356:34;;;;7785:1069;:::o;10161:417::-;10392:25;;;10448:2;10433:18;;10426:34;;;;10491:2;10476:18;;10469:34;-1:-1:-1;;;;;10539:32:1;10534:2;10519:18;;10512:60;10379:3;10364:19;;10161:417::o;10583:449::-;10660:6;10668;10676;10729:2;10717:9;10708:7;10704:23;10700:32;10697:52;;;10745:1;10742;10735:12;10697:52;10781:9;10768:23;10758:33;;10810:38;10844:2;10833:9;10829:18;10810:38;:::i;:::-;10800:48;;10898:2;10887:9;10883:18;10870:32;-1:-1:-1;;;;;10935:5:1;10931:52;10924:5;10921:63;10911:91;;10998:1;10995;10988:12;10911:91;11021:5;11011:15;;;10583:449;;;;;:::o;12763:967::-;12853:6;12861;12914:2;12902:9;12893:7;12889:23;12885:32;12882:52;;;12930:1;12927;12920:12;12882:52;12970:9;12957:23;13003:18;12995:6;12992:30;12989:50;;;13035:1;13032;13025:12;12989:50;13058:22;;13111:4;13103:13;;13099:27;-1:-1:-1;13089:55:1;;13140:1;13137;13130:12;13089:55;13176:2;13163:16;13198:4;13222:60;13238:43;13278:2;13238:43;:::i;13222:60::-;13316:15;;;13398:1;13394:10;;;;13386:19;;13382:28;;;13347:12;;;;13422:19;;;13419:39;;;13454:1;13451;13444:12;13419:39;13478:11;;;;13498:148;13514:6;13509:3;13506:15;13498:148;;;13580:23;13599:3;13580:23;:::i;:::-;13568:36;;13531:12;;;;13624;;;;13498:148;;;13665:5;-1:-1:-1;13689:35:1;;-1:-1:-1;13705:18:1;;;13689:35;:::i;:::-;13679:45;;;;;12763:967;;;;;:::o;14266:260::-;14334:6;14342;14395:2;14383:9;14374:7;14370:23;14366:32;14363:52;;;14411:1;14408;14401:12;14363:52;14434:29;14453:9;14434:29;:::i;:::-;14424:39;;14482:38;14516:2;14505:9;14501:18;14482:38;:::i;15632:584::-;15722:6;15730;15738;15746;15754;15807:3;15795:9;15786:7;15782:23;15778:33;15775:53;;;15824:1;15821;15814:12;15775:53;15863:9;15850:23;15882:29;15905:5;15882:29;:::i;:::-;15930:5;-1:-1:-1;15982:2:1;15967:18;;15954:32;;-1:-1:-1;16033:2:1;16018:18;;16005:32;;-1:-1:-1;16084:2:1;16069:18;;16056:32;;-1:-1:-1;16140:3:1;16125:19;;16112:33;16154:30;16112:33;16154:30;:::i;:::-;16203:7;16193:17;;;15632:584;;;;;;;;:::o;16221:337::-;16423:2;16405:21;;;16462:2;16442:18;;;16435:30;-1:-1:-1;;;16496:2:1;16481:18;;16474:43;16549:2;16534:18;;16221:337::o;16563:127::-;16624:10;16619:3;16615:20;16612:1;16605:31;16655:4;16652:1;16645:15;16679:4;16676:1;16669:15;16695:344;16897:2;16879:21;;;16936:2;16916:18;;;16909:30;-1:-1:-1;;;16970:2:1;16955:18;;16948:50;17030:2;17015:18;;16695:344::o;17044:::-;17246:2;17228:21;;;17285:2;17265:18;;;17258:30;-1:-1:-1;;;17319:2:1;17304:18;;17297:50;17379:2;17364:18;;17044:344::o;17393:338::-;17595:2;17577:21;;;17634:2;17614:18;;;17607:30;-1:-1:-1;;;17668:2:1;17653:18;;17646:44;17722:2;17707:18;;17393:338::o;17736:127::-;17797:10;17792:3;17788:20;17785:1;17778:31;17828:4;17825:1;17818:15;17852:4;17849:1;17842:15;17868:128;17935:9;;;17956:11;;;17953:37;;;17970:18;;:::i;18001:348::-;18203:2;18185:21;;;18242:2;18222:18;;;18215:30;18281:26;18276:2;18261:18;;18254:54;18340:2;18325:18;;18001:348::o;18354:342::-;18556:2;18538:21;;;18595:2;18575:18;;;18568:30;-1:-1:-1;;;18629:2:1;18614:18;;18607:48;18687:2;18672:18;;18354:342::o;18701:343::-;18903:2;18885:21;;;18942:2;18922:18;;;18915:30;-1:-1:-1;;;18976:2:1;18961:18;;18954:49;19035:2;19020:18;;18701:343::o;19049:168::-;19122:9;;;19153;;19170:15;;;19164:22;;19150:37;19140:71;;19191:18;;:::i;19222:127::-;19283:10;19278:3;19274:20;19271:1;19264:31;19314:4;19311:1;19304:15;19338:4;19335:1;19328:15;19354:120;19394:1;19420;19410:35;;19425:18;;:::i;:::-;-1:-1:-1;19459:9:1;;19354:120::o;19479:125::-;19544:9;;;19565:10;;;19562:36;;;19578:18;;:::i;19609:342::-;19811:2;19793:21;;;19850:2;19830:18;;;19823:30;-1:-1:-1;;;19884:2:1;19869:18;;19862:48;19942:2;19927:18;;19609:342::o;20166:351::-;20368:2;20350:21;;;20407:2;20387:18;;;20380:30;20446:29;20441:2;20426:18;;20419:57;20508:2;20493:18;;20166:351::o;21216:247::-;21284:6;21337:2;21325:9;21316:7;21312:23;21308:32;21305:52;;;21353:1;21350;21343:12;21305:52;21385:9;21379:16;21404:29;21427:5;21404:29;:::i;21468:338::-;21670:2;21652:21;;;21709:2;21689:18;;;21682:30;-1:-1:-1;;;21743:2:1;21728:18;;21721:44;21797:2;21782:18;;21468:338::o;22507:344::-;22709:2;22691:21;;;22748:2;22728:18;;;22721:30;-1:-1:-1;;;22782:2:1;22767:18;;22760:50;22842:2;22827:18;;22507:344::o;22856:343::-;23058:2;23040:21;;;23097:2;23077:18;;;23070:30;-1:-1:-1;;;23131:2:1;23116:18;;23109:49;23190:2;23175:18;;22856:343::o;29143:745::-;29355:2;29367:21;;;29437:13;;29340:18;;;29459:22;;;29307:4;;29534;;29512:2;29497:18;;;29561:17;;;29307:4;29606:195;29620:6;29617:1;29614:13;29606:195;;;29685:13;;-1:-1:-1;;;;;29681:39:1;29669:52;;29741:12;;;;29776:15;;;;29717:1;29635:9;29606:195;;;29610:3;;;29818;29810:11;;;;29873:6;29866:14;29859:22;29852:4;29841:9;29837:20;29830:52;29143:745;;;;;:::o;30583:184::-;30653:6;30706:2;30694:9;30685:7;30681:23;30677:32;30674:52;;;30722:1;30719;30712:12;30674:52;-1:-1:-1;30745:16:1;;30583:184;-1:-1:-1;30583:184:1:o;31409:176::-;31476:14;31510:10;;;31522;;;31506:27;;31545:11;;;31542:37;;;31559:18;;:::i;:::-;31542:37;31409:176;;;;:::o;34002:135::-;34041:3;34062:17;;;34059:43;;34082:18;;:::i;:::-;-1:-1:-1;34129:1:1;34118:13;;34002:135::o;34927:151::-;35017:4;35010:12;;;34996;;;34992:31;;35035:14;;35032:40;;;35052:18;;:::i;35083:416::-;35172:1;35209:5;35172:1;35223:270;35244:7;35234:8;35231:21;35223:270;;;35303:4;35299:1;35295:6;35291:17;35285:4;35282:27;35279:53;;;35312:18;;:::i;:::-;35362:7;35352:8;35348:22;35345:55;;;35382:16;;;;35345:55;35461:22;;;;35421:15;;;;35223:270;;;35227:3;35083:416;;;;;:::o;35504:806::-;35553:5;35583:8;35573:80;;-1:-1:-1;35624:1:1;35638:5;;35573:80;35672:4;35662:76;;-1:-1:-1;35709:1:1;35723:5;;35662:76;35754:4;35772:1;35767:59;;;;35840:1;35835:130;;;;35747:218;;35767:59;35797:1;35788:10;;35811:5;;;35835:130;35872:3;35862:8;35859:17;35856:43;;;35879:18;;:::i;:::-;-1:-1:-1;;35935:1:1;35921:16;;35950:5;;35747:218;;36049:2;36039:8;36036:16;36030:3;36024:4;36021:13;36017:36;36011:2;36001:8;35998:16;35993:2;35987:4;35984:12;35980:35;35977:77;35974:159;;;-1:-1:-1;36086:19:1;;;36118:5;;35974:159;36165:34;36190:8;36184:4;36165:34;:::i;:::-;36235:6;36231:1;36227:6;36223:19;36214:7;36211:32;36208:58;;;36246:18;;:::i;:::-;36284:20;;35504:806;-1:-1:-1;;;35504:806:1:o;36315:140::-;36373:5;36402:47;36443:4;36433:8;36429:19;36423:4;36402:47;:::i;36460:112::-;36492:1;36518;36508:35;;36523:18;;:::i;:::-;-1:-1:-1;36557:9:1;;36460:112::o;38095:347::-;38246:2;38231:18;;38279:1;38268:13;;38258:144;;38324:10;38319:3;38315:20;38312:1;38305:31;38359:4;38356:1;38349:15;38387:4;38384:1;38377:15;38258:144;38411:25;;;38095:347;:::o;38726:245::-;38793:6;38846:2;38834:9;38825:7;38821:23;38817:32;38814:52;;;38862:1;38859;38852:12;38814:52;38894:9;38888:16;38913:28;38935:5;38913:28;:::i;38976:412::-;39105:3;39143:6;39137:13;39168:1;39178:129;39192:6;39189:1;39186:13;39178:129;;;39290:4;39274:14;;;39270:25;;39264:32;39251:11;;;39244:53;39207:12;39178:129;;;-1:-1:-1;39362:1:1;39326:16;;39351:13;;;-1:-1:-1;39326:16:1;38976:412;-1:-1:-1;38976:412:1:o
Swarm Source
ipfs://2151861508fd2846a74e86692f9e392b0717cdde3d723dc52cfa016943613c21
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.