Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
BicoTokenImplementation
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-21 */ // Sources flattened with hardhat v2.6.5 https://hardhat.org // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // SPDX-License-Identifier: MIT pragma solidity 0.8.4; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } } // File @openzeppelin/contracts-upgradeable/security/[email protected] /** * @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 ReentrancyGuardUpgradeable is Initializable { // 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; function __ReentrancyGuard_init() internal initializer { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal initializer { _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 make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } uint256[49] private __gap; } // File @openzeppelin/contracts-upgradeable/access/[email protected] /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControlUpgradeable { /** * @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. * * _Available since v3.1._ */ 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 `account`. */ function renounceRole(bytes32 role, address account) external; } // File @openzeppelin/contracts-upgradeable/utils/[email protected] /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] /** * @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 IERC165Upgradeable { /** * @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); } // File @openzeppelin/contracts-upgradeable/utils/introspection/[email protected] /** * @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); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal initializer { __ERC165_init_unchained(); } function __ERC165_init_unchained() internal initializer { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } uint256[50] private __gap; } // File contracts/bico-token/bico/BicoTokenImplementation.sol pragma solidity 0.8.4; /** * @dev Context variant with ERC2771 support. */ abstract contract ERC2771ContextUpgradeable is Initializable { /* * Forwarder singleton we accept calls from */ address public _trustedForwarder; function __ERC2771Context_init(address trustedForwarder) internal initializer { __ERC2771Context_init_unchained(trustedForwarder); } function __ERC2771Context_init_unchained(address trustedForwarder) internal initializer { _trustedForwarder = trustedForwarder; } function isTrustedForwarder(address forwarder) public view virtual returns (bool) { return forwarder == _trustedForwarder; } function _msgSender() internal view virtual returns (address sender) { if (isTrustedForwarder(msg.sender)) { // The assembly code is more direct than the Solidity version using `abi.decode`. assembly { sender := shr(96, calldataload(sub(calldatasize(), 20))) } } else { return msg.sender; } } function _msgData() internal view virtual returns (bytes calldata) { if (isTrustedForwarder(msg.sender)) { return msg.data[:msg.data.length - 20]; } else { return msg.data; } } uint256[49] private __gap; } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal initializer { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal initializer { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "BICO:: Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "BICO:: Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(msg.sender); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(msg.sender); } uint256[49] private __gap; } /** * @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: * * ``` * 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}: * * ``` * 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. */ abstract contract AccessControlUpgradeable is Initializable, IAccessControlUpgradeable, ERC165Upgradeable { function __AccessControl_init() internal initializer { __ERC165_init(); __AccessControl_init_unchained(); } function __AccessControl_init_unchained() internal initializer { } struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, msg.sender); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "BICO:: AccessControl: account ", StringsUpgradeable.toHexString(uint160(account), 20), " is missing role ", StringsUpgradeable.toHexString(uint256(role), 32) ) ) ); } } /** * @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 override 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. */ function grantRole(bytes32 role, address account) public virtual override 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. */ function revokeRole(bytes32 role, address account) public virtual override 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 granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == msg.sender, "BICO:: AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @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); } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, msg.sender); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, msg.sender); } } uint256[49] private __gap; } /** * @title Biconomy Protocol Governance contract * @dev All contracts that will be owned by a Governor entity should extend this contract. */ contract GovernedUpgradeable is Initializable { // -- State -- address public governor; address public pendingGovernor; // -- Events -- event NewPendingOwnership(address indexed from, address indexed to); event NewOwnership(address indexed from, address indexed to); /** * @dev Check if the caller is the governor. */ modifier onlyGovernor { require(msg.sender == governor, "BICO:: Only Governor can call"); _; } /** * @dev Initialize the governor to the contract caller. */ function __Governed_init(address _initGovernor) internal initializer { __Governed_init_unchained(_initGovernor); } function __Governed_init_unchained(address _initGovernor) internal initializer { governor = _initGovernor; } /** * @dev Admin function to begin change of governor. The `_newGovernor` must call * `acceptOwnership` to finalize the transfer. * @param _newGovernor Address of new `governor` */ function transferOwnership(address _newGovernor) external onlyGovernor { require(_newGovernor != address(0), "BICO:: Governor must be set"); address oldPendingGovernor = pendingGovernor; pendingGovernor = _newGovernor; emit NewPendingOwnership(oldPendingGovernor, pendingGovernor); } /** * @dev Admin function for pending governor to accept role and update governor. * This function must called by the pending governor. */ function acceptOwnership() external { require( pendingGovernor != address(0) && msg.sender == pendingGovernor, "Caller must be pending governor" ); address oldGovernor = governor; address oldPendingGovernor = pendingGovernor; governor = pendingGovernor; pendingGovernor = address(0); emit NewOwnership(oldGovernor, governor); emit NewPendingOwnership(oldPendingGovernor, pendingGovernor); } uint256[49] private __gap; } /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length if (signature.length != 65) { revert("BICO:: ECDSA: invalid signature length"); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "BICO:: ECDSA: invalid signature 's' value"); require(v == 27 || v == 28, "BICO:: ECDSA: invalid signature 'v' value"); // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "BICO:: ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * replicates the behavior of the * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`] * JSON-RPC method. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } } contract BicoTokenImplementation is Initializable, ERC2771ContextUpgradeable, PausableUpgradeable, AccessControlUpgradeable, GovernedUpgradeable, ReentrancyGuardUpgradeable { // -- State ERC20-- mapping(address => uint256) private _balances; uint8 internal _initializedVersion; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; // -- State Access Control custom roles-- bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); /// @notice The timestamp after which minting may occur uint public mintingAllowedAfter; /// @notice Minimum time between mints uint32 public minimumTimeBetweenMints; /// @notice Cap on the percentage of totalSupply that can be minted at each mint uint8 public mintCap; // -- State Gas abstraction methods-- /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPE_HASH = keccak256( "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)" ); bytes32 public constant APPROVE_TYPEHASH = keccak256( "Approve(address owner,address spender,uint256 value,uint256 batchId,uint256 batchNonce,uint256 deadline)" ); bytes32 public constant TRANSFER_TYPEHASH = keccak256( "Transfer(address sender,address recipient,uint256 amount,uint256 batchId,uint256 batchNonce,uint256 deadline)" ); bytes32 private DOMAIN_SEPARATOR; /// @notice A record of states for signing / validating signatures mapping(address => mapping(uint256 => uint256)) public nonces; // -- Events-- /** * @dev Emitted when trusted forwarder is updated to * another (`trustedForwarder`). * * Note that `trustedForwarder` may be zero. `actor` is msg.sender for this action. */ event TrustedForwarderChanged(address indexed truestedForwarder, address indexed actor); /** * @dev Emitted when minting allowed after timestamp is changed through governance * * Note that `_mintingAllowedAfter` may be zero. `actor` is msg.sender for this action. */ event MintingAllowedAfterChanged(uint indexed _mintingAllowedAfter, address indexed actor); /** * @dev Emitted when minimum time between mints is changed through governance * * Note that `_minimumTimeBetweenMints` may be zero. `actor` is msg.sender for this action. */ event MinimumTimeBetweenMintsChanged(uint32 indexed _minimumTimeBetweenMints, address indexed actor); /** * @dev Emitted when mint cap is changed through governance * * Note that `_mintCap` may be zero. `actor` is msg.sender for this action. */ event MintCapChanged(uint8 indexed _mintCap, address indexed actor); /** * @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 Initializes the contract */ function initialize(address beneficiary, address trustedForwarder, address governor, address accessControlAdmin, address pauser, address minter) public initializer { __BicoTokenImplementation_init_unchained(accessControlAdmin,pauser,minter); _mint(beneficiary, 1000000000 * 10 ** decimals()); __ERC2771Context_init(trustedForwarder); __Pausable_init(); __AccessControl_init(); __Governed_init(governor); __ReentrancyGuard_init(); _initializedVersion = 0; mintingAllowedAfter = 0; minimumTimeBetweenMints = 1 days * 365; mintCap = 2; } function __BicoTokenImplementation_init_unchained(address accessControlAdmin, address pauser, address minter) internal initializer { _name = "Biconomy Token"; _symbol = "BICO"; _setupRole(DEFAULT_ADMIN_ROLE, accessControlAdmin); _setupRole(PAUSER_ROLE, pauser); _setupRole(MINTER_ROLE, minter); // EIP-712 domain separator DOMAIN_SEPARATOR = keccak256( abi.encode( DOMAIN_TYPE_HASH, keccak256("Biconomy Token"), keccak256("1"), address(this), bytes32(getChainId()) ) ); } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual nonReentrant whenNotPaused returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual nonReentrant whenNotPaused returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual nonReentrant whenNotPaused returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "BICO:: ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual nonReentrant whenNotPaused returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual nonReentrant whenNotPaused returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "BICO:: ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "BICO:: ERC20: transfer from the zero address"); require(recipient != address(0), "BICO:: ERC20: transfer to the zero address"); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "BICO:: ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "BICO:: ERC20: mint to the zero address"); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); } //there is no public burn() method in V0 /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "BICO:: ERC20: burn from the zero address"); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "BICO:: ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "BICO:: ERC20: approve from the zero address"); require(spender != address(0), "BICO:: ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Increments the nonce of given user/batch pair * @dev Updates the highestBatchId of the given user if the request's batchId > current highest * @dev only intended to be called post call execution * @param _user : owner or sender address * @param _batchId : batch Id */ function _updateNonce(address _user, uint256 _batchId) internal { nonces[_user][_batchId]++; } /** * @dev Approve token allowance by validating a message signed by the holder. * @param _owner Address of the token holder * @param _spender Address of the approved spender * @param _value Amount of tokens to approve the spender * @param _batchId Batch Id. pass this 0 if batching is not needed. * @param _deadline Expiration time of the signed approval * @param _v Signature version * @param _r Signature r value * @param _s Signature s value */ function approveWithSig( uint8 _v, bytes32 _r, bytes32 _s, uint256 _deadline, address _owner, uint256 _batchId, address _spender, uint256 _value ) public virtual nonReentrant whenNotPaused { bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256( abi.encode( APPROVE_TYPEHASH, _owner, _spender, _value, _batchId, nonces[_owner][_batchId], _deadline ) ) ) ); address recoveredAddress = ECDSA.recover(digest, abi.encodePacked(_r, _s, _v)); require(recoveredAddress != address(0), "BICO:: invalid signature"); require(_owner == recoveredAddress, "BICO:: invalid approval:Unauthorized"); require(_deadline == 0 || block.timestamp <= _deadline, "BICO:: expired approval"); _updateNonce(_owner,_batchId); _approve(_owner, _spender, _value); } /** * @dev Transfer tokens by validating a message signed by the sender. * @param _sender Address of the token sender * @param _recipient Address of the token recipient * @param _amount Amount of tokens to transfer * @param _batchId Batch Id. pass this 0 if batching is not needed. * @param _deadline Expiration time of the signed approval * @param _v Signature version * @param _r Signature r value * @param _s Signature s value */ function transferWithSig( uint8 _v, bytes32 _r, bytes32 _s, uint256 _deadline, address _sender, uint256 _batchId, address _recipient, uint256 _amount ) public virtual nonReentrant whenNotPaused { bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256( abi.encode( TRANSFER_TYPEHASH, _sender, _recipient, _amount, _batchId, nonces[_sender][_batchId], _deadline ) ) ) ); address recoveredAddress = ECDSA.recover(digest, abi.encodePacked(_r, _s, _v)); require(recoveredAddress != address(0), "BICO:: invalid signature"); require(_sender == recoveredAddress, "BICO:: invalid transfer:Unauthorized"); require(_deadline == 0 || block.timestamp <= _deadline, "BICO:: expired transfer"); _updateNonce(_sender,_batchId); _transfer(_sender, _recipient, _amount); } function pause() public onlyRole(PAUSER_ROLE) { _pause(); } function unpause() public onlyRole(PAUSER_ROLE) { _unpause(); } function setTrustedForwarder(address payable _forwarder) external onlyGovernor { require(_forwarder != address(0), "BICO:: Invalid address for new trusted forwarder"); _trustedForwarder = _forwarder; emit TrustedForwarderChanged(_forwarder, msg.sender); } function setMintingAllowedAfter(uint _mintingAllowedAfter) external onlyGovernor { mintingAllowedAfter = _mintingAllowedAfter; emit MintingAllowedAfterChanged(_mintingAllowedAfter,msg.sender); } function setMinimumTimeBetweenMints(uint32 _minimumTimeBetweenMints) external onlyGovernor { minimumTimeBetweenMints = _minimumTimeBetweenMints; emit MinimumTimeBetweenMintsChanged(_minimumTimeBetweenMints,msg.sender); } function setMintCap(uint8 _mintCap) external onlyGovernor { mintCap = _mintCap; emit MintCapChanged(_mintCap, msg.sender); } function getChainId() internal view returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"_minimumTimeBetweenMints","type":"uint32"},{"indexed":true,"internalType":"address","name":"actor","type":"address"}],"name":"MinimumTimeBetweenMintsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"_mintCap","type":"uint8"},{"indexed":true,"internalType":"address","name":"actor","type":"address"}],"name":"MintCapChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_mintingAllowedAfter","type":"uint256"},{"indexed":true,"internalType":"address","name":"actor","type":"address"}],"name":"MintingAllowedAfterChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"NewOwnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"NewPendingOwnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"truestedForwarder","type":"address"},{"indexed":true,"internalType":"address","name":"actor","type":"address"}],"name":"TrustedForwarderChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"APPROVE_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPE_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_trustedForwarder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_batchId","type":"uint256"},{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approveWithSig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"address","name":"trustedForwarder","type":"address"},{"internalType":"address","name":"governor","type":"address"},{"internalType":"address","name":"accessControlAdmin","type":"address"},{"internalType":"address","name":"pauser","type":"address"},{"internalType":"address","name":"minter","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTimeBetweenMints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCap","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingAllowedAfter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingGovernor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","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":"uint32","name":"_minimumTimeBetweenMints","type":"uint32"}],"name":"setMinimumTimeBetweenMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintCap","type":"uint8"}],"name":"setMintCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintingAllowedAfter","type":"uint256"}],"name":"setMintingAllowedAfter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_forwarder","type":"address"}],"name":"setTrustedForwarder","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newGovernor","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"address","name":"_sender","type":"address"},{"internalType":"uint256","name":"_batchId","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferWithSig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50612e9c806100206000396000f3fe608060405234801561001057600080fd5b50600436106102685760003560e01c806376c71ca111610151578063c9f10f8c116100c3578063da74222811610087578063da742228146105dc578063dd62ed3e146105ef578063e3056a3414610629578063e63ab1e91461063c578063f2fde38b14610651578063f4bd65bd1461066457600080fd5b8063c9f10f8c14610555578063cc2a9a5b1461057c578063d2d2070a1461058f578063d5391393146105a2578063d547741f146105c957600080fd5b8063a217fddf11610115578063a217fddf146104da578063a457c2d7146104e2578063a8d0e88b146104f5578063a9059cbb14610508578063b9635d371461051b578063c0993eea1461052e57600080fd5b806376c71ca11461049957806379ba5097146104af5780638456cb59146104b757806391d14854146104bf57806395d89b41146104d257600080fd5b8063313ce567116101ea57806356c022bb116101ae57806356c022bb146103ea578063572b6c05146104035780635c11d62f1461042b5780635c975abb146104515780636372399d1461045c57806370a082311461046f57600080fd5b8063313ce5671461037b57806336568abe1461039057806339509351146103a35780633f4ba83a146103b6578063502e1a16146103be57600080fd5b806318160ddd1161023157806318160ddd1461031d57806323b872dd14610326578063248a9ca3146103395780632f2ff15d1461035c57806330b36cef1461037157600080fd5b8062bf26f41461026d57806301ffc9a7146102a757806306fdde03146102ca578063095ea7b3146102df5780630c340a24146102f2575b600080fd5b6102947f686fbd6610c8f2133a627d2140507a1a8a8d2442934fd36a02a684ab8eb5401a81565b6040519081526020015b60405180910390f35b6102ba6102b53660046129a7565b610677565b604051901515815260200161029e565b6102d26106ae565b60405161029e9190612b37565b6102ba6102ed366004612940565b610741565b60c854610305906001600160a01b031681565b6040516001600160a01b03909116815260200161029e565b61013054610294565b6102ba610334366004612900565b6107b6565b61029461034736600461296b565b60009081526096602052604090206001015490565b61036f61036a366004612983565b6108e0565b005b6102946101335481565b60125b60405160ff909116815260200161029e565b61036f61039e366004612983565b61090b565b6102ba6103b1366004612940565b610990565b61036f610a30565b6102946103cc366004612940565b61013660209081526000928352604080842090915290825290205481565b600054610305906201000090046001600160a01b031681565b6102ba61041136600461282b565b6000546201000090046001600160a01b0390811691161490565b6101345461043c9063ffffffff1681565b60405163ffffffff909116815260200161029e565b60325460ff166102ba565b61036f61046a3660046129cf565b610a54565b61029461047d36600461282b565b6001600160a01b0316600090815261012d602052604090205490565b6101345461037e90640100000000900460ff1681565b61036f610ac6565b61036f610bd1565b6102ba6104cd366004612983565b610bf2565b6102d2610c1d565b610294600081565b6102ba6104f0366004612940565b610c2d565b61036f610503366004612a0d565b610d3e565b6102ba610516366004612940565b610fc6565b61036f610529366004612a0d565b611025565b6102947f36c25de3e541d5d970f66e4210d728721220fff5c077cc6cd008b3a0c62adab781565b6102947f3035db5a0c9fdeb4c85f3f85d64ed8a35f941ad181dbab9095decaca728a60cc81565b61036f61058a36600461287f565b61128c565b61036f61059d3660046129f3565b61137d565b6102947f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61036f6105d7366004612983565b6113f7565b61036f6105ea36600461282b565b61141d565b6102946105fd366004612847565b6001600160a01b03918216600090815261012f6020908152604080832093909416825291909152205490565b60c954610305906001600160a01b031681565b610294600080516020612e4783398151915281565b61036f61065f36600461282b565b611508565b61036f61067236600461296b565b6115da565b60006001600160e01b03198216637965db0b60e01b14806106a857506301ffc9a760e01b6001600160e01b03198316145b92915050565b606061013180546106be90612dc5565b80601f01602080910402602001604051908101604052809291908181526020018280546106ea90612dc5565b80156107375780601f1061070c57610100808354040283529160200191610737565b820191906000526020600020905b81548152906001019060200180831161071a57829003601f168201915b5050505050905090565b6000600260fb54141561076f5760405162461bcd60e51b815260040161076690612c26565b60405180910390fd5b600260fb5560325460ff16156107975760405162461bcd60e51b815260040161076690612bef565b6107a96107a261163a565b8484611666565b5060018060fb5592915050565b6000600260fb5414156107db5760405162461bcd60e51b815260040161076690612c26565b600260fb5560325460ff16156108035760405162461bcd60e51b815260040161076690612bef565b61080e84848461179a565b6001600160a01b038416600090815261012f602052604081208161083061163a565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828110156108bb5760405162461bcd60e51b815260206004820152602f60248201527f4249434f3a3a2045524332303a207472616e7366657220616d6f756e7420657860448201526e636565647320616c6c6f77616e636560881b6064820152608401610766565b6108cf856108c761163a565b858403611666565b6001915050600160fb559392505050565b6000828152609660205260409020600101546108fc8133611980565b61090683836119e4565b505050565b6001600160a01b03811633146109825760405162461bcd60e51b815260206004820152603660248201527f4249434f3a3a20416363657373436f6e74726f6c3a2063616e206f6e6c79207260448201527532b737bab731b2903937b632b9903337b91039b2b63360511b6064820152608401610766565b61098c8282611a4d565b5050565b6000600260fb5414156109b55760405162461bcd60e51b815260040161076690612c26565b600260fb5560325460ff16156109dd5760405162461bcd60e51b815260040161076690612bef565b6107a96109e861163a565b848461012f60006109f761163a565b6001600160a01b03908116825260208083019390935260409182016000908120918b1681529252902054610a2b9190612c5d565b611666565b600080516020612e47833981519152610a498133611980565b610a51611ab4565b50565b60c8546001600160a01b03163314610a7e5760405162461bcd60e51b815260040161076690612b6a565b610134805463ffffffff191663ffffffff83169081179091556040513391907fbc4a72fc9ac7b731b2d14d91ff68e54934c20a25706e38b3ea33a5bb04da37d490600090a350565b60c9546001600160a01b031615801590610aea575060c9546001600160a01b031633145b610b365760405162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206d7573742062652070656e64696e6720676f7665726e6f72006044820152606401610766565b60c8805460c980546001600160a01b03198084166001600160a01b0383811691821790965591169091556040519290911691819083907f0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f90600090a360c9546040516001600160a01b03918216918316907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b600080516020612e47833981519152610bea8133611980565b610a51611b46565b60009182526096602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606061013280546106be90612dc5565b6000600260fb541415610c525760405162461bcd60e51b815260040161076690612c26565b600260fb5560325460ff1615610c7a5760405162461bcd60e51b815260040161076690612bef565b600061012f6000610c8961163a565b6001600160a01b0390811682526020808301939093526040918201600090812091881681529252902054905082811015610d1a5760405162461bcd60e51b815260206004820152602c60248201527f4249434f3a3a2045524332303a2064656372656173656420616c6c6f77616e6360448201526b652062656c6f77207a65726f60a01b6064820152608401610766565b610d2e610d2561163a565b85858403611666565b6001915050600160fb5592915050565b600260fb541415610d615760405162461bcd60e51b815260040161076690612c26565b600260fb5560325460ff1615610d895760405162461bcd60e51b815260040161076690612bef565b610135546001600160a01b0385166000908152610136602090815260408083208784528252808320549051929392610def927f3035db5a0c9fdeb4c85f3f85d64ed8a35f941ad181dbab9095decaca728a60cc928a92899289928c9290918f9101612afb565b60405160208183030381529060405280519060200120604051602001610e2c92919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201209083018b90529082018990526001600160f81b031960f88c901b1660608301529150600090610e879083906061015b604051602081830303815290604052611ba6565b90506001600160a01b038116610eda5760405162461bcd60e51b81526020600482015260186024820152774249434f3a3a20696e76616c6964207369676e617475726560401b6044820152606401610766565b806001600160a01b0316866001600160a01b031614610f475760405162461bcd60e51b8152602060048201526024808201527f4249434f3a3a20696e76616c696420617070726f76616c3a556e617574686f726044820152631a5e995960e21b6064820152608401610766565b861580610f545750864211155b610fa05760405162461bcd60e51b815260206004820152601760248201527f4249434f3a3a206578706972656420617070726f76616c0000000000000000006044820152606401610766565b610faa8686611dd0565b610fb5868585611666565b5050600160fb555050505050505050565b6000600260fb541415610feb5760405162461bcd60e51b815260040161076690612c26565b600260fb5560325460ff16156110135760405162461bcd60e51b815260040161076690612bef565b6107a961101e61163a565b848461179a565b600260fb5414156110485760405162461bcd60e51b815260040161076690612c26565b600260fb5560325460ff16156110705760405162461bcd60e51b815260040161076690612bef565b610135546001600160a01b03851660009081526101366020908152604080832087845282528083205490519293926110d6927f686fbd6610c8f2133a627d2140507a1a8a8d2442934fd36a02a684ab8eb5401a928a92899289928c9290918f9101612afb565b6040516020818303038152906040528051906020012060405160200161111392919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201209083018b90529082018990526001600160f81b031960f88c901b166060830152915060009061115e908390606101610e73565b90506001600160a01b0381166111b15760405162461bcd60e51b81526020600482015260186024820152774249434f3a3a20696e76616c6964207369676e617475726560401b6044820152606401610766565b806001600160a01b0316866001600160a01b03161461121e5760405162461bcd60e51b8152602060048201526024808201527f4249434f3a3a20696e76616c6964207472616e736665723a556e617574686f726044820152631a5e995960e21b6064820152608401610766565b86158061122b5750864211155b6112775760405162461bcd60e51b815260206004820152601760248201527f4249434f3a3a2065787069726564207472616e736665720000000000000000006044820152606401610766565b6112818686611dd0565b610fb586858561179a565b600054610100900460ff16806112a5575060005460ff16155b6112c15760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff161580156112e3576000805461ffff19166101011790555b6112ee848484611e09565b611311876112fe6012600a612cb8565b61130c90633b9aca00612d63565b611fcd565b61131a866120bd565b611322612132565b61132a6121a5565b6113338561220c565b61133b61226c565b61012e805460ff19169055600061013355610134805464ffffffffff1916640201e133801790558015611374576000805461ff00191690555b50505050505050565b60c8546001600160a01b031633146113a75760405162461bcd60e51b815260040161076690612b6a565b610134805464ff00000000191664010000000060ff8416908102919091179091556040513391907f2c18dfa6258a96d94c959cf87037bcf6710f8a88d7666c0cedfe335c2011623790600090a350565b6000828152609660205260409020600101546114138133611980565b6109068383611a4d565b60c8546001600160a01b031633146114475760405162461bcd60e51b815260040161076690612b6a565b6001600160a01b0381166114b65760405162461bcd60e51b815260206004820152603060248201527f4249434f3a3a20496e76616c6964206164647265737320666f72206e6577207460448201526f393ab9ba32b2103337b93bb0b93232b960811b6064820152608401610766565b6000805462010000600160b01b031916620100006001600160a01b03841690810291909117825560405133927f06dff7401eb7fb04d241246ade7f817c7ad512b1bed61c18aedd9bc51eec047591a350565b60c8546001600160a01b031633146115325760405162461bcd60e51b815260040161076690612b6a565b6001600160a01b0381166115885760405162461bcd60e51b815260206004820152601b60248201527f4249434f3a3a20476f7665726e6f72206d7573742062652073657400000000006044820152606401610766565b60c980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b60c8546001600160a01b031633146116045760405162461bcd60e51b815260040161076690612b6a565b610133819055604051339082907f71a6143544734267d7d0727a2879043d35a91d59d9d7b7ea47a8b71335aba31290600090a350565b600080546201000090046001600160a01b0316331415611661575060131936013560601c90565b503390565b6001600160a01b0383166116d05760405162461bcd60e51b815260206004820152602b60248201527f4249434f3a3a2045524332303a20617070726f76652066726f6d20746865207a60448201526a65726f206164647265737360a81b6064820152608401610766565b6001600160a01b0382166117385760405162461bcd60e51b815260206004820152602960248201527f4249434f3a3a2045524332303a20617070726f766520746f20746865207a65726044820152686f206164647265737360b81b6064820152608401610766565b6001600160a01b03838116600081815261012f602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166118055760405162461bcd60e51b815260206004820152602c60248201527f4249434f3a3a2045524332303a207472616e736665722066726f6d207468652060448201526b7a65726f206164647265737360a01b6064820152608401610766565b6001600160a01b03821661186e5760405162461bcd60e51b815260206004820152602a60248201527f4249434f3a3a2045524332303a207472616e7366657220746f20746865207a65604482015269726f206164647265737360b01b6064820152608401610766565b6001600160a01b038316600090815261012d6020526040902054818110156118ee5760405162461bcd60e51b815260206004820152602d60248201527f4249434f3a3a2045524332303a207472616e7366657220616d6f756e7420657860448201526c63656564732062616c616e636560981b6064820152608401610766565b6001600160a01b03808516600090815261012d6020526040808220858503905591851681529081208054849290611926908490612c5d565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161197291815260200190565b60405180910390a350505050565b61198a8282610bf2565b61098c576119a2816001600160a01b031660146122cb565b6119ad8360206122cb565b6040516020016119be929190612a86565b60408051601f198184030181529082905262461bcd60e51b825261076691600401612b37565b6119ee8282610bf2565b61098c5760008281526096602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b611a578282610bf2565b1561098c5760008281526096602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60325460ff16611b065760405162461bcd60e51b815260206004820152601b60248201527f4249434f3a3a205061757361626c653a206e6f742070617573656400000000006044820152606401610766565b6032805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b60325460ff1615611b695760405162461bcd60e51b815260040161076690612bef565b6032805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001611b3c565b60008151604114611c085760405162461bcd60e51b815260206004820152602660248201527f4249434f3a3a2045434453413a20696e76616c6964207369676e6174757265206044820152650d8cadccee8d60d31b6064820152608401610766565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115611c9c5760405162461bcd60e51b815260206004820152602960248201527f4249434f3a3a2045434453413a20696e76616c6964207369676e6174757265206044820152682773272076616c756560b81b6064820152608401610766565b8060ff16601b1480611cb157508060ff16601c145b611d0f5760405162461bcd60e51b815260206004820152602960248201527f4249434f3a3a2045434453413a20696e76616c6964207369676e6174757265206044820152682776272076616c756560b81b6064820152608401610766565b6040805160008082526020820180845289905260ff841692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015611d63573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611dc65760405162461bcd60e51b815260206004820152601f60248201527f4249434f3a3a2045434453413a20696e76616c6964207369676e6174757265006044820152606401610766565b9695505050505050565b6001600160a01b0382166000908152610136602090815260408083208484529091528120805491611e0083612e00565b91905055505050565b600054610100900460ff1680611e22575060005460ff16155b611e3e5760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff16158015611e60576000805461ffff19166101011790555b60408051808201909152600e8082526d2134b1b7b737b6bc902a37b5b2b760911b6020909201918252611e96916101319161277c565b50604080518082019091526004808252634249434f60e01b6020909201918252611ec3916101329161277c565b50611ecf6000856124b4565b611ee7600080516020612e47833981519152846124b4565b611f117f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6836124b4565b604080517f36c25de3e541d5d970f66e4210d728721220fff5c077cc6cd008b3a0c62adab76020808301919091527f9131923bbe9ab80c6f2b845689f72dd4791586a685e0cb221d9bf13be72d2f36828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301523060808301524660a0808401919091528351808403909101815260c09092019092528051910120610135558015611fc7576000805461ff00191690555b50505050565b6001600160a01b0382166120325760405162461bcd60e51b815260206004820152602660248201527f4249434f3a3a2045524332303a206d696e7420746f20746865207a65726f206160448201526564647265737360d01b6064820152608401610766565b8061013060008282546120459190612c5d565b90915550506001600160a01b038216600090815261012d602052604081208054839290612073908490612c5d565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600054610100900460ff16806120d6575060005460ff16155b6120f25760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff16158015612114576000805461ffff19166101011790555b61211d826124be565b801561098c576000805461ff00191690555050565b600054610100900460ff168061214b575060005460ff16155b6121675760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff16158015612189576000805461ffff19166101011790555b61219161254c565b8015610a51576000805461ff001916905550565b600054610100900460ff16806121be575060005460ff16155b6121da5760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff161580156121fc576000805461ffff19166101011790555b6122046125c1565b61219161261b565b600054610100900460ff1680612225575060005460ff16155b6122415760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff16158015612263576000805461ffff19166101011790555b61211d82612685565b600054610100900460ff1680612285575060005460ff16155b6122a15760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff161580156122c3576000805461ffff19166101011790555b61219161270c565b606060006122da836002612d63565b6122e5906002612c5d565b67ffffffffffffffff81111561230b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612335576020820181803683370190505b509050600360fc1b8160008151811061235e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061239b57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006123bf846002612d63565b6123ca906001612c5d565b90505b600181111561245e576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061240c57634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061243057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c9361245781612dae565b90506123cd565b5083156124ad5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610766565b9392505050565b61098c82826119e4565b600054610100900460ff16806124d7575060005460ff16155b6124f35760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff16158015612515576000805461ffff19166101011790555b6000805462010000600160b01b031916620100006001600160a01b03851602179055801561098c576000805461ff00191690555050565b600054610100900460ff1680612565575060005460ff16155b6125815760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff161580156125a3576000805461ffff19166101011790555b6032805460ff191690558015610a51576000805461ff001916905550565b600054610100900460ff16806125da575060005460ff16155b6125f65760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff16158015612204576000805461ffff19166101011790556121915b600054610100900460ff1680612634575060005460ff16155b6126505760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff16158015612191576000805461ffff19166101011790558015610a51576000805461ff001916905550565b600054610100900460ff168061269e575060005460ff16155b6126ba5760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff161580156126dc576000805461ffff19166101011790555b60c880546001600160a01b0319166001600160a01b038416179055801561098c576000805461ff00191690555050565b600054610100900460ff1680612725575060005460ff16155b6127415760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff16158015612763576000805461ffff19166101011790555b600160fb558015610a51576000805461ff001916905550565b82805461278890612dc5565b90600052602060002090601f0160209004810192826127aa57600085556127f0565b82601f106127c357805160ff19168380011785556127f0565b828001600101855582156127f0579182015b828111156127f05782518255916020019190600101906127d5565b506127fc929150612800565b5090565b5b808211156127fc5760008155600101612801565b803560ff8116811461282657600080fd5b919050565b60006020828403121561283c578081fd5b81356124ad81612e31565b60008060408385031215612859578081fd5b823561286481612e31565b9150602083013561287481612e31565b809150509250929050565b60008060008060008060c08789031215612897578182fd5b86356128a281612e31565b955060208701356128b281612e31565b945060408701356128c281612e31565b935060608701356128d281612e31565b925060808701356128e281612e31565b915060a08701356128f281612e31565b809150509295509295509295565b600080600060608486031215612914578283fd5b833561291f81612e31565b9250602084013561292f81612e31565b929592945050506040919091013590565b60008060408385031215612952578182fd5b823561295d81612e31565b946020939093013593505050565b60006020828403121561297c578081fd5b5035919050565b60008060408385031215612995578182fd5b82359150602083013561287481612e31565b6000602082840312156129b8578081fd5b81356001600160e01b0319811681146124ad578182fd5b6000602082840312156129e0578081fd5b813563ffffffff811681146124ad578182fd5b600060208284031215612a04578081fd5b6124ad82612815565b600080600080600080600080610100898b031215612a29578182fd5b612a3289612815565b97506020890135965060408901359550606089013594506080890135612a5781612e31565b935060a0890135925060c0890135612a6e81612e31565b8092505060e089013590509295985092959890939650565b7f4249434f3a3a20416363657373436f6e74726f6c3a206163636f756e74200000815260008351612abe81601e850160208801612d82565b7001034b99036b4b9b9b4b733903937b6329607d1b601e918401918201528351612aef81602f840160208801612d82565b01602f01949350505050565b9687526001600160a01b0395861660208801529390941660408601526060850191909152608084015260a083019190915260c082015260e00190565b6020815260008251806020840152612b56816040850160208701612d82565b601f01601f19169190910160400192915050565b6020808252601d908201527f4249434f3a3a204f6e6c7920476f7665726e6f722063616e2063616c6c000000604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526017908201527f4249434f3a3a205061757361626c653a20706175736564000000000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115612c7057612c70612e1b565b500190565b600181815b80851115612cb0578160001904821115612c9657612c96612e1b565b80851615612ca357918102915b93841c9390800290612c7a565b509250929050565b60006124ad60ff841683600082612cd1575060016106a8565b81612cde575060006106a8565b8160018114612cf45760028114612cfe57612d1a565b60019150506106a8565b60ff841115612d0f57612d0f612e1b565b50506001821b6106a8565b5060208310610133831016604e8410600b8410161715612d3d575081810a6106a8565b612d478383612c75565b8060001904821115612d5b57612d5b612e1b565b029392505050565b6000816000190483118215151615612d7d57612d7d612e1b565b500290565b60005b83811015612d9d578181015183820152602001612d85565b83811115611fc75750506000910152565b600081612dbd57612dbd612e1b565b506000190190565b600181811c90821680612dd957607f821691505b60208210811415612dfa57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612e1457612e14612e1b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610a5157600080fdfe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862aa264697066735822122010e8975a797cb9c8ae96213bba76d34f3df3973e3eba674ac12048bcea93acbd64736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102685760003560e01c806376c71ca111610151578063c9f10f8c116100c3578063da74222811610087578063da742228146105dc578063dd62ed3e146105ef578063e3056a3414610629578063e63ab1e91461063c578063f2fde38b14610651578063f4bd65bd1461066457600080fd5b8063c9f10f8c14610555578063cc2a9a5b1461057c578063d2d2070a1461058f578063d5391393146105a2578063d547741f146105c957600080fd5b8063a217fddf11610115578063a217fddf146104da578063a457c2d7146104e2578063a8d0e88b146104f5578063a9059cbb14610508578063b9635d371461051b578063c0993eea1461052e57600080fd5b806376c71ca11461049957806379ba5097146104af5780638456cb59146104b757806391d14854146104bf57806395d89b41146104d257600080fd5b8063313ce567116101ea57806356c022bb116101ae57806356c022bb146103ea578063572b6c05146104035780635c11d62f1461042b5780635c975abb146104515780636372399d1461045c57806370a082311461046f57600080fd5b8063313ce5671461037b57806336568abe1461039057806339509351146103a35780633f4ba83a146103b6578063502e1a16146103be57600080fd5b806318160ddd1161023157806318160ddd1461031d57806323b872dd14610326578063248a9ca3146103395780632f2ff15d1461035c57806330b36cef1461037157600080fd5b8062bf26f41461026d57806301ffc9a7146102a757806306fdde03146102ca578063095ea7b3146102df5780630c340a24146102f2575b600080fd5b6102947f686fbd6610c8f2133a627d2140507a1a8a8d2442934fd36a02a684ab8eb5401a81565b6040519081526020015b60405180910390f35b6102ba6102b53660046129a7565b610677565b604051901515815260200161029e565b6102d26106ae565b60405161029e9190612b37565b6102ba6102ed366004612940565b610741565b60c854610305906001600160a01b031681565b6040516001600160a01b03909116815260200161029e565b61013054610294565b6102ba610334366004612900565b6107b6565b61029461034736600461296b565b60009081526096602052604090206001015490565b61036f61036a366004612983565b6108e0565b005b6102946101335481565b60125b60405160ff909116815260200161029e565b61036f61039e366004612983565b61090b565b6102ba6103b1366004612940565b610990565b61036f610a30565b6102946103cc366004612940565b61013660209081526000928352604080842090915290825290205481565b600054610305906201000090046001600160a01b031681565b6102ba61041136600461282b565b6000546201000090046001600160a01b0390811691161490565b6101345461043c9063ffffffff1681565b60405163ffffffff909116815260200161029e565b60325460ff166102ba565b61036f61046a3660046129cf565b610a54565b61029461047d36600461282b565b6001600160a01b0316600090815261012d602052604090205490565b6101345461037e90640100000000900460ff1681565b61036f610ac6565b61036f610bd1565b6102ba6104cd366004612983565b610bf2565b6102d2610c1d565b610294600081565b6102ba6104f0366004612940565b610c2d565b61036f610503366004612a0d565b610d3e565b6102ba610516366004612940565b610fc6565b61036f610529366004612a0d565b611025565b6102947f36c25de3e541d5d970f66e4210d728721220fff5c077cc6cd008b3a0c62adab781565b6102947f3035db5a0c9fdeb4c85f3f85d64ed8a35f941ad181dbab9095decaca728a60cc81565b61036f61058a36600461287f565b61128c565b61036f61059d3660046129f3565b61137d565b6102947f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61036f6105d7366004612983565b6113f7565b61036f6105ea36600461282b565b61141d565b6102946105fd366004612847565b6001600160a01b03918216600090815261012f6020908152604080832093909416825291909152205490565b60c954610305906001600160a01b031681565b610294600080516020612e4783398151915281565b61036f61065f36600461282b565b611508565b61036f61067236600461296b565b6115da565b60006001600160e01b03198216637965db0b60e01b14806106a857506301ffc9a760e01b6001600160e01b03198316145b92915050565b606061013180546106be90612dc5565b80601f01602080910402602001604051908101604052809291908181526020018280546106ea90612dc5565b80156107375780601f1061070c57610100808354040283529160200191610737565b820191906000526020600020905b81548152906001019060200180831161071a57829003601f168201915b5050505050905090565b6000600260fb54141561076f5760405162461bcd60e51b815260040161076690612c26565b60405180910390fd5b600260fb5560325460ff16156107975760405162461bcd60e51b815260040161076690612bef565b6107a96107a261163a565b8484611666565b5060018060fb5592915050565b6000600260fb5414156107db5760405162461bcd60e51b815260040161076690612c26565b600260fb5560325460ff16156108035760405162461bcd60e51b815260040161076690612bef565b61080e84848461179a565b6001600160a01b038416600090815261012f602052604081208161083061163a565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828110156108bb5760405162461bcd60e51b815260206004820152602f60248201527f4249434f3a3a2045524332303a207472616e7366657220616d6f756e7420657860448201526e636565647320616c6c6f77616e636560881b6064820152608401610766565b6108cf856108c761163a565b858403611666565b6001915050600160fb559392505050565b6000828152609660205260409020600101546108fc8133611980565b61090683836119e4565b505050565b6001600160a01b03811633146109825760405162461bcd60e51b815260206004820152603660248201527f4249434f3a3a20416363657373436f6e74726f6c3a2063616e206f6e6c79207260448201527532b737bab731b2903937b632b9903337b91039b2b63360511b6064820152608401610766565b61098c8282611a4d565b5050565b6000600260fb5414156109b55760405162461bcd60e51b815260040161076690612c26565b600260fb5560325460ff16156109dd5760405162461bcd60e51b815260040161076690612bef565b6107a96109e861163a565b848461012f60006109f761163a565b6001600160a01b03908116825260208083019390935260409182016000908120918b1681529252902054610a2b9190612c5d565b611666565b600080516020612e47833981519152610a498133611980565b610a51611ab4565b50565b60c8546001600160a01b03163314610a7e5760405162461bcd60e51b815260040161076690612b6a565b610134805463ffffffff191663ffffffff83169081179091556040513391907fbc4a72fc9ac7b731b2d14d91ff68e54934c20a25706e38b3ea33a5bb04da37d490600090a350565b60c9546001600160a01b031615801590610aea575060c9546001600160a01b031633145b610b365760405162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206d7573742062652070656e64696e6720676f7665726e6f72006044820152606401610766565b60c8805460c980546001600160a01b03198084166001600160a01b0383811691821790965591169091556040519290911691819083907f0ac6deed30eef60090c749850e10f2fa469e3e25fec1d1bef2853003f6e6f18f90600090a360c9546040516001600160a01b03918216918316907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b600080516020612e47833981519152610bea8133611980565b610a51611b46565b60009182526096602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606061013280546106be90612dc5565b6000600260fb541415610c525760405162461bcd60e51b815260040161076690612c26565b600260fb5560325460ff1615610c7a5760405162461bcd60e51b815260040161076690612bef565b600061012f6000610c8961163a565b6001600160a01b0390811682526020808301939093526040918201600090812091881681529252902054905082811015610d1a5760405162461bcd60e51b815260206004820152602c60248201527f4249434f3a3a2045524332303a2064656372656173656420616c6c6f77616e6360448201526b652062656c6f77207a65726f60a01b6064820152608401610766565b610d2e610d2561163a565b85858403611666565b6001915050600160fb5592915050565b600260fb541415610d615760405162461bcd60e51b815260040161076690612c26565b600260fb5560325460ff1615610d895760405162461bcd60e51b815260040161076690612bef565b610135546001600160a01b0385166000908152610136602090815260408083208784528252808320549051929392610def927f3035db5a0c9fdeb4c85f3f85d64ed8a35f941ad181dbab9095decaca728a60cc928a92899289928c9290918f9101612afb565b60405160208183030381529060405280519060200120604051602001610e2c92919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201209083018b90529082018990526001600160f81b031960f88c901b1660608301529150600090610e879083906061015b604051602081830303815290604052611ba6565b90506001600160a01b038116610eda5760405162461bcd60e51b81526020600482015260186024820152774249434f3a3a20696e76616c6964207369676e617475726560401b6044820152606401610766565b806001600160a01b0316866001600160a01b031614610f475760405162461bcd60e51b8152602060048201526024808201527f4249434f3a3a20696e76616c696420617070726f76616c3a556e617574686f726044820152631a5e995960e21b6064820152608401610766565b861580610f545750864211155b610fa05760405162461bcd60e51b815260206004820152601760248201527f4249434f3a3a206578706972656420617070726f76616c0000000000000000006044820152606401610766565b610faa8686611dd0565b610fb5868585611666565b5050600160fb555050505050505050565b6000600260fb541415610feb5760405162461bcd60e51b815260040161076690612c26565b600260fb5560325460ff16156110135760405162461bcd60e51b815260040161076690612bef565b6107a961101e61163a565b848461179a565b600260fb5414156110485760405162461bcd60e51b815260040161076690612c26565b600260fb5560325460ff16156110705760405162461bcd60e51b815260040161076690612bef565b610135546001600160a01b03851660009081526101366020908152604080832087845282528083205490519293926110d6927f686fbd6610c8f2133a627d2140507a1a8a8d2442934fd36a02a684ab8eb5401a928a92899289928c9290918f9101612afb565b6040516020818303038152906040528051906020012060405160200161111392919061190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815282825280516020918201209083018b90529082018990526001600160f81b031960f88c901b166060830152915060009061115e908390606101610e73565b90506001600160a01b0381166111b15760405162461bcd60e51b81526020600482015260186024820152774249434f3a3a20696e76616c6964207369676e617475726560401b6044820152606401610766565b806001600160a01b0316866001600160a01b03161461121e5760405162461bcd60e51b8152602060048201526024808201527f4249434f3a3a20696e76616c6964207472616e736665723a556e617574686f726044820152631a5e995960e21b6064820152608401610766565b86158061122b5750864211155b6112775760405162461bcd60e51b815260206004820152601760248201527f4249434f3a3a2065787069726564207472616e736665720000000000000000006044820152606401610766565b6112818686611dd0565b610fb586858561179a565b600054610100900460ff16806112a5575060005460ff16155b6112c15760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff161580156112e3576000805461ffff19166101011790555b6112ee848484611e09565b611311876112fe6012600a612cb8565b61130c90633b9aca00612d63565b611fcd565b61131a866120bd565b611322612132565b61132a6121a5565b6113338561220c565b61133b61226c565b61012e805460ff19169055600061013355610134805464ffffffffff1916640201e133801790558015611374576000805461ff00191690555b50505050505050565b60c8546001600160a01b031633146113a75760405162461bcd60e51b815260040161076690612b6a565b610134805464ff00000000191664010000000060ff8416908102919091179091556040513391907f2c18dfa6258a96d94c959cf87037bcf6710f8a88d7666c0cedfe335c2011623790600090a350565b6000828152609660205260409020600101546114138133611980565b6109068383611a4d565b60c8546001600160a01b031633146114475760405162461bcd60e51b815260040161076690612b6a565b6001600160a01b0381166114b65760405162461bcd60e51b815260206004820152603060248201527f4249434f3a3a20496e76616c6964206164647265737320666f72206e6577207460448201526f393ab9ba32b2103337b93bb0b93232b960811b6064820152608401610766565b6000805462010000600160b01b031916620100006001600160a01b03841690810291909117825560405133927f06dff7401eb7fb04d241246ade7f817c7ad512b1bed61c18aedd9bc51eec047591a350565b60c8546001600160a01b031633146115325760405162461bcd60e51b815260040161076690612b6a565b6001600160a01b0381166115885760405162461bcd60e51b815260206004820152601b60248201527f4249434f3a3a20476f7665726e6f72206d7573742062652073657400000000006044820152606401610766565b60c980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f76563ad561b7036ae716b9b25cb521b21463240f104c97e12f25877f2235f33d90600090a35050565b60c8546001600160a01b031633146116045760405162461bcd60e51b815260040161076690612b6a565b610133819055604051339082907f71a6143544734267d7d0727a2879043d35a91d59d9d7b7ea47a8b71335aba31290600090a350565b600080546201000090046001600160a01b0316331415611661575060131936013560601c90565b503390565b6001600160a01b0383166116d05760405162461bcd60e51b815260206004820152602b60248201527f4249434f3a3a2045524332303a20617070726f76652066726f6d20746865207a60448201526a65726f206164647265737360a81b6064820152608401610766565b6001600160a01b0382166117385760405162461bcd60e51b815260206004820152602960248201527f4249434f3a3a2045524332303a20617070726f766520746f20746865207a65726044820152686f206164647265737360b81b6064820152608401610766565b6001600160a01b03838116600081815261012f602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166118055760405162461bcd60e51b815260206004820152602c60248201527f4249434f3a3a2045524332303a207472616e736665722066726f6d207468652060448201526b7a65726f206164647265737360a01b6064820152608401610766565b6001600160a01b03821661186e5760405162461bcd60e51b815260206004820152602a60248201527f4249434f3a3a2045524332303a207472616e7366657220746f20746865207a65604482015269726f206164647265737360b01b6064820152608401610766565b6001600160a01b038316600090815261012d6020526040902054818110156118ee5760405162461bcd60e51b815260206004820152602d60248201527f4249434f3a3a2045524332303a207472616e7366657220616d6f756e7420657860448201526c63656564732062616c616e636560981b6064820152608401610766565b6001600160a01b03808516600090815261012d6020526040808220858503905591851681529081208054849290611926908490612c5d565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161197291815260200190565b60405180910390a350505050565b61198a8282610bf2565b61098c576119a2816001600160a01b031660146122cb565b6119ad8360206122cb565b6040516020016119be929190612a86565b60408051601f198184030181529082905262461bcd60e51b825261076691600401612b37565b6119ee8282610bf2565b61098c5760008281526096602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b611a578282610bf2565b1561098c5760008281526096602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60325460ff16611b065760405162461bcd60e51b815260206004820152601b60248201527f4249434f3a3a205061757361626c653a206e6f742070617573656400000000006044820152606401610766565b6032805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b60325460ff1615611b695760405162461bcd60e51b815260040161076690612bef565b6032805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001611b3c565b60008151604114611c085760405162461bcd60e51b815260206004820152602660248201527f4249434f3a3a2045434453413a20696e76616c6964207369676e6174757265206044820152650d8cadccee8d60d31b6064820152608401610766565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115611c9c5760405162461bcd60e51b815260206004820152602960248201527f4249434f3a3a2045434453413a20696e76616c6964207369676e6174757265206044820152682773272076616c756560b81b6064820152608401610766565b8060ff16601b1480611cb157508060ff16601c145b611d0f5760405162461bcd60e51b815260206004820152602960248201527f4249434f3a3a2045434453413a20696e76616c6964207369676e6174757265206044820152682776272076616c756560b81b6064820152608401610766565b6040805160008082526020820180845289905260ff841692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015611d63573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611dc65760405162461bcd60e51b815260206004820152601f60248201527f4249434f3a3a2045434453413a20696e76616c6964207369676e6174757265006044820152606401610766565b9695505050505050565b6001600160a01b0382166000908152610136602090815260408083208484529091528120805491611e0083612e00565b91905055505050565b600054610100900460ff1680611e22575060005460ff16155b611e3e5760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff16158015611e60576000805461ffff19166101011790555b60408051808201909152600e8082526d2134b1b7b737b6bc902a37b5b2b760911b6020909201918252611e96916101319161277c565b50604080518082019091526004808252634249434f60e01b6020909201918252611ec3916101329161277c565b50611ecf6000856124b4565b611ee7600080516020612e47833981519152846124b4565b611f117f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6836124b4565b604080517f36c25de3e541d5d970f66e4210d728721220fff5c077cc6cd008b3a0c62adab76020808301919091527f9131923bbe9ab80c6f2b845689f72dd4791586a685e0cb221d9bf13be72d2f36828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301523060808301524660a0808401919091528351808403909101815260c09092019092528051910120610135558015611fc7576000805461ff00191690555b50505050565b6001600160a01b0382166120325760405162461bcd60e51b815260206004820152602660248201527f4249434f3a3a2045524332303a206d696e7420746f20746865207a65726f206160448201526564647265737360d01b6064820152608401610766565b8061013060008282546120459190612c5d565b90915550506001600160a01b038216600090815261012d602052604081208054839290612073908490612c5d565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600054610100900460ff16806120d6575060005460ff16155b6120f25760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff16158015612114576000805461ffff19166101011790555b61211d826124be565b801561098c576000805461ff00191690555050565b600054610100900460ff168061214b575060005460ff16155b6121675760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff16158015612189576000805461ffff19166101011790555b61219161254c565b8015610a51576000805461ff001916905550565b600054610100900460ff16806121be575060005460ff16155b6121da5760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff161580156121fc576000805461ffff19166101011790555b6122046125c1565b61219161261b565b600054610100900460ff1680612225575060005460ff16155b6122415760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff16158015612263576000805461ffff19166101011790555b61211d82612685565b600054610100900460ff1680612285575060005460ff16155b6122a15760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff161580156122c3576000805461ffff19166101011790555b61219161270c565b606060006122da836002612d63565b6122e5906002612c5d565b67ffffffffffffffff81111561230b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612335576020820181803683370190505b509050600360fc1b8160008151811061235e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061239b57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006123bf846002612d63565b6123ca906001612c5d565b90505b600181111561245e576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061240c57634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061243057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c9361245781612dae565b90506123cd565b5083156124ad5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610766565b9392505050565b61098c82826119e4565b600054610100900460ff16806124d7575060005460ff16155b6124f35760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff16158015612515576000805461ffff19166101011790555b6000805462010000600160b01b031916620100006001600160a01b03851602179055801561098c576000805461ff00191690555050565b600054610100900460ff1680612565575060005460ff16155b6125815760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff161580156125a3576000805461ffff19166101011790555b6032805460ff191690558015610a51576000805461ff001916905550565b600054610100900460ff16806125da575060005460ff16155b6125f65760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff16158015612204576000805461ffff19166101011790556121915b600054610100900460ff1680612634575060005460ff16155b6126505760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff16158015612191576000805461ffff19166101011790558015610a51576000805461ff001916905550565b600054610100900460ff168061269e575060005460ff16155b6126ba5760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff161580156126dc576000805461ffff19166101011790555b60c880546001600160a01b0319166001600160a01b038416179055801561098c576000805461ff00191690555050565b600054610100900460ff1680612725575060005460ff16155b6127415760405162461bcd60e51b815260040161076690612ba1565b600054610100900460ff16158015612763576000805461ffff19166101011790555b600160fb558015610a51576000805461ff001916905550565b82805461278890612dc5565b90600052602060002090601f0160209004810192826127aa57600085556127f0565b82601f106127c357805160ff19168380011785556127f0565b828001600101855582156127f0579182015b828111156127f05782518255916020019190600101906127d5565b506127fc929150612800565b5090565b5b808211156127fc5760008155600101612801565b803560ff8116811461282657600080fd5b919050565b60006020828403121561283c578081fd5b81356124ad81612e31565b60008060408385031215612859578081fd5b823561286481612e31565b9150602083013561287481612e31565b809150509250929050565b60008060008060008060c08789031215612897578182fd5b86356128a281612e31565b955060208701356128b281612e31565b945060408701356128c281612e31565b935060608701356128d281612e31565b925060808701356128e281612e31565b915060a08701356128f281612e31565b809150509295509295509295565b600080600060608486031215612914578283fd5b833561291f81612e31565b9250602084013561292f81612e31565b929592945050506040919091013590565b60008060408385031215612952578182fd5b823561295d81612e31565b946020939093013593505050565b60006020828403121561297c578081fd5b5035919050565b60008060408385031215612995578182fd5b82359150602083013561287481612e31565b6000602082840312156129b8578081fd5b81356001600160e01b0319811681146124ad578182fd5b6000602082840312156129e0578081fd5b813563ffffffff811681146124ad578182fd5b600060208284031215612a04578081fd5b6124ad82612815565b600080600080600080600080610100898b031215612a29578182fd5b612a3289612815565b97506020890135965060408901359550606089013594506080890135612a5781612e31565b935060a0890135925060c0890135612a6e81612e31565b8092505060e089013590509295985092959890939650565b7f4249434f3a3a20416363657373436f6e74726f6c3a206163636f756e74200000815260008351612abe81601e850160208801612d82565b7001034b99036b4b9b9b4b733903937b6329607d1b601e918401918201528351612aef81602f840160208801612d82565b01602f01949350505050565b9687526001600160a01b0395861660208801529390941660408601526060850191909152608084015260a083019190915260c082015260e00190565b6020815260008251806020840152612b56816040850160208701612d82565b601f01601f19169190910160400192915050565b6020808252601d908201527f4249434f3a3a204f6e6c7920476f7665726e6f722063616e2063616c6c000000604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526017908201527f4249434f3a3a205061757361626c653a20706175736564000000000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115612c7057612c70612e1b565b500190565b600181815b80851115612cb0578160001904821115612c9657612c96612e1b565b80851615612ca357918102915b93841c9390800290612c7a565b509250929050565b60006124ad60ff841683600082612cd1575060016106a8565b81612cde575060006106a8565b8160018114612cf45760028114612cfe57612d1a565b60019150506106a8565b60ff841115612d0f57612d0f612e1b565b50506001821b6106a8565b5060208310610133831016604e8410600b8410161715612d3d575081810a6106a8565b612d478383612c75565b8060001904821115612d5b57612d5b612e1b565b029392505050565b6000816000190483118215151615612d7d57612d7d612e1b565b500290565b60005b83811015612d9d578181015183820152602001612d85565b83811115611fc75750506000910152565b600081612dbd57612dbd612e1b565b506000190190565b600181811c90821680612dd957607f821691505b60208210811415612dfa57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612e1457612e14612e1b565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610a5157600080fdfe65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862aa264697066735822122010e8975a797cb9c8ae96213bba76d34f3df3973e3eba674ac12048bcea93acbd64736f6c63430008040033
Deployed Bytecode Sourcemap
29152:18447:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30568:182;;30612:138;30568:182;;;;;7312:25:1;;;7300:2;7285:18;30568:182:0;;;;;;;;18546:215;;;;;;:::i;:::-;;:::i;:::-;;;7139:14:1;;7132:22;7114:41;;7102:2;7087:18;18546:215:0;7069:92:1;34055:91:0;;;:::i;:::-;;;;;;;:::i;36188:187::-;;;;;;:::i;:::-;;:::i;23471:23::-;;;;;-1:-1:-1;;;;;23471:23:0;;;;;;-1:-1:-1;;;;;6930:32:1;;;6912:51;;6900:2;6885:18;23471:23:0;6867:102:1;35148:99:0;35227:12;;35148:99;;36857:523;;;;;;:::i;:::-;;:::i;19997:123::-;;;;;;:::i;:::-;20063:7;20090:12;;;:6;:12;;;;;:22;;;;19997:123;20382:147;;;;;;:::i;:::-;;:::i;:::-;;29873:31;;;;;;34999:84;35073:2;34999:84;;;20360:4:1;20348:17;;;20330:36;;20318:2;20303:18;34999:84:0;20285:87:1;21430:223:0;;;;;;:::i;:::-;;:::i;37789:242::-;;;;;;:::i;:::-;;:::i;46430:77::-;;;:::i;30868:61::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;12325:32;;;;;;;;-1:-1:-1;;;;;12325:32:0;;;12675:138;;;;;;:::i;:::-;12751:4;12788:17;;;;-1:-1:-1;;;;;12788:17:0;;;12775:30;;;;12675:138;29957:37;;;;;;;;;;;;20165:10:1;20153:23;;;20135:42;;20123:2;20108:18;29957:37:0;20090:93:1;14647:86:0;14718:7;;;;14647:86;;47035:243;;;;;;:::i;:::-;;:::i;35310:118::-;;;;;;:::i;:::-;-1:-1:-1;;;;;35402:18:0;35375:7;35402:18;;;:9;:18;;;;;;;35310:118;30089:20;;;;;;;;;;;;24952:499;;;:::i;46349:73::-;;;:::i;18853:139::-;;;;;;:::i;:::-;;:::i;34265:95::-;;;:::i;17935:49::-;;17980:4;17935:49;;38534:445;;;;;;:::i;:::-;;:::i;43329:1244::-;;;;;;:::i;:::-;;:::i;35643:193::-;;;;;;:::i;:::-;;:::i;45079:1262::-;;;;;;:::i;:::-;;:::i;30227:151::-;;30270:108;30227:151;;30385:176;;30428:133;30385:176;;32685:627;;;;;;:::i;:::-;;:::i;47286:147::-;;;;;;:::i;:::-;;:::i;29741:62::-;;29779:24;29741:62;;20774:149;;;;;;:::i;:::-;;:::i;46515:287::-;;;;;;:::i;:::-;;:::i;35899:142::-;;;;;;:::i;:::-;-1:-1:-1;;;;;36006:18:0;;;35979:7;36006:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;35899:142;23501:30;;;;;-1:-1:-1;;;;;23501:30:0;;;29672:62;;-1:-1:-1;;;;;;;;;;;29672:62:0;;24454:328;;;;;;:::i;:::-;;:::i;46810:217::-;;;;;;:::i;:::-;;:::i;18546:215::-;18631:4;-1:-1:-1;;;;;;18655:58:0;;-1:-1:-1;;;18655:58:0;;:98;;-1:-1:-1;;;;;;;;;;11939:51:0;;;18717:36;18648:105;18546:215;-1:-1:-1;;18546:215:0:o;34055:91::-;34100:13;34133:5;34126:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34055:91;:::o;36188:187::-;36289:4;3720:1;4483:7;;:19;;4475:63;;;;-1:-1:-1;;;4475:63:0;;;;;;;:::i;:::-;;;;;;;;;3720:1;4616:7;:18;14718:7;;;;14972:9:::1;14964:45;;;;-1:-1:-1::0;;;14964:45:0::1;;;;;;;:::i;:::-;36306:39:::2;36315:12;:10;:12::i;:::-;36329:7;36338:6;36306:8;:39::i;:::-;-1:-1:-1::0;36363:4:0::2;3676:1:::0;4795:7;:22;36188:187;;-1:-1:-1;;36188:187:0:o;36857:523::-;37015:4;3720:1;4483:7;;:19;;4475:63;;;;-1:-1:-1;;;4475:63:0;;;;;;;:::i;:::-;3720:1;4616:7;:18;14718:7;;;;14972:9:::1;14964:45;;;;-1:-1:-1::0;;;14964:45:0::1;;;;;;;:::i;:::-;37032:36:::2;37042:6;37050:9;37061:6;37032:9;:36::i;:::-;-1:-1:-1::0;;;;;37108:19:0;::::2;37081:24;37108:19:::0;;;:11:::2;:19;::::0;;;;37081:24;37128:12:::2;:10;:12::i;:::-;-1:-1:-1::0;;;;;37108:33:0::2;-1:-1:-1::0;;;;;37108:33:0::2;;;;;;;;;;;;;37081:60;;37180:6;37160:16;:26;;37152:86;;;::::0;-1:-1:-1;;;37152:86:0;;18769:2:1;37152:86:0::2;::::0;::::2;18751:21:1::0;18808:2;18788:18;;;18781:30;18847:34;18827:18;;;18820:62;-1:-1:-1;;;18898:18:1;;;18891:45;18953:19;;37152:86:0::2;18741:237:1::0;37152:86:0::2;37282:57;37291:6;37299:12;:10;:12::i;:::-;37332:6;37313:16;:25;37282:8;:57::i;:::-;37368:4;37361:11;;;3676:1:::0;4795:7;:22;36857:523;;-1:-1:-1;;;36857:523:0:o;20382:147::-;20063:7;20090:12;;;:6;:12;;;;;:22;;;18426:28;18437:4;18443:10;18426;:28::i;:::-;20496:25:::1;20507:4;20513:7;20496:10;:25::i;:::-;20382:147:::0;;;:::o;21430:223::-;-1:-1:-1;;;;;21526:21:0;;21537:10;21526:21;21518:88;;;;-1:-1:-1;;;21518:88:0;;13624:2:1;21518:88:0;;;13606:21:1;13663:2;13643:18;;;13636:30;13702:34;13682:18;;;13675:62;-1:-1:-1;;;13753:18:1;;;13746:52;13815:19;;21518:88:0;13596:244:1;21518:88:0;21619:26;21631:4;21637:7;21619:11;:26::i;:::-;21430:223;;:::o;37789:242::-;37904:4;3720:1;4483:7;;:19;;4475:63;;;;-1:-1:-1;;;4475:63:0;;;;;;;:::i;:::-;3720:1;4616:7;:18;14718:7;;;;14972:9:::1;14964:45;;;;-1:-1:-1::0;;;14964:45:0::1;;;;;;;:::i;:::-;37921:80:::2;37930:12;:10;:12::i;:::-;37944:7;37990:10;37953:11;:25;37965:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;37953:25:0;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;;;;;-1:-1:-1;37953:25:0;;;:34;;::::2;::::0;;;;;;;:47:::2;::::0;;::::2;:::i;:::-;37921:8;:80::i;46430:77::-:0;-1:-1:-1;;;;;;;;;;;18426:28:0;18437:4;18443:10;18426;:28::i;:::-;46489:10:::1;:8;:10::i;:::-;46430:77:::0;:::o;47035:243::-;23829:8;;-1:-1:-1;;;;;23829:8:0;23815:10;:22;23807:64;;;;-1:-1:-1;;;23807:64:0;;;;;;;:::i;:::-;47137:23:::1;:50:::0;;-1:-1:-1;;47137:50:0::1;;::::0;::::1;::::0;;::::1;::::0;;;47203:67:::1;::::0;47259:10:::1;::::0;47137:50;47203:67:::1;::::0;-1:-1:-1;;47203:67:0::1;47035:243:::0;:::o;24952:499::-;25021:15;;-1:-1:-1;;;;;25021:15:0;:29;;;;:62;;-1:-1:-1;25068:15:0;;-1:-1:-1;;;;;25068:15:0;25054:10;:29;25021:62;24999:143;;;;-1:-1:-1;;;24999:143:0;;13264:2:1;24999:143:0;;;13246:21:1;13303:2;13283:18;;;13276:30;13342:33;13322:18;;;13315:61;13393:18;;24999:143:0;13236:181:1;24999:143:0;25177:8;;;25225:15;;;-1:-1:-1;;;;;;25253:26:0;;;-1:-1:-1;;;;;25225:15:0;;;25253:26;;;;;;25290:28;;;;;25336:35;;25177:8;;;;;25225:15;;25177:8;;25336:35;;25155:19;;25336:35;25427:15;;25387:56;;-1:-1:-1;;;;;25427:15:0;;;;25387:56;;;;;25427:15;;25387:56;24952:499;;:::o;46349:73::-;-1:-1:-1;;;;;;;;;;;18426:28:0;18437:4;18443:10;18426;:28::i;:::-;46406:8:::1;:6;:8::i;18853:139::-:0;18931:4;18955:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;18955:29:0;;;;;;;;;;;;;;;18853:139::o;34265:95::-;34312:13;34345:7;34338:14;;;;;:::i;38534:445::-;38654:4;3720:1;4483:7;;:19;;4475:63;;;;-1:-1:-1;;;4475:63:0;;;;;;;:::i;:::-;3720:1;4616:7;:18;14718:7;;;;14972:9:::1;14964:45;;;;-1:-1:-1::0;;;14964:45:0::1;;;;;;;:::i;:::-;38671:24:::2;38698:11;:25;38710:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;38698:25:0;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;;;;;-1:-1:-1;38698:25:0;;;:34;;::::2;::::0;;;;;;;;-1:-1:-1;38751:35:0;;::::2;;38743:92;;;::::0;-1:-1:-1;;;38743:92:0;;16053:2:1;38743:92:0::2;::::0;::::2;16035:21:1::0;16092:2;16072:18;;;16065:30;16131:34;16111:18;;;16104:62;-1:-1:-1;;;16182:18:1;;;16175:42;16234:19;;38743:92:0::2;16025:234:1::0;38743:92:0::2;38871:67;38880:12;:10;:12::i;:::-;38894:7;38922:15;38903:16;:34;38871:8;:67::i;:::-;38967:4;38960:11;;;3676:1:::0;4795:7;:22;38534:445;;-1:-1:-1;;38534:445:0:o;43329:1244::-;3720:1;4483:7;;:19;;4475:63;;;;-1:-1:-1;;;4475:63:0;;;;;;;:::i;:::-;3720:1;4616:7;:18;14718:7;;;;14972:9:::1;14964:45;;;;-1:-1:-1::0;;;14964:45:0::1;;;;;;;:::i;:::-;43711:16:::2;::::0;-1:-1:-1;;;;;43994:14:0;::::2;43606;43994::::0;;;:6:::2;:14;::::0;;;;;;;:24;;;;;;;;;43778:299;;43606:14;;43711:16;43778:299:::2;::::0;30428:133:::2;::::0;43858:6;;43891:8;;43926:6;;43959:8;;43994:24;;44045:9;;43778:299:::2;;:::i;:::-;;;;;;;;;;;;;43746:350;;;;;;43647:464;;;;;;;;-1:-1:-1::0;;;5829:27:1;;5881:1;5872:11;;5865:27;;;;5917:2;5908:12;;5901:28;5954:2;5945:12;;5819:144;43647:464:0::2;;::::0;;-1:-1:-1;;43647:464:0;;::::2;::::0;;;;;;43623:499;;43647:464:::2;43623:499:::0;;::::2;::::0;44192:28;;::::2;5409:19:1::0;;;5444:12;;;5437:28;;;-1:-1:-1;;;;;;5521:3:1;5499:16;;;5495:36;5481:12;;;5474:58;43623:499:0;-1:-1:-1;44143:24:0::2;::::0;44170:51:::2;::::0;43623:499;;5548:12:1;;44192:28:0::2;;;;;;;;;;;;;44170:13;:51::i;:::-;44143:78:::0;-1:-1:-1;;;;;;44240:30:0;::::2;44232:67;;;::::0;-1:-1:-1;;;44232:67:0;;10274:2:1;44232:67:0::2;::::0;::::2;10256:21:1::0;10313:2;10293:18;;;10286:30;-1:-1:-1;;;10332:18:1;;;10325:54;10396:18;;44232:67:0::2;10246:174:1::0;44232:67:0::2;44328:16;-1:-1:-1::0;;;;;44318:26:0::2;:6;-1:-1:-1::0;;;;;44318:26:0::2;;44310:75;;;::::0;-1:-1:-1;;;44310:75:0;;17652:2:1;44310:75:0::2;::::0;::::2;17634:21:1::0;17691:2;17671:18;;;17664:30;17730:34;17710:18;;;17703:62;-1:-1:-1;;;17781:18:1;;;17774:34;17825:19;;44310:75:0::2;17624:226:1::0;44310:75:0::2;44404:14:::0;;;:46:::2;;;44441:9;44422:15;:28;;44404:46;44396:82;;;::::0;-1:-1:-1;;;44396:82:0;;11335:2:1;44396:82:0::2;::::0;::::2;11317:21:1::0;11374:2;11354:18;;;11347:30;11413:25;11393:18;;;11386:53;11456:18;;44396:82:0::2;11307:173:1::0;44396:82:0::2;44491:29;44504:6;44511:8;44491:12;:29::i;:::-;44531:34;44540:6;44548:8;44558:6;44531:8;:34::i;:::-;-1:-1:-1::0;;3676:1:0;4795:7;:22;-1:-1:-1;;;;;;;;43329:1244:0:o;35643:193::-;35747:4;3720:1;4483:7;;:19;;4475:63;;;;-1:-1:-1;;;4475:63:0;;;;;;;:::i;:::-;3720:1;4616:7;:18;14718:7;;;;14972:9:::1;14964:45;;;;-1:-1:-1::0;;;14964:45:0::1;;;;;;;:::i;:::-;35764:42:::2;35774:12;:10;:12::i;:::-;35788:9;35799:6;35764:9;:42::i;45079:1262::-:0;3720:1;4483:7;;:19;;4475:63;;;;-1:-1:-1;;;4475:63:0;;;;;;;:::i;:::-;3720:1;4616:7;:18;14718:7;;;;14972:9:::1;14964:45;;;;-1:-1:-1::0;;;14964:45:0::1;;;;;;;:::i;:::-;45466:16:::2;::::0;-1:-1:-1;;;;;45754:15:0;::::2;45361:14;45754:15:::0;;;:6:::2;:15;::::0;;;;;;;:25;;;;;;;;;45533:305;;45361:14;;45466:16;45533:305:::2;::::0;30612:138:::2;::::0;45614:7;;45648:10;;45685:7;;45719:8;;45754:25;;45806:9;;45533:305:::2;;:::i;:::-;;;;;;;;;;;;;45501:356;;;;;;45402:470;;;;;;;;-1:-1:-1::0;;;5829:27:1;;5881:1;5872:11;;5865:27;;;;5917:2;5908:12;;5901:28;5954:2;5945:12;;5819:144;45402:470:0::2;;::::0;;-1:-1:-1;;45402:470:0;;::::2;::::0;;;;;;45378:505;;45402:470:::2;45378:505:::0;;::::2;::::0;45955:28;;::::2;5409:19:1::0;;;5444:12;;;5437:28;;;-1:-1:-1;;;;;;5521:3:1;5499:16;;;5495:36;5481:12;;;5474:58;45378:505:0;-1:-1:-1;45906:24:0::2;::::0;45933:51:::2;::::0;45378:505;;5548:12:1;;45955:28:0::2;5399:167:1::0;45933:51:0::2;45906:78:::0;-1:-1:-1;;;;;;46003:30:0;::::2;45995:67;;;::::0;-1:-1:-1;;;45995:67:0;;10274:2:1;45995:67:0::2;::::0;::::2;10256:21:1::0;10313:2;10293:18;;;10286:30;-1:-1:-1;;;10332:18:1;;;10325:54;10396:18;;45995:67:0::2;10246:174:1::0;45995:67:0::2;46092:16;-1:-1:-1::0;;;;;46081:27:0::2;:7;-1:-1:-1::0;;;;;46081:27:0::2;;46073:76;;;::::0;-1:-1:-1;;;46073:76:0;;11687:2:1;46073:76:0::2;::::0;::::2;11669:21:1::0;11726:2;11706:18;;;11699:30;11765:34;11745:18;;;11738:62;-1:-1:-1;;;11816:18:1;;;11809:34;11860:19;;46073:76:0::2;11659:226:1::0;46073:76:0::2;46168:14:::0;;;:46:::2;;;46205:9;46186:15;:28;;46168:46;46160:82;;;::::0;-1:-1:-1;;;46160:82:0;;10627:2:1;46160:82:0::2;::::0;::::2;10609:21:1::0;10666:2;10646:18;;;10639:30;10705:25;10685:18;;;10678:53;10748:18;;46160:82:0::2;10599:173:1::0;46160:82:0::2;46253:30;46266:7;46274:8;46253:12;:30::i;:::-;46294:39;46304:7;46313:10;46325:7;46294:9;:39::i;32685:627::-:0;1587:13;;;;;;;;:30;;-1:-1:-1;1605:12:0;;;;1604:13;1587:30;1579:89;;;;-1:-1:-1;;;1579:89:0;;;;;;;:::i;:::-;1681:19;1704:13;;;;;;1703:14;1728:101;;;;1763:13;:20;;-1:-1:-1;;1798:19:0;;;;;1728:101;32859:74:::1;32900:18;32919:6;32926;32859:40;:74::i;:::-;32943:49;32949:11:::0;32975:16:::1;35073:2:::0;32975::::1;:16;:::i;:::-;32962:29;::::0;:10:::1;:29;:::i;:::-;32943:5;:49::i;:::-;33002:39;33024:16;33002:21;:39::i;:::-;33051:17;:15;:17::i;:::-;33078:22;:20;:22::i;:::-;33110:25;33126:8;33110:15;:25::i;:::-;33145:24;:22;:24::i;:::-;33179:19;:23:::0;;-1:-1:-1;;33179:23:0::1;::::0;;-1:-1:-1;33212:19:0::1;:23:::0;33245::::1;:38:::0;;-1:-1:-1;;33293:11:0;;;;;1855:68;;;;1906:5;1890:21;;-1:-1:-1;;1890:21:0;;;1855:68;32685:627;;;;;;;:::o;47286:147::-;23829:8;;-1:-1:-1;;;;;23829:8:0;23815:10;:22;23807:64;;;;-1:-1:-1;;;23807:64:0;;;;;;;:::i;:::-;47355:7:::1;:18:::0;;-1:-1:-1;;47355:18:0::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;47389:36:::1;::::0;47414:10:::1;::::0;47355:18;47389:36:::1;::::0;-1:-1:-1;;47389:36:0::1;47286:147:::0;:::o;20774:149::-;20063:7;20090:12;;;:6;:12;;;;;:22;;;18426:28;18437:4;18443:10;18426;:28::i;:::-;20889:26:::1;20901:4;20907:7;20889:11;:26::i;46515:287::-:0;23829:8;;-1:-1:-1;;;;;23829:8:0;23815:10;:22;23807:64;;;;-1:-1:-1;;;23807:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;46613:24:0;::::1;46605:85;;;::::0;-1:-1:-1;;;46605:85:0;;17235:2:1;46605:85:0::1;::::0;::::1;17217:21:1::0;17274:2;17254:18;;;17247:30;17313:34;17293:18;;;17286:62;-1:-1:-1;;;17364:18:1;;;17357:46;17420:19;;46605:85:0::1;17207:238:1::0;46605:85:0::1;46701:17;:30:::0;;-1:-1:-1;;;;;;46701:30:0::1;::::0;-1:-1:-1;;;;;46701:30:0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;46747:47:::1;::::0;46783:10:::1;::::0;46747:47:::1;::::0;::::1;46515:287:::0;:::o;24454:328::-;23829:8;;-1:-1:-1;;;;;23829:8:0;23815:10;:22;23807:64;;;;-1:-1:-1;;;23807:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24544:26:0;::::1;24536:66;;;::::0;-1:-1:-1;;;24536:66:0;;16879:2:1;24536:66:0::1;::::0;::::1;16861:21:1::0;16918:2;16898:18;;;16891:30;16957:29;16937:18;;;16930:57;17004:18;;24536:66:0::1;16851:177:1::0;24536:66:0::1;24644:15;::::0;;-1:-1:-1;;;;;24670:30:0;;::::1;-1:-1:-1::0;;;;;;24670:30:0;::::1;::::0;::::1;::::0;;;24718:56:::1;::::0;24644:15;::::1;::::0;24670:30;24644:15;;24718:56:::1;::::0;24615:26:::1;::::0;24718:56:::1;23882:1;24454:328:::0;:::o;46810:217::-;23829:8;;-1:-1:-1;;;;;23829:8:0;23815:10;:22;23807:64;;;;-1:-1:-1;;;23807:64:0;;;;;;;:::i;:::-;46902:19:::1;:42:::0;;;46960:59:::1;::::0;47008:10:::1;::::0;46924:20;;46960:59:::1;::::0;;;::::1;46810:217:::0;:::o;12821:393::-;12874:14;12788:17;;;;;-1:-1:-1;;;;;12788:17:0;12924:10;12775:30;12901:306;;;-1:-1:-1;;;13110:14:0;13106:23;13093:37;13089:2;13085:46;12821:393;:::o;13056:90::-;-1:-1:-1;13185:10:0;;12821:393::o;41977:394::-;-1:-1:-1;;;;;42113:19:0;;42105:75;;;;-1:-1:-1;;;42105:75:0;;19599:2:1;42105:75:0;;;19581:21:1;19638:2;19618:18;;;19611:30;19677:34;19657:18;;;19650:62;-1:-1:-1;;;19728:18:1;;;19721:41;19779:19;;42105:75:0;19571:233:1;42105:75:0;-1:-1:-1;;;;;42199:21:0;;42191:75;;;;-1:-1:-1;;;42191:75:0;;15232:2:1;42191:75:0;;;15214:21:1;15271:2;15251:18;;;15244:30;15310:34;15290:18;;;15283:62;-1:-1:-1;;;15361:18:1;;;15354:39;15410:19;;42191:75:0;15204:231:1;42191:75:0;-1:-1:-1;;;;;42279:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;42331:32;;7312:25:1;;;42331:32:0;;7285:18:1;42331:32:0;;;;;;;41977:394;;;:::o;39469:637::-;-1:-1:-1;;;;;39609:20:0;;39601:77;;;;-1:-1:-1;;;39601:77:0;;16466:2:1;39601:77:0;;;16448:21:1;16505:2;16485:18;;;16478:30;16544:34;16524:18;;;16517:62;-1:-1:-1;;;16595:18:1;;;16588:42;16647:19;;39601:77:0;16438:234:1;39601:77:0;-1:-1:-1;;;;;39697:23:0;;39689:78;;;;-1:-1:-1;;;39689:78:0;;15642:2:1;39689:78:0;;;15624:21:1;15681:2;15661:18;;;15654:30;15720:34;15700:18;;;15693:62;-1:-1:-1;;;15771:18:1;;;15764:40;15821:19;;39689:78:0;15614:232:1;39689:78:0;-1:-1:-1;;;;;39804:17:0;;39780:21;39804:17;;;:9;:17;;;;;;39840:23;;;;39832:81;;;;-1:-1:-1;;;39832:81:0;;19185:2:1;39832:81:0;;;19167:21:1;19224:2;19204:18;;;19197:30;19263:34;19243:18;;;19236:62;-1:-1:-1;;;19314:18:1;;;19307:43;19367:19;;39832:81:0;19157:235:1;39832:81:0;-1:-1:-1;;;;;39949:17:0;;;;;;;:9;:17;;;;;;39969:22;;;39949:42;;40013:20;;;;;;;;:30;;39985:6;;39949:17;40013:30;;39985:6;;40013:30;:::i;:::-;;;;;;;;40078:9;-1:-1:-1;;;;;40061:35:0;40070:6;-1:-1:-1;;;;;40061:35:0;;40089:6;40061:35;;;;7312:25:1;;7300:2;7285:18;;7267:76;40061:35:0;;;;;;;;39469:637;;;;:::o;19282:526::-;19363:22;19371:4;19377:7;19363;:22::i;:::-;19358:443;;19558:52;19597:7;-1:-1:-1;;;;;19558:52:0;19607:2;19558:30;:52::i;:::-;19683:49;19722:4;19729:2;19683:30;:49::i;:::-;19456:299;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;19456:299:0;;;;;;;;;;-1:-1:-1;;;19402:387:0;;;;;;;:::i;22739:227::-;22814:22;22822:4;22828:7;22814;:22::i;:::-;22809:150;;22853:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;22853:29:0;;;;;;;;;;:36;;-1:-1:-1;;22853:36:0;22885:4;22853:36;;;22909:38;22936:10;;22860:4;;22909:38;;22853:12;22909:38;22739:227;;:::o;22974:228::-;23049:22;23057:4;23063:7;23049;:22::i;:::-;23045:150;;;23120:5;23088:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;23088:29:0;;;;;;;;;;:37;;-1:-1:-1;;23088:37:0;;;23145:38;23172:10;;23095:4;;23145:38;;23120:5;23145:38;22974:228;;:::o;15718:118::-;14718:7;;;;15249:48;;;;-1:-1:-1;;;15249:48:0;;10979:2:1;15249:48:0;;;10961:21:1;11018:2;10998:18;;;10991:30;11057:29;11037:18;;;11030:57;11104:18;;15249:48:0;10951:177:1;15249:48:0;15777:7:::1;:15:::0;;-1:-1:-1;;15777:15:0::1;::::0;;15808:20:::1;::::0;15817:10:::1;6912:51:1::0;;15808:20:0::1;::::0;6900:2:1;6885:18;15808:20:0::1;;;;;;;;15718:118::o:0;15461:116::-;14718:7;;;;14972:9;14964:45;;;;-1:-1:-1;;;14964:45:0;;;;;;;:::i;:::-;15521:7:::1;:14:::0;;-1:-1:-1;;15521:14:0::1;15531:4;15521:14;::::0;;15551:18:::1;::::0;15558:10:::1;6912:51:1::0;;15551:18:0::1;::::0;6900:2:1;6885:18;15551::0::1;6867:102:1::0;26521:2079:0;26599:7;26662:9;:16;26682:2;26662:22;26658:103;;26701:48;;-1:-1:-1;;;26701:48:0;;12092:2:1;26701:48:0;;;12074:21:1;12131:2;12111:18;;;12104:30;12170:34;12150:18;;;12143:62;-1:-1:-1;;;12221:18:1;;;12214:36;12267:19;;26701:48:0;12064:228:1;26658:103:0;27122:4;27107:20;;27101:27;27168:4;27153:20;;27147:27;27222:4;27207:20;;27201:27;26830:9;27193:36;28157:66;28143:80;;;28135:134;;;;-1:-1:-1;;;28135:134:0;;14462:2:1;28135:134:0;;;14444:21:1;14501:2;14481:18;;;14474:30;14540:34;14520:18;;;14513:62;-1:-1:-1;;;14591:18:1;;;14584:39;14640:19;;28135:134:0;14434:231:1;28135:134:0;28288:1;:7;;28293:2;28288:7;:18;;;;28299:1;:7;;28304:2;28299:7;28288:18;28280:72;;;;-1:-1:-1;;;28280:72:0;;9864:2:1;28280:72:0;;;9846:21:1;9903:2;9883:18;;;9876:30;9942:34;9922:18;;;9915:62;-1:-1:-1;;;9993:18:1;;;9986:39;10042:19;;28280:72:0;9836:231:1;28280:72:0;28467:24;;;28450:14;28467:24;;;;;;;;;8737:25:1;;;8810:4;8798:17;;8778:18;;;8771:45;;;;8832:18;;;8825:34;;;8875:18;;;8868:34;;;28467:24:0;;8709:19:1;;28467:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28467:24:0;;-1:-1:-1;;28467:24:0;;;-1:-1:-1;;;;;;;28510:20:0;;28502:64;;;;-1:-1:-1;;;28502:64:0;;14872:2:1;28502:64:0;;;14854:21:1;14911:2;14891:18;;;14884:30;14950:33;14930:18;;;14923:61;15001:18;;28502:64:0;14844:181:1;28502:64:0;28586:6;26521:2079;-1:-1:-1;;;;;;26521:2079:0:o;42699:108::-;-1:-1:-1;;;;;42774:13:0;;;;;;:6;:13;;;;;;;;:23;;;;;;;;:25;;;;;;:::i;:::-;;;;;;42699:108;;:::o;33324:661::-;1587:13;;;;;;;;:30;;-1:-1:-1;1605:12:0;;;;1604:13;1587:30;1579:89;;;;-1:-1:-1;;;1579:89:0;;;;;;;:::i;:::-;1681:19;1704:13;;;;;;1703:14;1728:101;;;;1763:13;:20;;-1:-1:-1;;1798:19:0;;;;;1728:101;33466:24:::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;33466:24:0::1;::::0;;::::1;::::0;;;::::1;::::0;:5:::1;::::0;:24:::1;:::i;:::-;-1:-1:-1::0;33501:16:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;;;33501:16:0::1;::::0;;::::1;::::0;;;::::1;::::0;:7:::1;::::0;:16:::1;:::i;:::-;-1:-1:-1::0;33528:50:0::1;17980:4;33559:18:::0;33528:10:::1;:50::i;:::-;33589:31;-1:-1:-1::0;;;;;;;;;;;33613:6:0::1;33589:10;:31::i;:::-;33631;29779:24;33655:6;33631:10;:31::i;:::-;33755:211;::::0;;30270:108:::1;33755:211;::::0;;::::1;8275:25:1::0;;;;33819:27:0::1;8316:18:1::0;;;8309:34;33865:14:0::1;8359:18:1::0;;;8352:34;33906:4:0::1;8402:18:1::0;;;8395:60;47551:9:0;8471:19:1;;;;8464:35;;;;33755:211:0;;;;;;;;;;8247:19:1;;;;33755:211:0;;;33731:246;;;::::1;::::0;33712:16:::1;:265:::0;1855:68;;;;1906:5;1890:21;;-1:-1:-1;;1890:21:0;;;1855:68;33324:661;;;;:::o;40393:285::-;-1:-1:-1;;;;;40477:21:0;;40469:72;;;;-1:-1:-1;;;40469:72:0;;12499:2:1;40469:72:0;;;12481:21:1;12538:2;12518:18;;;12511:30;12577:34;12557:18;;;12550:62;-1:-1:-1;;;12628:18:1;;;12621:36;12674:19;;40469:72:0;12471:228:1;40469:72:0;40570:6;40554:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;40587:18:0;;;;;;:9;:18;;;;;:28;;40609:6;;40587:18;:28;;40609:6;;40587:28;:::i;:::-;;;;-1:-1:-1;;40633:37:0;;7312:25:1;;;-1:-1:-1;;;;;40633:37:0;;;40650:1;;40633:37;;7300:2:1;7285:18;40633:37:0;;;;;;;40393:285;;:::o;12366:146::-;1587:13;;;;;;;;:30;;-1:-1:-1;1605:12:0;;;;1604:13;1587:30;1579:89;;;;-1:-1:-1;;;1579:89:0;;;;;;;:::i;:::-;1681:19;1704:13;;;;;;1703:14;1728:101;;;;1763:13;:20;;-1:-1:-1;;1798:19:0;;;;;1728:101;12455:49:::1;12487:16;12455:31;:49::i;:::-;1859:14:::0;1855:68;;;1906:5;1890:21;;-1:-1:-1;;1890:21:0;;;12366:146;;:::o;14353:94::-;1587:13;;;;;;;;:30;;-1:-1:-1;1605:12:0;;;;1604:13;1587:30;1579:89;;;;-1:-1:-1;;;1579:89:0;;;;;;;:::i;:::-;1681:19;1704:13;;;;;;1703:14;1728:101;;;;1763:13;:20;;-1:-1:-1;;1798:19:0;;;;;1728:101;14412:27:::1;:25;:27::i;:::-;1859:14:::0;1855:68;;;1906:5;1890:21;;-1:-1:-1;;1890:21:0;;;14353:94;:::o;17565:130::-;1587:13;;;;;;;;:30;;-1:-1:-1;1605:12:0;;;;1604:13;1587:30;1579:89;;;;-1:-1:-1;;;1579:89:0;;;;;;;:::i;:::-;1681:19;1704:13;;;;;;1703:14;1728:101;;;;1763:13;:20;;-1:-1:-1;;1798:19:0;;;;;1728:101;17629:15:::1;:13;:15::i;:::-;17655:32;:30;:32::i;23978:128::-:0;1587:13;;;;;;;;:30;;-1:-1:-1;1605:12:0;;;;1604:13;1587:30;1579:89;;;;-1:-1:-1;;;1579:89:0;;;;;;;:::i;:::-;1681:19;1704:13;;;;;;1703:14;1728:101;;;;1763:13;:20;;-1:-1:-1;;1798:19:0;;;;;1728:101;24058:40:::1;24084:13;24058:25;:40::i;3762:108::-:0;1587:13;;;;;;;;:30;;-1:-1:-1;1605:12:0;;;;1604:13;1587:30;1579:89;;;;-1:-1:-1;;;1579:89:0;;;;;;;:::i;:::-;1681:19;1704:13;;;;;;1703:14;1728:101;;;;1763:13;:20;;-1:-1:-1;;1798:19:0;;;;;1728:101;3828:34:::1;:32;:34::i;9493:451::-:0;9568:13;9594:19;9626:10;9630:6;9626:1;:10;:::i;:::-;:14;;9639:1;9626:14;:::i;:::-;9616:25;;;;;;-1:-1:-1;;;9616:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9616:25:0;;9594:47;;-1:-1:-1;;;9652:6:0;9659:1;9652:9;;;;;;-1:-1:-1;;;9652:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;9652:15:0;;;;;;;;;-1:-1:-1;;;9678:6:0;9685:1;9678:9;;;;;;-1:-1:-1;;;9678:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;9678:15:0;;;;;;;;-1:-1:-1;9709:9:0;9721:10;9725:6;9721:1;:10;:::i;:::-;:14;;9734:1;9721:14;:::i;:::-;9709:26;;9704:135;9741:1;9737;:5;9704:135;;;-1:-1:-1;;;9789:5:0;9797:3;9789:11;9776:25;;;;;-1:-1:-1;;;9776:25:0;;;;;;;;;;;;9764:6;9771:1;9764:9;;;;;;-1:-1:-1;;;9764:9:0;;;;;;;;;;;;:37;-1:-1:-1;;;;;9764:37:0;;;;;;;;-1:-1:-1;9826:1:0;9816:11;;;;;9744:3;;;:::i;:::-;;;9704:135;;;-1:-1:-1;9857:10:0;;9849:55;;;;-1:-1:-1;;;9849:55:0;;9503:2:1;9849:55:0;;;9485:21:1;;;9522:18;;;9515:30;9581:34;9561:18;;;9554:62;9633:18;;9849:55:0;9475:182:1;9849:55:0;9929:6;9493:451;-1:-1:-1;;;9493:451:0:o;22236:112::-;22315:25;22326:4;22332:7;22315:10;:25::i;12520:143::-;1587:13;;;;;;;;:30;;-1:-1:-1;1605:12:0;;;;1604:13;1587:30;1579:89;;;;-1:-1:-1;;;1579:89:0;;;;;;;:::i;:::-;1681:19;1704:13;;;;;;1703:14;1728:101;;;;1763:13;:20;;-1:-1:-1;;1798:19:0;;;;;1728:101;12619:17:::1;:36:::0;;-1:-1:-1;;;;;;12619:36:0::1;::::0;-1:-1:-1;;;;;12619:36:0;::::1;;;::::0;;1855:68;;;;1906:5;1890:21;;-1:-1:-1;;1890:21:0;;;12520:143;;:::o;14455:92::-;1587:13;;;;;;;;:30;;-1:-1:-1;1605:12:0;;;;1604:13;1587:30;1579:89;;;;-1:-1:-1;;;1579:89:0;;;;;;;:::i;:::-;1681:19;1704:13;;;;;;1703:14;1728:101;;;;1763:13;:20;;-1:-1:-1;;1798:19:0;;;;;1728:101;14524:7:::1;:15:::0;;-1:-1:-1;;14524:15:0::1;::::0;;1855:68;;;;1906:5;1890:21;;-1:-1:-1;;1890:21:0;;;14455:92;:::o;11598:90::-;1587:13;;;;;;;;:30;;-1:-1:-1;1605:12:0;;;;1604:13;1587:30;1579:89;;;;-1:-1:-1;;;1579:89:0;;;;;;;:::i;:::-;1681:19;1704:13;;;;;;1703:14;1728:101;;;;1763:13;:20;;-1:-1:-1;;1798:19:0;;;;;11655:25:::1;17703:71:::0;1587:13;;;;;;;;:30;;-1:-1:-1;1605:12:0;;;;1604:13;1587:30;1579:89;;;;-1:-1:-1;;;1579:89:0;;;;;;;:::i;:::-;1681:19;1704:13;;;;;;1703:14;1728:101;;;;1763:13;:20;;-1:-1:-1;;1798:19:0;;;;;1855:68;;;;1906:5;1890:21;;-1:-1:-1;;1890:21:0;;;17703:71;:::o;24114:122::-;1587:13;;;;;;;;:30;;-1:-1:-1;1605:12:0;;;;1604:13;1587:30;1579:89;;;;-1:-1:-1;;;1579:89:0;;;;;;;:::i;:::-;1681:19;1704:13;;;;;;1703:14;1728:101;;;;1763:13;:20;;-1:-1:-1;;1798:19:0;;;;;1728:101;24204:8:::1;:24:::0;;-1:-1:-1;;;;;;24204:24:0::1;-1:-1:-1::0;;;;;24204:24:0;::::1;;::::0;;1855:68;;;;1906:5;1890:21;;-1:-1:-1;;1890:21:0;;;24114:122;;:::o;3878:106::-;1587:13;;;;;;;;:30;;-1:-1:-1;1605:12:0;;;;1604:13;1587:30;1579:89;;;;-1:-1:-1;;;1579:89:0;;;;;;;:::i;:::-;1681:19;1704:13;;;;;;1703:14;1728:101;;;;1763:13;:20;;-1:-1:-1;;1798:19:0;;;;;1728:101;3676:1:::1;3954:7;:22:::0;1855:68;;;;1906:5;1890:21;;-1:-1:-1;;1890:21:0;;;3878:106;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:156:1;80:20;;140:4;129:16;;119:27;;109:2;;160:1;157;150:12;109:2;61:109;;;:::o;175:257::-;234:6;287:2;275:9;266:7;262:23;258:32;255:2;;;308:6;300;293:22;255:2;352:9;339:23;371:31;396:5;371:31;:::i;707:398::-;775:6;783;836:2;824:9;815:7;811:23;807:32;804:2;;;857:6;849;842:22;804:2;901:9;888:23;920:31;945:5;920:31;:::i;:::-;970:5;-1:-1:-1;1027:2:1;1012:18;;999:32;1040:33;999:32;1040:33;:::i;:::-;1092:7;1082:17;;;794:311;;;;;:::o;1110:965::-;1214:6;1222;1230;1238;1246;1254;1307:3;1295:9;1286:7;1282:23;1278:33;1275:2;;;1329:6;1321;1314:22;1275:2;1373:9;1360:23;1392:31;1417:5;1392:31;:::i;:::-;1442:5;-1:-1:-1;1499:2:1;1484:18;;1471:32;1512:33;1471:32;1512:33;:::i;:::-;1564:7;-1:-1:-1;1623:2:1;1608:18;;1595:32;1636:33;1595:32;1636:33;:::i;:::-;1688:7;-1:-1:-1;1747:2:1;1732:18;;1719:32;1760:33;1719:32;1760:33;:::i;:::-;1812:7;-1:-1:-1;1871:3:1;1856:19;;1843:33;1885;1843;1885;:::i;:::-;1937:7;-1:-1:-1;1996:3:1;1981:19;;1968:33;2010;1968;2010;:::i;:::-;2062:7;2052:17;;;1265:810;;;;;;;;:::o;2080:466::-;2157:6;2165;2173;2226:2;2214:9;2205:7;2201:23;2197:32;2194:2;;;2247:6;2239;2232:22;2194:2;2291:9;2278:23;2310:31;2335:5;2310:31;:::i;:::-;2360:5;-1:-1:-1;2417:2:1;2402:18;;2389:32;2430:33;2389:32;2430:33;:::i;:::-;2184:362;;2482:7;;-1:-1:-1;;;2536:2:1;2521:18;;;;2508:32;;2184:362::o;2551:325::-;2619:6;2627;2680:2;2668:9;2659:7;2655:23;2651:32;2648:2;;;2701:6;2693;2686:22;2648:2;2745:9;2732:23;2764:31;2789:5;2764:31;:::i;:::-;2814:5;2866:2;2851:18;;;;2838:32;;-1:-1:-1;;;2638:238:1:o;2881:190::-;2940:6;2993:2;2981:9;2972:7;2968:23;2964:32;2961:2;;;3014:6;3006;2999:22;2961:2;-1:-1:-1;3042:23:1;;2951:120;-1:-1:-1;2951:120:1:o;3076:325::-;3144:6;3152;3205:2;3193:9;3184:7;3180:23;3176:32;3173:2;;;3226:6;3218;3211:22;3173:2;3267:9;3254:23;3244:33;;3327:2;3316:9;3312:18;3299:32;3340:31;3365:5;3340:31;:::i;3406:306::-;3464:6;3517:2;3505:9;3496:7;3492:23;3488:32;3485:2;;;3538:6;3530;3523:22;3485:2;3569:23;;-1:-1:-1;;;;;;3621:32:1;;3611:43;;3601:2;;3673:6;3665;3658:22;3912:296;3970:6;4023:2;4011:9;4002:7;3998:23;3994:32;3991:2;;;4044:6;4036;4029:22;3991:2;4088:9;4075:23;4138:10;4131:5;4127:22;4120:5;4117:33;4107:2;;4169:6;4161;4154:22;4213:192;4270:6;4323:2;4311:9;4302:7;4298:23;4294:32;4291:2;;;4344:6;4336;4329:22;4291:2;4372:27;4389:9;4372:27;:::i;4410:813::-;4530:6;4538;4546;4554;4562;4570;4578;4586;4639:3;4627:9;4618:7;4614:23;4610:33;4607:2;;;4661:6;4653;4646:22;4607:2;4689:27;4706:9;4689:27;:::i;:::-;4679:37;;4763:2;4752:9;4748:18;4735:32;4725:42;;4814:2;4803:9;4799:18;4786:32;4776:42;;4865:2;4854:9;4850:18;4837:32;4827:42;;4919:3;4908:9;4904:19;4891:33;4933:31;4958:5;4933:31;:::i;:::-;4983:5;-1:-1:-1;5035:3:1;5020:19;;5007:33;;-1:-1:-1;5092:3:1;5077:19;;5064:33;5106;5064;5106;:::i;:::-;5158:7;5148:17;;;5212:3;5201:9;5197:19;5184:33;5174:43;;4597:626;;;;;;;;;;;:::o;5968:793::-;6379:32;6374:3;6367:45;6349:3;6441:6;6435:13;6457:62;6512:6;6507:2;6502:3;6498:12;6491:4;6483:6;6479:17;6457:62;:::i;:::-;-1:-1:-1;;;6578:2:1;6538:16;;;6570:11;;;6563:40;6628:13;;6650:63;6628:13;6699:2;6691:11;;6684:4;6672:17;;6650:63;:::i;:::-;6733:17;6752:2;6729:26;;6357:404;-1:-1:-1;;;;6357:404:1:o;7348:663::-;7663:25;;;-1:-1:-1;;;;;7762:15:1;;;7757:2;7742:18;;7735:43;7814:15;;;;7809:2;7794:18;;7787:43;7861:2;7846:18;;7839:34;;;;7904:3;7889:19;;7882:35;7715:3;7933:19;;7926:35;;;;7992:3;7977:19;;7970:35;7650:3;7635:19;;7617:394::o;8913:383::-;9062:2;9051:9;9044:21;9025:4;9094:6;9088:13;9137:6;9132:2;9121:9;9117:18;9110:34;9153:66;9212:6;9207:2;9196:9;9192:18;9187:2;9179:6;9175:15;9153:66;:::i;:::-;9280:2;9259:15;-1:-1:-1;;9255:29:1;9240:45;;;;9287:2;9236:54;;9034:262;-1:-1:-1;;9034:262:1:o;12704:353::-;12906:2;12888:21;;;12945:2;12925:18;;;12918:30;12984:31;12979:2;12964:18;;12957:59;13048:2;13033:18;;12878:179::o;13845:410::-;14047:2;14029:21;;;14086:2;14066:18;;;14059:30;14125:34;14120:2;14105:18;;14098:62;-1:-1:-1;;;14191:2:1;14176:18;;14169:44;14245:3;14230:19;;14019:236::o;17855:347::-;18057:2;18039:21;;;18096:2;18076:18;;;18069:30;18135:25;18130:2;18115:18;;18108:53;18193:2;18178:18;;18029:173::o;18207:355::-;18409:2;18391:21;;;18448:2;18428:18;;;18421:30;18487:33;18482:2;18467:18;;18460:61;18553:2;18538:18;;18381:181::o;20377:128::-;20417:3;20448:1;20444:6;20441:1;20438:13;20435:2;;;20454:18;;:::i;:::-;-1:-1:-1;20490:9:1;;20425:80::o;20510:422::-;20599:1;20642:5;20599:1;20656:270;20677:7;20667:8;20664:21;20656:270;;;20736:4;20732:1;20728:6;20724:17;20718:4;20715:27;20712:2;;;20745:18;;:::i;:::-;20795:7;20785:8;20781:22;20778:2;;;20815:16;;;;20778:2;20894:22;;;;20854:15;;;;20656:270;;;20660:3;20574:358;;;;;:::o;20937:140::-;20995:5;21024:47;21065:4;21055:8;21051:19;21045:4;21131:5;21161:8;21151:2;;-1:-1:-1;21202:1:1;21216:5;;21151:2;21250:4;21240:2;;-1:-1:-1;21287:1:1;21301:5;;21240:2;21332:4;21350:1;21345:59;;;;21418:1;21413:130;;;;21325:218;;21345:59;21375:1;21366:10;;21389:5;;;21413:130;21450:3;21440:8;21437:17;21434:2;;;21457:18;;:::i;:::-;-1:-1:-1;;21513:1:1;21499:16;;21528:5;;21325:218;;21627:2;21617:8;21614:16;21608:3;21602:4;21599:13;21595:36;21589:2;21579:8;21576:16;21571:2;21565:4;21562:12;21558:35;21555:77;21552:2;;;-1:-1:-1;21664:19:1;;;21696:5;;21552:2;21743:34;21768:8;21762:4;21743:34;:::i;:::-;21813:6;21809:1;21805:6;21801:19;21792:7;21789:32;21786:2;;;21824:18;;:::i;:::-;21862:20;;21141:747;-1:-1:-1;;;21141:747:1:o;21893:168::-;21933:7;21999:1;21995;21991:6;21987:14;21984:1;21981:21;21976:1;21969:9;21962:17;21958:45;21955:2;;;22006:18;;:::i;:::-;-1:-1:-1;22046:9:1;;21945:116::o;22066:258::-;22138:1;22148:113;22162:6;22159:1;22156:13;22148:113;;;22238:11;;;22232:18;22219:11;;;22212:39;22184:2;22177:10;22148:113;;;22279:6;22276:1;22273:13;22270:2;;;-1:-1:-1;;22314:1:1;22296:16;;22289:27;22119:205::o;22329:136::-;22368:3;22396:5;22386:2;;22405:18;;:::i;:::-;-1:-1:-1;;;22441:18:1;;22376:89::o;22470:380::-;22549:1;22545:12;;;;22592;;;22613:2;;22667:4;22659:6;22655:17;22645:27;;22613:2;22720;22712:6;22709:14;22689:18;22686:38;22683:2;;;22766:10;22761:3;22757:20;22754:1;22747:31;22801:4;22798:1;22791:15;22829:4;22826:1;22819:15;22683:2;;22525:325;;;:::o;22855:135::-;22894:3;-1:-1:-1;;22915:17:1;;22912:2;;;22935:18;;:::i;:::-;-1:-1:-1;22982:1:1;22971:13;;22902:88::o;22995:127::-;23056:10;23051:3;23047:20;23044:1;23037:31;23087:4;23084:1;23077:15;23111:4;23108:1;23101:15;23127:131;-1:-1:-1;;;;;23202:31:1;;23192:42;;23182:2;;23248:1;23245;23238:12
Swarm Source
ipfs://10e8975a797cb9c8ae96213bba76d34f3df3973e3eba674ac12048bcea93acbd
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.