ERC-1155
Overview
Max Total Supply
2,684
Holders
434
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PSG_ERC1155
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-19 */ // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { 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/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @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/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @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 Pausable is Context { /** * @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. */ constructor() { _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(), "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(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @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 ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.6.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @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 AccessControl is Context, IAccessControl, ERC165 { 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); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @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 virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.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 virtual 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 revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "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}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ 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); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: nftTimelock.sol pragma solidity ^0.8.0; /** * @dev Lock specified account until designated unixtime. */ contract NftTimelock is Context, AccessControl { bytes32 public constant TIMELOCKER_ROLE = keccak256("TIMELOCKER_ROLE"); /** * @dev {NFT ID} cannot be transfered until {uint256} epoch. */ mapping(uint256 => uint256) private _timelock; /** * @dev When account's address is locked up, this event is emitted. */ event Timelock(uint256 indexed nftId, uint256 timelockUntil); /** * @dev Throws if called by locked NFT ID. */ modifier notTimelocked(uint256[] memory _nftIds) { for (uint256 i = 0; i < _nftIds.length; i++){ require(!isLocked(_nftIds[i]), "NFT Timelock: NFT is locked."); } _; } /** * @dev Throws if called by un-locked NFT ID. */ modifier timelocked(uint256[] memory _nftIds) { for (uint256 i = 0; i < _nftIds.length; i++){ require(isLocked(_nftIds[i]), "NFT Timelock: NFT is not locked."); } _; } /** * @dev Check if the NFT ID is locked or not. Return true if the NFT is locked. */ function isLocked(uint256 _nftId) public view returns (bool) { if (_timelock[_nftId] <= block.timestamp) { return false; } return true; } /** * @dev Return the timelock of NFT ID. */ function timelockOf(uint256 _nftId) public view returns (uint256) { return _timelock[_nftId]; } /** * @dev Set a timelock for NFT ID */ function setTimelock(uint256 _nftId, uint256 _lockupTimeUntil) public onlyRole(TIMELOCKER_ROLE) { _timelock[_nftId] = _lockupTimeUntil; emit Timelock(_nftId, _lockupTimeUntil); } /** * @dev Set a timelock for some NFT IDs at the same time. */ function setTimelockBatch(uint256[] memory _nftIds, uint256 _lockupTimeUntil) public onlyRole(TIMELOCKER_ROLE) { for (uint256 i = 0; i < _nftIds.length; i++) { setTimelock(_nftIds[i], _lockupTimeUntil); } } } // File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC1155} that allows token holders to destroy both their * own tokens and those that they have been approved to use. * * _Available since v3.1._ */ abstract contract ERC1155Burnable is ERC1155 { function burn( address account, uint256 id, uint256 value ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not owner nor approved" ); _burn(account, id, value); } function burnBatch( address account, uint256[] memory ids, uint256[] memory values ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not owner nor approved" ); _burnBatch(account, ids, values); } } // File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol) pragma solidity ^0.8.0; /** * @dev Extension of ERC1155 that adds tracking of total supply per id. * * Useful for scenarios where Fungible and Non-fungible tokens have to be * clearly identified. Note: While a totalSupply of 1 might mean the * corresponding is an NFT, there is no guarantees that no other token with the * same id are not going to be minted. */ abstract contract ERC1155Supply is ERC1155 { mapping(uint256 => uint256) private _totalSupply; /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view virtual returns (uint256) { return _totalSupply[id]; } /** * @dev Indicates whether any token exist with a given id, or not. */ function exists(uint256 id) public view virtual returns (bool) { return ERC1155Supply.totalSupply(id) > 0; } /** * @dev See {ERC1155-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 supply = _totalSupply[id]; require(supply >= amount, "ERC1155: burn amount exceeds totalSupply"); unchecked { _totalSupply[id] = supply - amount; } } } } } // File: PSG_ERC1155.sol pragma solidity ^0.8.4; contract PSG_ERC1155 is ERC1155, ERC1155Supply, ERC1155Burnable, AccessControl, Pausable, Ownable, NftTimelock { bytes32 public constant URI_SETTER_ROLE = keccak256("URI_SETTER_ROLE"); bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); // Token name to secure the compatilibity with ERC721) string private _name = "Paris Saint-Germain JAPAN TOUR 2022"; // Token URIs (tokenId => tokenURI) // URI should be full-length including prefix and suffix (https://example.com/xxxx.json) mapping(uint256 => string) private _tokenURIs; constructor() ERC1155("") { _grantRole(DEFAULT_ADMIN_ROLE, _msgSender()); _grantRole(URI_SETTER_ROLE, _msgSender()); _grantRole(PAUSER_ROLE, _msgSender()); _grantRole(MINTER_ROLE, _msgSender()); _grantRole(TIMELOCKER_ROLE, _msgSender()); } function uri(uint256 tokenId) public view virtual override returns (string memory) { require(totalSupply(tokenId) != 0, "URI query for nonexistent token"); return _tokenURIs[tokenId]; } function setURI(uint256 tokenId, string memory _uri) public onlyRole(URI_SETTER_ROLE) { require(totalSupply(tokenId) != 0, "URI set of nonexistent token"); _tokenURIs[tokenId] = _uri; } function name() public view virtual returns (string memory) { return _name; } function pause() public onlyRole(PAUSER_ROLE) { _pause(); } function unpause() public onlyRole(PAUSER_ROLE) { _unpause(); } function mint(address account, uint256 id, uint256 amount, bytes memory data) public onlyRole(MINTER_ROLE) { _mint(account, id, amount, data); } function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) public onlyRole(MINTER_ROLE) { _mintBatch(to, ids, amounts, data); } function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal whenNotPaused notTimelocked(ids) override(ERC1155, ERC1155Supply) { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); } // The following functions are overrides required by Solidity. function supportsInterface(bytes4 interfaceId) public view override(ERC1155, AccessControl) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"uint256","name":"nftId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timelockUntil","type":"uint256"}],"name":"Timelock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","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":"TIMELOCKER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"URI_SETTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"isLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"},{"internalType":"uint256","name":"_lockupTimeUntil","type":"uint256"}],"name":"setTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_nftIds","type":"uint256[]"},{"internalType":"uint256","name":"_lockupTimeUntil","type":"uint256"}],"name":"setTimelockBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"timelockOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526040518060600160405280602381526020016200593560239139600790805190602001906200003592919062000416565b503480156200004357600080fd5b50604051806020016040528060008152506200006581620001cf60201b60201c565b506000600560006101000a81548160ff021916908315150217905550620000a162000095620001eb60201b60201c565b620001f360201b60201c565b620000c56000801b620000b9620001eb60201b60201c565b620002b960201b60201c565b620001067f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c620000fa620001eb60201b60201c565b620002b960201b60201c565b620001477f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6200013b620001eb60201b60201c565b620002b960201b60201c565b620001887f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66200017c620001eb60201b60201c565b620002b960201b60201c565b620001c97f518a492b51bf88c1be675ab97647d88d770fcd201b74de363b9b137e6d641b20620001bd620001eb60201b60201c565b620002b960201b60201c565b6200052b565b8060029080519060200190620001e792919062000416565b5050565b600033905090565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002cb8282620003ab60201b60201c565b620003a75760016004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200034c620001eb60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8280546200042490620004c6565b90600052602060002090601f01602090048101928262000448576000855562000494565b82601f106200046357805160ff191683800117855562000494565b8280016001018555821562000494579182015b828111156200049357825182559160200191906001019062000476565b5b509050620004a39190620004a7565b5090565b5b80821115620004c2576000816000905550600101620004a8565b5090565b60006002820490506001821680620004df57607f821691505b60208210811415620004f657620004f5620004fc565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6153fa806200053b6000396000f3fe608060405234801561001057600080fd5b506004361061021b5760003560e01c80637f34571011610125578063c8abf6da116100ad578063e985e9c51161007c578063e985e9c514610612578063f242432a14610642578063f2fde38b1461065e578063f5298aca1461067a578063f6aacfb1146106965761021b565b8063c8abf6da1461059e578063d5391393146105ba578063d547741f146105d8578063e63ab1e9146105f45761021b565b806391d14854116100f457806391d14854146104d4578063a217fddf14610504578063a22cb46514610522578063bd85b0391461053e578063bef194641461056e5761021b565b80637f345710146104725780638456cb5914610490578063862440e21461049a5780638da5cb5b146104b65761021b565b806336568abe116101a85780635c975abb116101775780635c975abb146103f45780636b20c454146104125780636dc5d2481461042e578063715018a61461044c578063731133e9146104565761021b565b806336568abe1461036e5780633f4ba83a1461038a5780634e1273f4146103945780634f558e79146103c45761021b565b80631f7fdffa116101ef5780631f7fdffa146102ce578063248a9ca3146102ea57806328bd291c1461031a5780632eb2c2d6146103365780632f2ff15d146103525761021b565b8062fdd58e1461022057806301ffc9a71461025057806306fdde03146102805780630e89341c1461029e575b600080fd5b61023a60048036038101906102359190613a6f565b6106c6565b6040516102479190614760565b60405180910390f35b61026a60048036038101906102659190613cc6565b61078f565b6040516102779190614428565b60405180910390f35b6102886107a1565b604051610295919061445e565b60405180910390f35b6102b860048036038101906102b39190613d20565b610833565b6040516102c5919061445e565b60405180910390f35b6102e860048036038101906102e39190613974565b610924565b005b61030460048036038101906102ff9190613c59565b610961565b6040516103119190614443565b60405180910390f35b610334600480360381019061032f9190613bfd565b610981565b005b610350600480360381019061034b9190613783565b6109f4565b005b61036c60048036038101906103679190613c86565b610a95565b005b61038860048036038101906103839190613c86565b610ab6565b005b610392610b39565b005b6103ae60048036038101906103a99190613b85565b610b6e565b6040516103bb91906143cf565b60405180910390f35b6103de60048036038101906103d99190613d20565b610c87565b6040516103eb9190614428565b60405180910390f35b6103fc610c9b565b6040516104099190614428565b60405180910390f35b61042c600480360381019061042791906138e9565b610cb2565b005b610436610d4f565b6040516104439190614443565b60405180910390f35b610454610d73565b005b610470600480360381019061046b9190613b02565b610dfb565b005b61047a610e38565b6040516104879190614443565b60405180910390f35b610498610e5c565b005b6104b460048036038101906104af9190613d4d565b610e91565b005b6104be610f34565b6040516104cb91906142f2565b60405180910390f35b6104ee60048036038101906104e99190613c86565b610f5e565b6040516104fb9190614428565b60405180910390f35b61050c610fc9565b6040516105199190614443565b60405180910390f35b61053c60048036038101906105379190613a2f565b610fd0565b005b61055860048036038101906105539190613d20565b610fe6565b6040516105659190614760565b60405180910390f35b61058860048036038101906105839190613d20565b611003565b6040516105959190614760565b60405180910390f35b6105b860048036038101906105b39190613da9565b611020565b005b6105c261109f565b6040516105cf9190614443565b60405180910390f35b6105f260048036038101906105ed9190613c86565b6110c3565b005b6105fc6110e4565b6040516106099190614443565b60405180910390f35b61062c60048036038101906106279190613743565b611108565b6040516106399190614428565b60405180910390f35b61065c60048036038101906106579190613852565b61119c565b005b61067860048036038101906106739190613716565b61123d565b005b610694600480360381019061068f9190613aaf565b611335565b005b6106b060048036038101906106ab9190613d20565b6113d2565b6040516106bd9190614428565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072e90614520565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061079a82611401565b9050919050565b6060600780546107b090614a99565b80601f01602080910402602001604051908101604052809291908181526020018280546107dc90614a99565b80156108295780601f106107fe57610100808354040283529160200191610829565b820191906000526020600020905b81548152906001019060200180831161080c57829003601f168201915b5050505050905090565b6060600061084083610fe6565b1415610881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087890614500565b60405180910390fd5b60086000838152602001908152602001600020805461089f90614a99565b80601f01602080910402602001604051908101604052809291908181526020018280546108cb90614a99565b80156109185780601f106108ed57610100808354040283529160200191610918565b820191906000526020600020905b8154815290600101906020018083116108fb57829003601f168201915b50505050509050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661094e8161147b565b61095a8585858561148f565b5050505050565b600060046000838152602001908152602001600020600101549050919050565b7f518a492b51bf88c1be675ab97647d88d770fcd201b74de363b9b137e6d641b206109ab8161147b565b60005b83518110156109ee576109db8482815181106109cd576109cc614ba3565b5b602002602001015184611020565b80806109e690614afc565b9150506109ae565b50505050565b6109fc6116bc565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610a425750610a4185610a3c6116bc565b611108565b5b610a81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a78906145e0565b60405180910390fd5b610a8e85858585856116c4565b5050505050565b610a9e82610961565b610aa78161147b565b610ab183836119e6565b505050565b610abe6116bc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2290614740565b60405180910390fd5b610b358282611ac7565b5050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610b638161147b565b610b6b611ba9565b50565b60608151835114610bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bab906146e0565b60405180910390fd5b6000835167ffffffffffffffff811115610bd157610bd0614bd2565b5b604051908082528060200260200182016040528015610bff5781602001602082028036833780820191505090505b50905060005b8451811015610c7c57610c4c858281518110610c2457610c23614ba3565b5b6020026020010151858381518110610c3f57610c3e614ba3565b5b60200260200101516106c6565b828281518110610c5f57610c5e614ba3565b5b60200260200101818152505080610c7590614afc565b9050610c05565b508091505092915050565b600080610c9383610fe6565b119050919050565b6000600560009054906101000a900460ff16905090565b610cba6116bc565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610d005750610cff83610cfa6116bc565b611108565b5b610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3690614580565b60405180910390fd5b610d4a838383611c4b565b505050565b7f518a492b51bf88c1be675ab97647d88d770fcd201b74de363b9b137e6d641b2081565b610d7b6116bc565b73ffffffffffffffffffffffffffffffffffffffff16610d99610f34565b73ffffffffffffffffffffffffffffffffffffffff1614610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de690614660565b60405180910390fd5b610df96000611f1a565b565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610e258161147b565b610e3185858585611fe0565b5050505050565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c81565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610e868161147b565b610e8e612191565b50565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c610ebb8161147b565b6000610ec684610fe6565b1415610f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efe906146a0565b60405180910390fd5b81600860008581526020019081526020016000209080519060200190610f2e9291906133d9565b50505050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b610fe2610fdb6116bc565b8383612234565b5050565b600060036000838152602001908152602001600020549050919050565b600060066000838152602001908152602001600020549050919050565b7f518a492b51bf88c1be675ab97647d88d770fcd201b74de363b9b137e6d641b2061104a8161147b565b816006600085815260200190815260200160002081905550827f1444b1ec628110b153b1e97d60cdf7ed8cd28664b1e53e8b6d4043795452939f836040516110929190614760565b60405180910390a2505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6110cc82610961565b6110d58161147b565b6110df8383611ac7565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111a46116bc565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806111ea57506111e9856111e46116bc565b611108565b5b611229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122090614580565b60405180910390fd5b61123685858585856123a1565b5050505050565b6112456116bc565b73ffffffffffffffffffffffffffffffffffffffff16611263610f34565b73ffffffffffffffffffffffffffffffffffffffff16146112b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b090614660565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611329576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132090614540565b60405180910390fd5b61133281611f1a565b50565b61133d6116bc565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061138357506113828361137d6116bc565b611108565b5b6113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b990614580565b60405180910390fd5b6113cd83838361263d565b505050565b6000426006600084815260200190815260200160002054116113f757600090506113fc565b600190505b919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611474575061147382612884565b5b9050919050565b61148c816114876116bc565b612966565b50565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f690614720565b60405180910390fd5b8151835114611543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153a90614700565b60405180910390fd5b600061154d6116bc565b905061155e81600087878787612a03565b60005b84518110156116175783818151811061157d5761157c614ba3565b5b602002602001015160008087848151811061159b5761159a614ba3565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115fd91906148ff565b92505081905550808061160f90614afc565b915050611561565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161168f9291906143f1565b60405180910390a46116a681600087878787612ae6565b6116b581600087878787612aee565b5050505050565b600033905090565b8151835114611708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ff90614700565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176f906145c0565b60405180910390fd5b60006117826116bc565b9050611792818787878787612a03565b60005b84518110156119435760008582815181106117b3576117b2614ba3565b5b6020026020010151905060008583815181106117d2576117d1614ba3565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186a90614620565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461192891906148ff565b925050819055505050508061193c90614afc565b9050611795565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516119ba9291906143f1565b60405180910390a46119d0818787878787612ae6565b6119de818787878787612aee565b505050505050565b6119f08282610f5e565b611ac35760016004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611a686116bc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611ad18282610f5e565b15611ba55760006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b4a6116bc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611bb1610c9b565b611bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be7906144e0565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611c346116bc565b604051611c4191906142f2565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb290614600565b60405180910390fd5b8051825114611cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf690614700565b60405180910390fd5b6000611d096116bc565b9050611d2981856000868660405180602001604052806000815250612a03565b60005b8351811015611e76576000848281518110611d4a57611d49614ba3565b5b602002602001015190506000848381518110611d6957611d68614ba3565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0190614560565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611e6e90614afc565b915050611d2c565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611eee9291906143f1565b60405180910390a4611f1481856000868660405180602001604052806000815250612ae6565b50505050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204790614720565b60405180910390fd5b600061205a6116bc565b9050600061206785612cd5565b9050600061207485612cd5565b905061208583600089858589612a03565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120e491906148ff565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62898960405161216292919061477b565b60405180910390a461217983600089858589612ae6565b61218883600089898989612d4f565b50505050505050565b612199610c9b565b156121d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d0906145a0565b60405180910390fd5b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861221d6116bc565b60405161222a91906142f2565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229a906146c0565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123949190614428565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612411576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612408906145c0565b60405180910390fd5b600061241b6116bc565b9050600061242885612cd5565b9050600061243585612cd5565b9050612445838989858589612a03565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156124dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d390614620565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461259191906148ff565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161260e92919061477b565b60405180910390a4612624848a8a86868a612ae6565b612632848a8a8a8a8a612d4f565b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a490614600565b60405180910390fd5b60006126b76116bc565b905060006126c484612cd5565b905060006126d184612cd5565b90506126f183876000858560405180602001604052806000815250612a03565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277f90614560565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62898960405161285592919061477b565b60405180910390a461287b84886000868660405180602001604052806000815250612ae6565b50505050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061294f57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061295f575061295e82612f36565b5b9050919050565b6129708282610f5e565b6129ff576129958173ffffffffffffffffffffffffffffffffffffffff166014612fa0565b6129a38360001c6020612fa0565b6040516020016129b49291906142b8565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f6919061445e565b60405180910390fd5b5050565b612a0b610c9b565b15612a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a42906145a0565b60405180910390fd5b8260005b8151811015612ace57612a7b828281518110612a6e57612a6d614ba3565b5b60200260200101516113d2565b15612abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab290614640565b60405180910390fd5b8080612ac690614afc565b915050612a4f565b50612add8787878787876131dc565b50505050505050565b505050505050565b612b0d8473ffffffffffffffffffffffffffffffffffffffff166133ae565b15612ccd578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612b5395949392919061430d565b602060405180830381600087803b158015612b6d57600080fd5b505af1925050508015612b9e57506040513d601f19601f82011682018060405250810190612b9b9190613cf3565b60015b612c4457612baa614c01565b806308c379a01415612c075750612bbf6152bb565b80612bca5750612c09565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfe919061445e565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3b90614480565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc2906144c0565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff811115612cf457612cf3614bd2565b5b604051908082528060200260200182016040528015612d225781602001602082028036833780820191505090505b5090508281600081518110612d3a57612d39614ba3565b5b60200260200101818152505080915050919050565b612d6e8473ffffffffffffffffffffffffffffffffffffffff166133ae565b15612f2e578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612db4959493929190614375565b602060405180830381600087803b158015612dce57600080fd5b505af1925050508015612dff57506040513d601f19601f82011682018060405250810190612dfc9190613cf3565b60015b612ea557612e0b614c01565b806308c379a01415612e685750612e206152bb565b80612e2b5750612e6a565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5f919061445e565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9c90614480565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f23906144c0565b60405180910390fd5b505b505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b606060006002836002612fb39190614955565b612fbd91906148ff565b67ffffffffffffffff811115612fd657612fd5614bd2565b5b6040519080825280601f01601f1916602001820160405280156130085781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106130405761303f614ba3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106130a4576130a3614ba3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026130e49190614955565b6130ee91906148ff565b90505b600181111561318e577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106131305761312f614ba3565b5b1a60f81b82828151811061314757613146614ba3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061318790614a6f565b90506130f1565b50600084146131d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c9906144a0565b60405180910390fd5b8091505092915050565b6131ea8686868686866133d1565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561329c5760005b835181101561329a5782818151811061323e5761323d614ba3565b5b60200260200101516003600086848151811061325d5761325c614ba3565b5b60200260200101518152602001908152602001600020600082825461328291906148ff565b925050819055508061329390614afc565b9050613222565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156133a65760005b83518110156133a45760008482815181106132f2576132f1614ba3565b5b60200260200101519050600084838151811061331157613310614ba3565b5b6020026020010151905060006003600084815260200190815260200160002054905081811015613376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161336d90614680565b60405180910390fd5b81810360036000858152602001908152602001600020819055505050508061339d90614afc565b90506132d4565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050505050565b8280546133e590614a99565b90600052602060002090601f016020900481019282613407576000855561344e565b82601f1061342057805160ff191683800117855561344e565b8280016001018555821561344e579182015b8281111561344d578251825591602001919060010190613432565b5b50905061345b919061345f565b5090565b5b80821115613478576000816000905550600101613460565b5090565b600061348f61348a846147c9565b6147a4565b905080838252602082019050828560208602820111156134b2576134b1614c28565b5b60005b858110156134e257816134c888826135e0565b8452602084019350602083019250506001810190506134b5565b5050509392505050565b60006134ff6134fa846147f5565b6147a4565b9050808382526020820190508285602086028201111561352257613521614c28565b5b60005b8581101561355257816135388882613701565b845260208401935060208301925050600181019050613525565b5050509392505050565b600061356f61356a84614821565b6147a4565b90508281526020810184848401111561358b5761358a614c2d565b5b613596848285614a2d565b509392505050565b60006135b16135ac84614852565b6147a4565b9050828152602081018484840111156135cd576135cc614c2d565b5b6135d8848285614a2d565b509392505050565b6000813590506135ef81615351565b92915050565b600082601f83011261360a57613609614c23565b5b813561361a84826020860161347c565b91505092915050565b600082601f83011261363857613637614c23565b5b81356136488482602086016134ec565b91505092915050565b60008135905061366081615368565b92915050565b6000813590506136758161537f565b92915050565b60008135905061368a81615396565b92915050565b60008151905061369f81615396565b92915050565b600082601f8301126136ba576136b9614c23565b5b81356136ca84826020860161355c565b91505092915050565b600082601f8301126136e8576136e7614c23565b5b81356136f884826020860161359e565b91505092915050565b600081359050613710816153ad565b92915050565b60006020828403121561372c5761372b614c37565b5b600061373a848285016135e0565b91505092915050565b6000806040838503121561375a57613759614c37565b5b6000613768858286016135e0565b9250506020613779858286016135e0565b9150509250929050565b600080600080600060a0868803121561379f5761379e614c37565b5b60006137ad888289016135e0565b95505060206137be888289016135e0565b945050604086013567ffffffffffffffff8111156137df576137de614c32565b5b6137eb88828901613623565b935050606086013567ffffffffffffffff81111561380c5761380b614c32565b5b61381888828901613623565b925050608086013567ffffffffffffffff81111561383957613838614c32565b5b613845888289016136a5565b9150509295509295909350565b600080600080600060a0868803121561386e5761386d614c37565b5b600061387c888289016135e0565b955050602061388d888289016135e0565b945050604061389e88828901613701565b93505060606138af88828901613701565b925050608086013567ffffffffffffffff8111156138d0576138cf614c32565b5b6138dc888289016136a5565b9150509295509295909350565b60008060006060848603121561390257613901614c37565b5b6000613910868287016135e0565b935050602084013567ffffffffffffffff81111561393157613930614c32565b5b61393d86828701613623565b925050604084013567ffffffffffffffff81111561395e5761395d614c32565b5b61396a86828701613623565b9150509250925092565b6000806000806080858703121561398e5761398d614c37565b5b600061399c878288016135e0565b945050602085013567ffffffffffffffff8111156139bd576139bc614c32565b5b6139c987828801613623565b935050604085013567ffffffffffffffff8111156139ea576139e9614c32565b5b6139f687828801613623565b925050606085013567ffffffffffffffff811115613a1757613a16614c32565b5b613a23878288016136a5565b91505092959194509250565b60008060408385031215613a4657613a45614c37565b5b6000613a54858286016135e0565b9250506020613a6585828601613651565b9150509250929050565b60008060408385031215613a8657613a85614c37565b5b6000613a94858286016135e0565b9250506020613aa585828601613701565b9150509250929050565b600080600060608486031215613ac857613ac7614c37565b5b6000613ad6868287016135e0565b9350506020613ae786828701613701565b9250506040613af886828701613701565b9150509250925092565b60008060008060808587031215613b1c57613b1b614c37565b5b6000613b2a878288016135e0565b9450506020613b3b87828801613701565b9350506040613b4c87828801613701565b925050606085013567ffffffffffffffff811115613b6d57613b6c614c32565b5b613b79878288016136a5565b91505092959194509250565b60008060408385031215613b9c57613b9b614c37565b5b600083013567ffffffffffffffff811115613bba57613bb9614c32565b5b613bc6858286016135f5565b925050602083013567ffffffffffffffff811115613be757613be6614c32565b5b613bf385828601613623565b9150509250929050565b60008060408385031215613c1457613c13614c37565b5b600083013567ffffffffffffffff811115613c3257613c31614c32565b5b613c3e85828601613623565b9250506020613c4f85828601613701565b9150509250929050565b600060208284031215613c6f57613c6e614c37565b5b6000613c7d84828501613666565b91505092915050565b60008060408385031215613c9d57613c9c614c37565b5b6000613cab85828601613666565b9250506020613cbc858286016135e0565b9150509250929050565b600060208284031215613cdc57613cdb614c37565b5b6000613cea8482850161367b565b91505092915050565b600060208284031215613d0957613d08614c37565b5b6000613d1784828501613690565b91505092915050565b600060208284031215613d3657613d35614c37565b5b6000613d4484828501613701565b91505092915050565b60008060408385031215613d6457613d63614c37565b5b6000613d7285828601613701565b925050602083013567ffffffffffffffff811115613d9357613d92614c32565b5b613d9f858286016136d3565b9150509250929050565b60008060408385031215613dc057613dbf614c37565b5b6000613dce85828601613701565b9250506020613ddf85828601613701565b9150509250929050565b6000613df5838361429a565b60208301905092915050565b613e0a816149af565b82525050565b6000613e1b82614893565b613e2581856148c1565b9350613e3083614883565b8060005b83811015613e61578151613e488882613de9565b9750613e53836148b4565b925050600181019050613e34565b5085935050505092915050565b613e77816149c1565b82525050565b613e86816149cd565b82525050565b6000613e978261489e565b613ea181856148d2565b9350613eb1818560208601614a3c565b613eba81614c3c565b840191505092915050565b6000613ed0826148a9565b613eda81856148e3565b9350613eea818560208601614a3c565b613ef381614c3c565b840191505092915050565b6000613f09826148a9565b613f1381856148f4565b9350613f23818560208601614a3c565b80840191505092915050565b6000613f3c6034836148e3565b9150613f4782614c5a565b604082019050919050565b6000613f5f6020836148e3565b9150613f6a82614ca9565b602082019050919050565b6000613f826028836148e3565b9150613f8d82614cd2565b604082019050919050565b6000613fa56014836148e3565b9150613fb082614d21565b602082019050919050565b6000613fc8601f836148e3565b9150613fd382614d4a565b602082019050919050565b6000613feb602b836148e3565b9150613ff682614d73565b604082019050919050565b600061400e6026836148e3565b915061401982614dc2565b604082019050919050565b60006140316024836148e3565b915061403c82614e11565b604082019050919050565b60006140546029836148e3565b915061405f82614e60565b604082019050919050565b60006140776010836148e3565b915061408282614eaf565b602082019050919050565b600061409a6025836148e3565b91506140a582614ed8565b604082019050919050565b60006140bd6032836148e3565b91506140c882614f27565b604082019050919050565b60006140e06023836148e3565b91506140eb82614f76565b604082019050919050565b6000614103602a836148e3565b915061410e82614fc5565b604082019050919050565b6000614126601c836148e3565b915061413182615014565b602082019050919050565b60006141496020836148e3565b91506141548261503d565b602082019050919050565b600061416c6028836148e3565b915061417782615066565b604082019050919050565b600061418f601c836148e3565b915061419a826150b5565b602082019050919050565b60006141b26017836148f4565b91506141bd826150de565b601782019050919050565b60006141d56029836148e3565b91506141e082615107565b604082019050919050565b60006141f86029836148e3565b915061420382615156565b604082019050919050565b600061421b6028836148e3565b9150614226826151a5565b604082019050919050565b600061423e6021836148e3565b9150614249826151f4565b604082019050919050565b60006142616011836148f4565b915061426c82615243565b601182019050919050565b6000614284602f836148e3565b915061428f8261526c565b604082019050919050565b6142a381614a23565b82525050565b6142b281614a23565b82525050565b60006142c3826141a5565b91506142cf8285613efe565b91506142da82614254565b91506142e68284613efe565b91508190509392505050565b60006020820190506143076000830184613e01565b92915050565b600060a0820190506143226000830188613e01565b61432f6020830187613e01565b81810360408301526143418186613e10565b905081810360608301526143558185613e10565b905081810360808301526143698184613e8c565b90509695505050505050565b600060a08201905061438a6000830188613e01565b6143976020830187613e01565b6143a460408301866142a9565b6143b160608301856142a9565b81810360808301526143c38184613e8c565b90509695505050505050565b600060208201905081810360008301526143e98184613e10565b905092915050565b6000604082019050818103600083015261440b8185613e10565b9050818103602083015261441f8184613e10565b90509392505050565b600060208201905061443d6000830184613e6e565b92915050565b60006020820190506144586000830184613e7d565b92915050565b600060208201905081810360008301526144788184613ec5565b905092915050565b6000602082019050818103600083015261449981613f2f565b9050919050565b600060208201905081810360008301526144b981613f52565b9050919050565b600060208201905081810360008301526144d981613f75565b9050919050565b600060208201905081810360008301526144f981613f98565b9050919050565b6000602082019050818103600083015261451981613fbb565b9050919050565b6000602082019050818103600083015261453981613fde565b9050919050565b6000602082019050818103600083015261455981614001565b9050919050565b6000602082019050818103600083015261457981614024565b9050919050565b6000602082019050818103600083015261459981614047565b9050919050565b600060208201905081810360008301526145b98161406a565b9050919050565b600060208201905081810360008301526145d98161408d565b9050919050565b600060208201905081810360008301526145f9816140b0565b9050919050565b60006020820190508181036000830152614619816140d3565b9050919050565b60006020820190508181036000830152614639816140f6565b9050919050565b6000602082019050818103600083015261465981614119565b9050919050565b600060208201905081810360008301526146798161413c565b9050919050565b600060208201905081810360008301526146998161415f565b9050919050565b600060208201905081810360008301526146b981614182565b9050919050565b600060208201905081810360008301526146d9816141c8565b9050919050565b600060208201905081810360008301526146f9816141eb565b9050919050565b600060208201905081810360008301526147198161420e565b9050919050565b6000602082019050818103600083015261473981614231565b9050919050565b6000602082019050818103600083015261475981614277565b9050919050565b600060208201905061477560008301846142a9565b92915050565b600060408201905061479060008301856142a9565b61479d60208301846142a9565b9392505050565b60006147ae6147bf565b90506147ba8282614acb565b919050565b6000604051905090565b600067ffffffffffffffff8211156147e4576147e3614bd2565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156148105761480f614bd2565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561483c5761483b614bd2565b5b61484582614c3c565b9050602081019050919050565b600067ffffffffffffffff82111561486d5761486c614bd2565b5b61487682614c3c565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061490a82614a23565b915061491583614a23565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561494a57614949614b45565b5b828201905092915050565b600061496082614a23565b915061496b83614a23565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149a4576149a3614b45565b5b828202905092915050565b60006149ba82614a03565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614a5a578082015181840152602081019050614a3f565b83811115614a69576000848401525b50505050565b6000614a7a82614a23565b91506000821415614a8e57614a8d614b45565b5b600182039050919050565b60006002820490506001821680614ab157607f821691505b60208210811415614ac557614ac4614b74565b5b50919050565b614ad482614c3c565b810181811067ffffffffffffffff82111715614af357614af2614bd2565b5b80604052505050565b6000614b0782614a23565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b3a57614b39614b45565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115614c205760046000803e614c1d600051614c4d565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4e46542054696d656c6f636b3a204e4654206973206c6f636b65642e00000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b7f55524920736574206f66206e6f6e6578697374656e7420746f6b656e00000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600060443d10156152cb5761534e565b6152d36147bf565b60043d036004823e80513d602482011167ffffffffffffffff821117156152fb57505061534e565b808201805167ffffffffffffffff811115615319575050505061534e565b80602083010160043d03850181111561533657505050505061534e565b61534582602001850186614acb565b82955050505050505b90565b61535a816149af565b811461536557600080fd5b50565b615371816149c1565b811461537c57600080fd5b50565b615388816149cd565b811461539357600080fd5b50565b61539f816149d7565b81146153aa57600080fd5b50565b6153b681614a23565b81146153c157600080fd5b5056fea26469706673582212206e2e0ecfa94916712f0942d7344693a3080a820db0b0ef4592839427902b90fa64736f6c634300080700335061726973205361696e742d4765726d61696e204a4150414e20544f55522032303232
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061021b5760003560e01c80637f34571011610125578063c8abf6da116100ad578063e985e9c51161007c578063e985e9c514610612578063f242432a14610642578063f2fde38b1461065e578063f5298aca1461067a578063f6aacfb1146106965761021b565b8063c8abf6da1461059e578063d5391393146105ba578063d547741f146105d8578063e63ab1e9146105f45761021b565b806391d14854116100f457806391d14854146104d4578063a217fddf14610504578063a22cb46514610522578063bd85b0391461053e578063bef194641461056e5761021b565b80637f345710146104725780638456cb5914610490578063862440e21461049a5780638da5cb5b146104b65761021b565b806336568abe116101a85780635c975abb116101775780635c975abb146103f45780636b20c454146104125780636dc5d2481461042e578063715018a61461044c578063731133e9146104565761021b565b806336568abe1461036e5780633f4ba83a1461038a5780634e1273f4146103945780634f558e79146103c45761021b565b80631f7fdffa116101ef5780631f7fdffa146102ce578063248a9ca3146102ea57806328bd291c1461031a5780632eb2c2d6146103365780632f2ff15d146103525761021b565b8062fdd58e1461022057806301ffc9a71461025057806306fdde03146102805780630e89341c1461029e575b600080fd5b61023a60048036038101906102359190613a6f565b6106c6565b6040516102479190614760565b60405180910390f35b61026a60048036038101906102659190613cc6565b61078f565b6040516102779190614428565b60405180910390f35b6102886107a1565b604051610295919061445e565b60405180910390f35b6102b860048036038101906102b39190613d20565b610833565b6040516102c5919061445e565b60405180910390f35b6102e860048036038101906102e39190613974565b610924565b005b61030460048036038101906102ff9190613c59565b610961565b6040516103119190614443565b60405180910390f35b610334600480360381019061032f9190613bfd565b610981565b005b610350600480360381019061034b9190613783565b6109f4565b005b61036c60048036038101906103679190613c86565b610a95565b005b61038860048036038101906103839190613c86565b610ab6565b005b610392610b39565b005b6103ae60048036038101906103a99190613b85565b610b6e565b6040516103bb91906143cf565b60405180910390f35b6103de60048036038101906103d99190613d20565b610c87565b6040516103eb9190614428565b60405180910390f35b6103fc610c9b565b6040516104099190614428565b60405180910390f35b61042c600480360381019061042791906138e9565b610cb2565b005b610436610d4f565b6040516104439190614443565b60405180910390f35b610454610d73565b005b610470600480360381019061046b9190613b02565b610dfb565b005b61047a610e38565b6040516104879190614443565b60405180910390f35b610498610e5c565b005b6104b460048036038101906104af9190613d4d565b610e91565b005b6104be610f34565b6040516104cb91906142f2565b60405180910390f35b6104ee60048036038101906104e99190613c86565b610f5e565b6040516104fb9190614428565b60405180910390f35b61050c610fc9565b6040516105199190614443565b60405180910390f35b61053c60048036038101906105379190613a2f565b610fd0565b005b61055860048036038101906105539190613d20565b610fe6565b6040516105659190614760565b60405180910390f35b61058860048036038101906105839190613d20565b611003565b6040516105959190614760565b60405180910390f35b6105b860048036038101906105b39190613da9565b611020565b005b6105c261109f565b6040516105cf9190614443565b60405180910390f35b6105f260048036038101906105ed9190613c86565b6110c3565b005b6105fc6110e4565b6040516106099190614443565b60405180910390f35b61062c60048036038101906106279190613743565b611108565b6040516106399190614428565b60405180910390f35b61065c60048036038101906106579190613852565b61119c565b005b61067860048036038101906106739190613716565b61123d565b005b610694600480360381019061068f9190613aaf565b611335565b005b6106b060048036038101906106ab9190613d20565b6113d2565b6040516106bd9190614428565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072e90614520565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061079a82611401565b9050919050565b6060600780546107b090614a99565b80601f01602080910402602001604051908101604052809291908181526020018280546107dc90614a99565b80156108295780601f106107fe57610100808354040283529160200191610829565b820191906000526020600020905b81548152906001019060200180831161080c57829003601f168201915b5050505050905090565b6060600061084083610fe6565b1415610881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087890614500565b60405180910390fd5b60086000838152602001908152602001600020805461089f90614a99565b80601f01602080910402602001604051908101604052809291908181526020018280546108cb90614a99565b80156109185780601f106108ed57610100808354040283529160200191610918565b820191906000526020600020905b8154815290600101906020018083116108fb57829003601f168201915b50505050509050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661094e8161147b565b61095a8585858561148f565b5050505050565b600060046000838152602001908152602001600020600101549050919050565b7f518a492b51bf88c1be675ab97647d88d770fcd201b74de363b9b137e6d641b206109ab8161147b565b60005b83518110156109ee576109db8482815181106109cd576109cc614ba3565b5b602002602001015184611020565b80806109e690614afc565b9150506109ae565b50505050565b6109fc6116bc565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610a425750610a4185610a3c6116bc565b611108565b5b610a81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a78906145e0565b60405180910390fd5b610a8e85858585856116c4565b5050505050565b610a9e82610961565b610aa78161147b565b610ab183836119e6565b505050565b610abe6116bc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2290614740565b60405180910390fd5b610b358282611ac7565b5050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610b638161147b565b610b6b611ba9565b50565b60608151835114610bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bab906146e0565b60405180910390fd5b6000835167ffffffffffffffff811115610bd157610bd0614bd2565b5b604051908082528060200260200182016040528015610bff5781602001602082028036833780820191505090505b50905060005b8451811015610c7c57610c4c858281518110610c2457610c23614ba3565b5b6020026020010151858381518110610c3f57610c3e614ba3565b5b60200260200101516106c6565b828281518110610c5f57610c5e614ba3565b5b60200260200101818152505080610c7590614afc565b9050610c05565b508091505092915050565b600080610c9383610fe6565b119050919050565b6000600560009054906101000a900460ff16905090565b610cba6116bc565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610d005750610cff83610cfa6116bc565b611108565b5b610d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3690614580565b60405180910390fd5b610d4a838383611c4b565b505050565b7f518a492b51bf88c1be675ab97647d88d770fcd201b74de363b9b137e6d641b2081565b610d7b6116bc565b73ffffffffffffffffffffffffffffffffffffffff16610d99610f34565b73ffffffffffffffffffffffffffffffffffffffff1614610def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de690614660565b60405180910390fd5b610df96000611f1a565b565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610e258161147b565b610e3185858585611fe0565b5050505050565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c81565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610e868161147b565b610e8e612191565b50565b7f7804d923f43a17d325d77e781528e0793b2edd9890ab45fc64efd7b4b427744c610ebb8161147b565b6000610ec684610fe6565b1415610f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efe906146a0565b60405180910390fd5b81600860008581526020019081526020016000209080519060200190610f2e9291906133d9565b50505050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b610fe2610fdb6116bc565b8383612234565b5050565b600060036000838152602001908152602001600020549050919050565b600060066000838152602001908152602001600020549050919050565b7f518a492b51bf88c1be675ab97647d88d770fcd201b74de363b9b137e6d641b2061104a8161147b565b816006600085815260200190815260200160002081905550827f1444b1ec628110b153b1e97d60cdf7ed8cd28664b1e53e8b6d4043795452939f836040516110929190614760565b60405180910390a2505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6110cc82610961565b6110d58161147b565b6110df8383611ac7565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111a46116bc565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806111ea57506111e9856111e46116bc565b611108565b5b611229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122090614580565b60405180910390fd5b61123685858585856123a1565b5050505050565b6112456116bc565b73ffffffffffffffffffffffffffffffffffffffff16611263610f34565b73ffffffffffffffffffffffffffffffffffffffff16146112b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b090614660565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611329576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132090614540565b60405180910390fd5b61133281611f1a565b50565b61133d6116bc565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061138357506113828361137d6116bc565b611108565b5b6113c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b990614580565b60405180910390fd5b6113cd83838361263d565b505050565b6000426006600084815260200190815260200160002054116113f757600090506113fc565b600190505b919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611474575061147382612884565b5b9050919050565b61148c816114876116bc565b612966565b50565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f690614720565b60405180910390fd5b8151835114611543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153a90614700565b60405180910390fd5b600061154d6116bc565b905061155e81600087878787612a03565b60005b84518110156116175783818151811061157d5761157c614ba3565b5b602002602001015160008087848151811061159b5761159a614ba3565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115fd91906148ff565b92505081905550808061160f90614afc565b915050611561565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161168f9291906143f1565b60405180910390a46116a681600087878787612ae6565b6116b581600087878787612aee565b5050505050565b600033905090565b8151835114611708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ff90614700565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176f906145c0565b60405180910390fd5b60006117826116bc565b9050611792818787878787612a03565b60005b84518110156119435760008582815181106117b3576117b2614ba3565b5b6020026020010151905060008583815181106117d2576117d1614ba3565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611873576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186a90614620565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461192891906148ff565b925050819055505050508061193c90614afc565b9050611795565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516119ba9291906143f1565b60405180910390a46119d0818787878787612ae6565b6119de818787878787612aee565b505050505050565b6119f08282610f5e565b611ac35760016004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611a686116bc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611ad18282610f5e565b15611ba55760006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b4a6116bc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611bb1610c9b565b611bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be7906144e0565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611c346116bc565b604051611c4191906142f2565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb290614600565b60405180910390fd5b8051825114611cff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf690614700565b60405180910390fd5b6000611d096116bc565b9050611d2981856000868660405180602001604052806000815250612a03565b60005b8351811015611e76576000848281518110611d4a57611d49614ba3565b5b602002602001015190506000848381518110611d6957611d68614ba3565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0190614560565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611e6e90614afc565b915050611d2c565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611eee9291906143f1565b60405180910390a4611f1481856000868660405180602001604052806000815250612ae6565b50505050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612050576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204790614720565b60405180910390fd5b600061205a6116bc565b9050600061206785612cd5565b9050600061207485612cd5565b905061208583600089858589612a03565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120e491906148ff565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62898960405161216292919061477b565b60405180910390a461217983600089858589612ae6565b61218883600089898989612d4f565b50505050505050565b612199610c9b565b156121d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d0906145a0565b60405180910390fd5b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861221d6116bc565b60405161222a91906142f2565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229a906146c0565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123949190614428565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612411576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612408906145c0565b60405180910390fd5b600061241b6116bc565b9050600061242885612cd5565b9050600061243585612cd5565b9050612445838989858589612a03565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156124dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d390614620565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461259191906148ff565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161260e92919061477b565b60405180910390a4612624848a8a86868a612ae6565b612632848a8a8a8a8a612d4f565b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a490614600565b60405180910390fd5b60006126b76116bc565b905060006126c484612cd5565b905060006126d184612cd5565b90506126f183876000858560405180602001604052806000815250612a03565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277f90614560565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62898960405161285592919061477b565b60405180910390a461287b84886000868660405180602001604052806000815250612ae6565b50505050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061294f57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061295f575061295e82612f36565b5b9050919050565b6129708282610f5e565b6129ff576129958173ffffffffffffffffffffffffffffffffffffffff166014612fa0565b6129a38360001c6020612fa0565b6040516020016129b49291906142b8565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129f6919061445e565b60405180910390fd5b5050565b612a0b610c9b565b15612a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a42906145a0565b60405180910390fd5b8260005b8151811015612ace57612a7b828281518110612a6e57612a6d614ba3565b5b60200260200101516113d2565b15612abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab290614640565b60405180910390fd5b8080612ac690614afc565b915050612a4f565b50612add8787878787876131dc565b50505050505050565b505050505050565b612b0d8473ffffffffffffffffffffffffffffffffffffffff166133ae565b15612ccd578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612b5395949392919061430d565b602060405180830381600087803b158015612b6d57600080fd5b505af1925050508015612b9e57506040513d601f19601f82011682018060405250810190612b9b9190613cf3565b60015b612c4457612baa614c01565b806308c379a01415612c075750612bbf6152bb565b80612bca5750612c09565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfe919061445e565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c3b90614480565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc2906144c0565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff811115612cf457612cf3614bd2565b5b604051908082528060200260200182016040528015612d225781602001602082028036833780820191505090505b5090508281600081518110612d3a57612d39614ba3565b5b60200260200101818152505080915050919050565b612d6e8473ffffffffffffffffffffffffffffffffffffffff166133ae565b15612f2e578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612db4959493929190614375565b602060405180830381600087803b158015612dce57600080fd5b505af1925050508015612dff57506040513d601f19601f82011682018060405250810190612dfc9190613cf3565b60015b612ea557612e0b614c01565b806308c379a01415612e685750612e206152bb565b80612e2b5750612e6a565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5f919061445e565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9c90614480565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612f2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f23906144c0565b60405180910390fd5b505b505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b606060006002836002612fb39190614955565b612fbd91906148ff565b67ffffffffffffffff811115612fd657612fd5614bd2565b5b6040519080825280601f01601f1916602001820160405280156130085781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106130405761303f614ba3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106130a4576130a3614ba3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026130e49190614955565b6130ee91906148ff565b90505b600181111561318e577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106131305761312f614ba3565b5b1a60f81b82828151811061314757613146614ba3565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061318790614a6f565b90506130f1565b50600084146131d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c9906144a0565b60405180910390fd5b8091505092915050565b6131ea8686868686866133d1565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561329c5760005b835181101561329a5782818151811061323e5761323d614ba3565b5b60200260200101516003600086848151811061325d5761325c614ba3565b5b60200260200101518152602001908152602001600020600082825461328291906148ff565b925050819055508061329390614afc565b9050613222565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156133a65760005b83518110156133a45760008482815181106132f2576132f1614ba3565b5b60200260200101519050600084838151811061331157613310614ba3565b5b6020026020010151905060006003600084815260200190815260200160002054905081811015613376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161336d90614680565b60405180910390fd5b81810360036000858152602001908152602001600020819055505050508061339d90614afc565b90506132d4565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050505050565b8280546133e590614a99565b90600052602060002090601f016020900481019282613407576000855561344e565b82601f1061342057805160ff191683800117855561344e565b8280016001018555821561344e579182015b8281111561344d578251825591602001919060010190613432565b5b50905061345b919061345f565b5090565b5b80821115613478576000816000905550600101613460565b5090565b600061348f61348a846147c9565b6147a4565b905080838252602082019050828560208602820111156134b2576134b1614c28565b5b60005b858110156134e257816134c888826135e0565b8452602084019350602083019250506001810190506134b5565b5050509392505050565b60006134ff6134fa846147f5565b6147a4565b9050808382526020820190508285602086028201111561352257613521614c28565b5b60005b8581101561355257816135388882613701565b845260208401935060208301925050600181019050613525565b5050509392505050565b600061356f61356a84614821565b6147a4565b90508281526020810184848401111561358b5761358a614c2d565b5b613596848285614a2d565b509392505050565b60006135b16135ac84614852565b6147a4565b9050828152602081018484840111156135cd576135cc614c2d565b5b6135d8848285614a2d565b509392505050565b6000813590506135ef81615351565b92915050565b600082601f83011261360a57613609614c23565b5b813561361a84826020860161347c565b91505092915050565b600082601f83011261363857613637614c23565b5b81356136488482602086016134ec565b91505092915050565b60008135905061366081615368565b92915050565b6000813590506136758161537f565b92915050565b60008135905061368a81615396565b92915050565b60008151905061369f81615396565b92915050565b600082601f8301126136ba576136b9614c23565b5b81356136ca84826020860161355c565b91505092915050565b600082601f8301126136e8576136e7614c23565b5b81356136f884826020860161359e565b91505092915050565b600081359050613710816153ad565b92915050565b60006020828403121561372c5761372b614c37565b5b600061373a848285016135e0565b91505092915050565b6000806040838503121561375a57613759614c37565b5b6000613768858286016135e0565b9250506020613779858286016135e0565b9150509250929050565b600080600080600060a0868803121561379f5761379e614c37565b5b60006137ad888289016135e0565b95505060206137be888289016135e0565b945050604086013567ffffffffffffffff8111156137df576137de614c32565b5b6137eb88828901613623565b935050606086013567ffffffffffffffff81111561380c5761380b614c32565b5b61381888828901613623565b925050608086013567ffffffffffffffff81111561383957613838614c32565b5b613845888289016136a5565b9150509295509295909350565b600080600080600060a0868803121561386e5761386d614c37565b5b600061387c888289016135e0565b955050602061388d888289016135e0565b945050604061389e88828901613701565b93505060606138af88828901613701565b925050608086013567ffffffffffffffff8111156138d0576138cf614c32565b5b6138dc888289016136a5565b9150509295509295909350565b60008060006060848603121561390257613901614c37565b5b6000613910868287016135e0565b935050602084013567ffffffffffffffff81111561393157613930614c32565b5b61393d86828701613623565b925050604084013567ffffffffffffffff81111561395e5761395d614c32565b5b61396a86828701613623565b9150509250925092565b6000806000806080858703121561398e5761398d614c37565b5b600061399c878288016135e0565b945050602085013567ffffffffffffffff8111156139bd576139bc614c32565b5b6139c987828801613623565b935050604085013567ffffffffffffffff8111156139ea576139e9614c32565b5b6139f687828801613623565b925050606085013567ffffffffffffffff811115613a1757613a16614c32565b5b613a23878288016136a5565b91505092959194509250565b60008060408385031215613a4657613a45614c37565b5b6000613a54858286016135e0565b9250506020613a6585828601613651565b9150509250929050565b60008060408385031215613a8657613a85614c37565b5b6000613a94858286016135e0565b9250506020613aa585828601613701565b9150509250929050565b600080600060608486031215613ac857613ac7614c37565b5b6000613ad6868287016135e0565b9350506020613ae786828701613701565b9250506040613af886828701613701565b9150509250925092565b60008060008060808587031215613b1c57613b1b614c37565b5b6000613b2a878288016135e0565b9450506020613b3b87828801613701565b9350506040613b4c87828801613701565b925050606085013567ffffffffffffffff811115613b6d57613b6c614c32565b5b613b79878288016136a5565b91505092959194509250565b60008060408385031215613b9c57613b9b614c37565b5b600083013567ffffffffffffffff811115613bba57613bb9614c32565b5b613bc6858286016135f5565b925050602083013567ffffffffffffffff811115613be757613be6614c32565b5b613bf385828601613623565b9150509250929050565b60008060408385031215613c1457613c13614c37565b5b600083013567ffffffffffffffff811115613c3257613c31614c32565b5b613c3e85828601613623565b9250506020613c4f85828601613701565b9150509250929050565b600060208284031215613c6f57613c6e614c37565b5b6000613c7d84828501613666565b91505092915050565b60008060408385031215613c9d57613c9c614c37565b5b6000613cab85828601613666565b9250506020613cbc858286016135e0565b9150509250929050565b600060208284031215613cdc57613cdb614c37565b5b6000613cea8482850161367b565b91505092915050565b600060208284031215613d0957613d08614c37565b5b6000613d1784828501613690565b91505092915050565b600060208284031215613d3657613d35614c37565b5b6000613d4484828501613701565b91505092915050565b60008060408385031215613d6457613d63614c37565b5b6000613d7285828601613701565b925050602083013567ffffffffffffffff811115613d9357613d92614c32565b5b613d9f858286016136d3565b9150509250929050565b60008060408385031215613dc057613dbf614c37565b5b6000613dce85828601613701565b9250506020613ddf85828601613701565b9150509250929050565b6000613df5838361429a565b60208301905092915050565b613e0a816149af565b82525050565b6000613e1b82614893565b613e2581856148c1565b9350613e3083614883565b8060005b83811015613e61578151613e488882613de9565b9750613e53836148b4565b925050600181019050613e34565b5085935050505092915050565b613e77816149c1565b82525050565b613e86816149cd565b82525050565b6000613e978261489e565b613ea181856148d2565b9350613eb1818560208601614a3c565b613eba81614c3c565b840191505092915050565b6000613ed0826148a9565b613eda81856148e3565b9350613eea818560208601614a3c565b613ef381614c3c565b840191505092915050565b6000613f09826148a9565b613f1381856148f4565b9350613f23818560208601614a3c565b80840191505092915050565b6000613f3c6034836148e3565b9150613f4782614c5a565b604082019050919050565b6000613f5f6020836148e3565b9150613f6a82614ca9565b602082019050919050565b6000613f826028836148e3565b9150613f8d82614cd2565b604082019050919050565b6000613fa56014836148e3565b9150613fb082614d21565b602082019050919050565b6000613fc8601f836148e3565b9150613fd382614d4a565b602082019050919050565b6000613feb602b836148e3565b9150613ff682614d73565b604082019050919050565b600061400e6026836148e3565b915061401982614dc2565b604082019050919050565b60006140316024836148e3565b915061403c82614e11565b604082019050919050565b60006140546029836148e3565b915061405f82614e60565b604082019050919050565b60006140776010836148e3565b915061408282614eaf565b602082019050919050565b600061409a6025836148e3565b91506140a582614ed8565b604082019050919050565b60006140bd6032836148e3565b91506140c882614f27565b604082019050919050565b60006140e06023836148e3565b91506140eb82614f76565b604082019050919050565b6000614103602a836148e3565b915061410e82614fc5565b604082019050919050565b6000614126601c836148e3565b915061413182615014565b602082019050919050565b60006141496020836148e3565b91506141548261503d565b602082019050919050565b600061416c6028836148e3565b915061417782615066565b604082019050919050565b600061418f601c836148e3565b915061419a826150b5565b602082019050919050565b60006141b26017836148f4565b91506141bd826150de565b601782019050919050565b60006141d56029836148e3565b91506141e082615107565b604082019050919050565b60006141f86029836148e3565b915061420382615156565b604082019050919050565b600061421b6028836148e3565b9150614226826151a5565b604082019050919050565b600061423e6021836148e3565b9150614249826151f4565b604082019050919050565b60006142616011836148f4565b915061426c82615243565b601182019050919050565b6000614284602f836148e3565b915061428f8261526c565b604082019050919050565b6142a381614a23565b82525050565b6142b281614a23565b82525050565b60006142c3826141a5565b91506142cf8285613efe565b91506142da82614254565b91506142e68284613efe565b91508190509392505050565b60006020820190506143076000830184613e01565b92915050565b600060a0820190506143226000830188613e01565b61432f6020830187613e01565b81810360408301526143418186613e10565b905081810360608301526143558185613e10565b905081810360808301526143698184613e8c565b90509695505050505050565b600060a08201905061438a6000830188613e01565b6143976020830187613e01565b6143a460408301866142a9565b6143b160608301856142a9565b81810360808301526143c38184613e8c565b90509695505050505050565b600060208201905081810360008301526143e98184613e10565b905092915050565b6000604082019050818103600083015261440b8185613e10565b9050818103602083015261441f8184613e10565b90509392505050565b600060208201905061443d6000830184613e6e565b92915050565b60006020820190506144586000830184613e7d565b92915050565b600060208201905081810360008301526144788184613ec5565b905092915050565b6000602082019050818103600083015261449981613f2f565b9050919050565b600060208201905081810360008301526144b981613f52565b9050919050565b600060208201905081810360008301526144d981613f75565b9050919050565b600060208201905081810360008301526144f981613f98565b9050919050565b6000602082019050818103600083015261451981613fbb565b9050919050565b6000602082019050818103600083015261453981613fde565b9050919050565b6000602082019050818103600083015261455981614001565b9050919050565b6000602082019050818103600083015261457981614024565b9050919050565b6000602082019050818103600083015261459981614047565b9050919050565b600060208201905081810360008301526145b98161406a565b9050919050565b600060208201905081810360008301526145d98161408d565b9050919050565b600060208201905081810360008301526145f9816140b0565b9050919050565b60006020820190508181036000830152614619816140d3565b9050919050565b60006020820190508181036000830152614639816140f6565b9050919050565b6000602082019050818103600083015261465981614119565b9050919050565b600060208201905081810360008301526146798161413c565b9050919050565b600060208201905081810360008301526146998161415f565b9050919050565b600060208201905081810360008301526146b981614182565b9050919050565b600060208201905081810360008301526146d9816141c8565b9050919050565b600060208201905081810360008301526146f9816141eb565b9050919050565b600060208201905081810360008301526147198161420e565b9050919050565b6000602082019050818103600083015261473981614231565b9050919050565b6000602082019050818103600083015261475981614277565b9050919050565b600060208201905061477560008301846142a9565b92915050565b600060408201905061479060008301856142a9565b61479d60208301846142a9565b9392505050565b60006147ae6147bf565b90506147ba8282614acb565b919050565b6000604051905090565b600067ffffffffffffffff8211156147e4576147e3614bd2565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156148105761480f614bd2565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561483c5761483b614bd2565b5b61484582614c3c565b9050602081019050919050565b600067ffffffffffffffff82111561486d5761486c614bd2565b5b61487682614c3c565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061490a82614a23565b915061491583614a23565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561494a57614949614b45565b5b828201905092915050565b600061496082614a23565b915061496b83614a23565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156149a4576149a3614b45565b5b828202905092915050565b60006149ba82614a03565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614a5a578082015181840152602081019050614a3f565b83811115614a69576000848401525b50505050565b6000614a7a82614a23565b91506000821415614a8e57614a8d614b45565b5b600182039050919050565b60006002820490506001821680614ab157607f821691505b60208210811415614ac557614ac4614b74565b5b50919050565b614ad482614c3c565b810181811067ffffffffffffffff82111715614af357614af2614bd2565b5b80604052505050565b6000614b0782614a23565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b3a57614b39614b45565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115614c205760046000803e614c1d600051614c4d565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4e46542054696d656c6f636b3a204e4654206973206c6f636b65642e00000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b7f55524920736574206f66206e6f6e6578697374656e7420746f6b656e00000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600060443d10156152cb5761534e565b6152d36147bf565b60043d036004823e80513d602482011167ffffffffffffffff821117156152fb57505061534e565b808201805167ffffffffffffffff811115615319575050505061534e565b80602083010160043d03850181111561533657505050505061534e565b61534582602001850186614acb565b82955050505050505b90565b61535a816149af565b811461536557600080fd5b50565b615371816149c1565b811461537c57600080fd5b50565b615388816149cd565b811461539357600080fd5b50565b61539f816149d7565b81146153aa57600080fd5b50565b6153b681614a23565b81146153c157600080fd5b5056fea26469706673582212206e2e0ecfa94916712f0942d7344693a3080a820db0b0ef4592839427902b90fa64736f6c63430008070033
Deployed Bytecode Sourcemap
59723:2692:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41064:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62202:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61117:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60673:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61571:203;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25768:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31297:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43003:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26161:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27209:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61297:77;;;:::i;:::-;;41461:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58515:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9720:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57204:353;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29514:70;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7771:103;;;:::i;:::-;;61382:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59841:70;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61216:73;;;:::i;:::-;;60891:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7120:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24228:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23333:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42058:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58304:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30831:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31005:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59987:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26553:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59918:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42285:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42525:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8029:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56875:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30574:187;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41064:231;41150:7;41197:1;41178:21;;:7;:21;;;;41170:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;41265:9;:13;41275:2;41265:13;;;;;;;;;;;:22;41279:7;41265:22;;;;;;;;;;;;;;;;41258:29;;41064:231;;;;:::o;62202:210::-;62339:4;62368:36;62392:11;62368:23;:36::i;:::-;62361:43;;62202:210;;;:::o;61117:91::-;61162:13;61195:5;61188:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61117:91;:::o;60673:210::-;60741:13;60799:1;60775:20;60787:7;60775:11;:20::i;:::-;:25;;60767:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;60856:10;:19;60867:7;60856:19;;;;;;;;;;;60849:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60673:210;;;:::o;61571:203::-;60025:24;23824:16;23835:4;23824:10;:16::i;:::-;61732:34:::1;61743:2;61747:3;61752:7;61761:4;61732:10;:34::i;:::-;61571:203:::0;;;;;:::o;25768:131::-;25842:7;25869:6;:12;25876:4;25869:12;;;;;;;;;;;:22;;;25862:29;;25768:131;;;:::o;31297:242::-;29556:28;23824:16;23835:4;23824:10;:16::i;:::-;31424:9:::1;31419:113;31443:7;:14;31439:1;:18;31419:113;;;31479:41;31491:7;31499:1;31491:10;;;;;;;;:::i;:::-;;;;;;;;31503:16;31479:11;:41::i;:::-;31459:3;;;;;:::i;:::-;;;;31419:113;;;;31297:242:::0;;;:::o;43003:442::-;43244:12;:10;:12::i;:::-;43236:20;;:4;:20;;;:60;;;;43260:36;43277:4;43283:12;:10;:12::i;:::-;43260:16;:36::i;:::-;43236:60;43214:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;43385:52;43408:4;43414:2;43418:3;43423:7;43432:4;43385:22;:52::i;:::-;43003:442;;;;;:::o;26161:147::-;26244:18;26257:4;26244:12;:18::i;:::-;23824:16;23835:4;23824:10;:16::i;:::-;26275:25:::1;26286:4;26292:7;26275:10;:25::i;:::-;26161:147:::0;;;:::o;27209:218::-;27316:12;:10;:12::i;:::-;27305:23;;:7;:23;;;27297:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;27393:26;27405:4;27411:7;27393:11;:26::i;:::-;27209:218;;:::o;61297:77::-;59956:24;23824:16;23835:4;23824:10;:16::i;:::-;61356:10:::1;:8;:10::i;:::-;61297:77:::0;:::o;41461:524::-;41617:16;41678:3;:10;41659:8;:15;:29;41651:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;41747:30;41794:8;:15;41780:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41747:63;;41828:9;41823:122;41847:8;:15;41843:1;:19;41823:122;;;41903:30;41913:8;41922:1;41913:11;;;;;;;;:::i;:::-;;;;;;;;41926:3;41930:1;41926:6;;;;;;;;:::i;:::-;;;;;;;;41903:9;:30::i;:::-;41884:13;41898:1;41884:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;41864:3;;;;:::i;:::-;;;41823:122;;;;41964:13;41957:20;;;41461:524;;;;:::o;58515:122::-;58572:4;58628:1;58596:29;58622:2;58596:25;:29::i;:::-;:33;58589:40;;58515:122;;;:::o;9720:86::-;9767:4;9791:7;;;;;;;;;;;9784:14;;9720:86;:::o;57204:353::-;57380:12;:10;:12::i;:::-;57369:23;;:7;:23;;;:66;;;;57396:39;57413:7;57422:12;:10;:12::i;:::-;57396:16;:39::i;:::-;57369:66;57347:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;57517:32;57528:7;57537:3;57542:6;57517:10;:32::i;:::-;57204:353;;;:::o;29514:70::-;29556:28;29514:70;:::o;7771:103::-;7351:12;:10;:12::i;:::-;7340:23;;:7;:5;:7::i;:::-;:23;;;7332:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7836:30:::1;7863:1;7836:18;:30::i;:::-;7771:103::o:0;61382:181::-;60025:24;23824:16;23835:4;23824:10;:16::i;:::-;61523:32:::1;61529:7;61538:2;61542:6;61550:4;61523:5;:32::i;:::-;61382:181:::0;;;;;:::o;59841:70::-;59883:28;59841:70;:::o;61216:73::-;59956:24;23824:16;23835:4;23824:10;:16::i;:::-;61273:8:::1;:6;:8::i;:::-;61216:73:::0;:::o;60891:210::-;59883:28;23824:16;23835:4;23824:10;:16::i;:::-;61020:1:::1;60996:20;61008:7;60996:11;:20::i;:::-;:25;;60988:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;61089:4;61067:10;:19;61078:7;61067:19;;;;;;;;;;;:26;;;;;;;;;;;;:::i;:::-;;60891:210:::0;;;:::o;7120:87::-;7166:7;7193:6;;;;;;;;;;;7186:13;;7120:87;:::o;24228:147::-;24314:4;24338:6;:12;24345:4;24338:12;;;;;;;;;;;:20;;:29;24359:7;24338:29;;;;;;;;;;;;;;;;;;;;;;;;;24331:36;;24228:147;;;;:::o;23333:49::-;23378:4;23333:49;;;:::o;42058:155::-;42153:52;42172:12;:10;:12::i;:::-;42186:8;42196;42153:18;:52::i;:::-;42058:155;;:::o;58304:113::-;58366:7;58393:12;:16;58406:2;58393:16;;;;;;;;;;;;58386:23;;58304:113;;;:::o;30831:109::-;30888:7;30915:9;:17;30925:6;30915:17;;;;;;;;;;;;30908:24;;30831:109;;;:::o;31005:201::-;29556:28;23824:16;23835:4;23824:10;:16::i;:::-;31132::::1;31112:9;:17;31122:6;31112:17;;;;;;;;;;;:36;;;;31173:6;31164:34;31181:16;31164:34;;;;;;:::i;:::-;;;;;;;;31005:201:::0;;;:::o;59987:62::-;60025:24;59987:62;:::o;26553:149::-;26637:18;26650:4;26637:12;:18::i;:::-;23824:16;23835:4;23824:10;:16::i;:::-;26668:26:::1;26680:4;26686:7;26668:11;:26::i;:::-;26553:149:::0;;;:::o;59918:62::-;59956:24;59918:62;:::o;42285:168::-;42384:4;42408:18;:27;42427:7;42408:27;;;;;;;;;;;;;;;:37;42436:8;42408:37;;;;;;;;;;;;;;;;;;;;;;;;;42401:44;;42285:168;;;;:::o;42525:401::-;42741:12;:10;:12::i;:::-;42733:20;;:4;:20;;;:60;;;;42757:36;42774:4;42780:12;:10;:12::i;:::-;42757:16;:36::i;:::-;42733:60;42711:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;42873:45;42891:4;42897:2;42901;42905:6;42913:4;42873:17;:45::i;:::-;42525:401;;;;;:::o;8029:201::-;7351:12;:10;:12::i;:::-;7340:23;;:7;:5;:7::i;:::-;:23;;;7332:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8138:1:::1;8118:22;;:8;:22;;;;8110:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8194:28;8213:8;8194:18;:28::i;:::-;8029:201:::0;:::o;56875:321::-;57026:12;:10;:12::i;:::-;57015:23;;:7;:23;;;:66;;;;57042:39;57059:7;57068:12;:10;:12::i;:::-;57042:16;:39::i;:::-;57015:66;56993:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;57163:25;57169:7;57178:2;57182:5;57163;:25::i;:::-;56875:321;;;:::o;30574:187::-;30629:4;30672:15;30651:9;:17;30661:6;30651:17;;;;;;;;;;;;:36;30647:83;;30712:5;30705:12;;;;30647:83;30748:4;30741:11;;30574:187;;;;:::o;23932:204::-;24017:4;24056:32;24041:47;;;:11;:47;;;;:87;;;;24092:36;24116:11;24092:23;:36::i;:::-;24041:87;24034:94;;23932:204;;;:::o;24679:105::-;24746:30;24757:4;24763:12;:10;:12::i;:::-;24746:10;:30::i;:::-;24679:105;:::o;48790:813::-;48982:1;48968:16;;:2;:16;;;;48960:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;49055:7;:14;49041:3;:10;:28;49033:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;49127:16;49146:12;:10;:12::i;:::-;49127:31;;49171:66;49192:8;49210:1;49214:2;49218:3;49223:7;49232:4;49171:20;:66::i;:::-;49255:9;49250:103;49274:3;:10;49270:1;:14;49250:103;;;49331:7;49339:1;49331:10;;;;;;;;:::i;:::-;;;;;;;;49306:9;:17;49316:3;49320:1;49316:6;;;;;;;;:::i;:::-;;;;;;;;49306:17;;;;;;;;;;;:21;49324:2;49306:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;49286:3;;;;;:::i;:::-;;;;49250:103;;;;49406:2;49370:53;;49402:1;49370:53;;49384:8;49370:53;;;49410:3;49415:7;49370:53;;;;;;;:::i;:::-;;;;;;;;49436:65;49456:8;49474:1;49478:2;49482:3;49487:7;49496:4;49436:19;:65::i;:::-;49514:81;49550:8;49568:1;49572:2;49576:3;49581:7;49590:4;49514:35;:81::i;:::-;48949:654;48790:813;;;;:::o;5844:98::-;5897:7;5924:10;5917:17;;5844:98;:::o;45241:1146::-;45468:7;:14;45454:3;:10;:28;45446:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;45560:1;45546:16;;:2;:16;;;;45538:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;45617:16;45636:12;:10;:12::i;:::-;45617:31;;45661:60;45682:8;45692:4;45698:2;45702:3;45707:7;45716:4;45661:20;:60::i;:::-;45739:9;45734:421;45758:3;:10;45754:1;:14;45734:421;;;45790:10;45803:3;45807:1;45803:6;;;;;;;;:::i;:::-;;;;;;;;45790:19;;45824:14;45841:7;45849:1;45841:10;;;;;;;;:::i;:::-;;;;;;;;45824:27;;45868:19;45890:9;:13;45900:2;45890:13;;;;;;;;;;;:19;45904:4;45890:19;;;;;;;;;;;;;;;;45868:41;;45947:6;45932:11;:21;;45924:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;46080:6;46066:11;:20;46044:9;:13;46054:2;46044:13;;;;;;;;;;;:19;46058:4;46044:19;;;;;;;;;;;;;;;:42;;;;46137:6;46116:9;:13;46126:2;46116:13;;;;;;;;;;;:17;46130:2;46116:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;45775:380;;;45770:3;;;;:::i;:::-;;;45734:421;;;;46202:2;46172:47;;46196:4;46172:47;;46186:8;46172:47;;;46206:3;46211:7;46172:47;;;;;;;:::i;:::-;;;;;;;;46232:59;46252:8;46262:4;46268:2;46272:3;46277:7;46286:4;46232:19;:59::i;:::-;46304:75;46340:8;46350:4;46356:2;46360:3;46365:7;46374:4;46304:35;:75::i;:::-;45435:952;45241:1146;;;;;:::o;28710:238::-;28794:22;28802:4;28808:7;28794;:22::i;:::-;28789:152;;28865:4;28833:6;:12;28840:4;28833:12;;;;;;;;;;;:20;;:29;28854:7;28833:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;28916:12;:10;:12::i;:::-;28889:40;;28907:7;28889:40;;28901:4;28889:40;;;;;;;;;;28789:152;28710:238;;:::o;29080:239::-;29164:22;29172:4;29178:7;29164;:22::i;:::-;29160:152;;;29235:5;29203:6;:12;29210:4;29203:12;;;;;;;;;;;:20;;:29;29224:7;29203:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;29287:12;:10;:12::i;:::-;29260:40;;29278:7;29260:40;;29272:4;29260:40;;;;;;;;;;29160:152;29080:239;;:::o;10779:120::-;10323:8;:6;:8::i;:::-;10315:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;10848:5:::1;10838:7;;:15;;;;;;;;;;;;;;;;;;10869:22;10878:12;:10;:12::i;:::-;10869:22;;;;;;:::i;:::-;;;;;;;;10779:120::o:0;50864:969::-;51032:1;51016:18;;:4;:18;;;;51008:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;51107:7;:14;51093:3;:10;:28;51085:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51179:16;51198:12;:10;:12::i;:::-;51179:31;;51223:66;51244:8;51254:4;51268:1;51272:3;51277:7;51223:66;;;;;;;;;;;;:20;:66::i;:::-;51307:9;51302:373;51326:3;:10;51322:1;:14;51302:373;;;51358:10;51371:3;51375:1;51371:6;;;;;;;;:::i;:::-;;;;;;;;51358:19;;51392:14;51409:7;51417:1;51409:10;;;;;;;;:::i;:::-;;;;;;;;51392:27;;51436:19;51458:9;:13;51468:2;51458:13;;;;;;;;;;;:19;51472:4;51458:19;;;;;;;;;;;;;;;;51436:41;;51515:6;51500:11;:21;;51492:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;51642:6;51628:11;:20;51606:9;:13;51616:2;51606:13;;;;;;;;;;;:19;51620:4;51606:19;;;;;;;;;;;;;;;:42;;;;51343:332;;;51338:3;;;;;:::i;:::-;;;;51302:373;;;;51730:1;51692:55;;51716:4;51692:55;;51706:8;51692:55;;;51734:3;51739:7;51692:55;;;;;;;:::i;:::-;;;;;;;;51760:65;51780:8;51790:4;51804:1;51808:3;51813:7;51760:65;;;;;;;;;;;;:19;:65::i;:::-;50997:836;50864:969;;;:::o;8390:191::-;8464:16;8483:6;;;;;;;;;;;8464:25;;8509:8;8500:6;;:17;;;;;;;;;;;;;;;;;;8564:8;8533:40;;8554:8;8533:40;;;;;;;;;;;;8453:128;8390:191;:::o;47705:729::-;47872:1;47858:16;;:2;:16;;;;47850:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;47925:16;47944:12;:10;:12::i;:::-;47925:31;;47967:20;47990:21;48008:2;47990:17;:21::i;:::-;47967:44;;48022:24;48049:25;48067:6;48049:17;:25::i;:::-;48022:52;;48087:66;48108:8;48126:1;48130:2;48134:3;48139:7;48148:4;48087:20;:66::i;:::-;48187:6;48166:9;:13;48176:2;48166:13;;;;;;;;;;;:17;48180:2;48166:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;48246:2;48209:52;;48242:1;48209:52;;48224:8;48209:52;;;48250:2;48254:6;48209:52;;;;;;;:::i;:::-;;;;;;;;48274:65;48294:8;48312:1;48316:2;48320:3;48325:7;48334:4;48274:19;:65::i;:::-;48352:74;48383:8;48401:1;48405:2;48409;48413:6;48421:4;48352:30;:74::i;:::-;47839:595;;;47705:729;;;;:::o;10520:118::-;10046:8;:6;:8::i;:::-;10045:9;10037:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;10590:4:::1;10580:7;;:14;;;;;;;;;;;;;;;;;;10610:20;10617:12;:10;:12::i;:::-;10610:20;;;;;;:::i;:::-;;;;;;;;10520:118::o:0;51975:331::-;52130:8;52121:17;;:5;:17;;;;52113:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;52233:8;52195:18;:25;52214:5;52195:25;;;;;;;;;;;;;;;:35;52221:8;52195:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;52279:8;52257:41;;52272:5;52257:41;;;52289:8;52257:41;;;;;;:::i;:::-;;;;;;;;51975:331;;;:::o;43909:974::-;44111:1;44097:16;;:2;:16;;;;44089:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;44168:16;44187:12;:10;:12::i;:::-;44168:31;;44210:20;44233:21;44251:2;44233:17;:21::i;:::-;44210:44;;44265:24;44292:25;44310:6;44292:17;:25::i;:::-;44265:52;;44330:60;44351:8;44361:4;44367:2;44371:3;44376:7;44385:4;44330:20;:60::i;:::-;44403:19;44425:9;:13;44435:2;44425:13;;;;;;;;;;;:19;44439:4;44425:19;;;;;;;;;;;;;;;;44403:41;;44478:6;44463:11;:21;;44455:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;44603:6;44589:11;:20;44567:9;:13;44577:2;44567:13;;;;;;;;;;;:19;44581:4;44567:19;;;;;;;;;;;;;;;:42;;;;44652:6;44631:9;:13;44641:2;44631:13;;;;;;;;;;;:17;44645:2;44631:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;44707:2;44676:46;;44701:4;44676:46;;44691:8;44676:46;;;44711:2;44715:6;44676:46;;;;;;;:::i;:::-;;;;;;;;44735:59;44755:8;44765:4;44771:2;44775:3;44780:7;44789:4;44735:19;:59::i;:::-;44807:68;44838:8;44848:4;44854:2;44858;44862:6;44870:4;44807:30;:68::i;:::-;44078:805;;;;43909:974;;;;;:::o;49853:808::-;49996:1;49980:18;;:4;:18;;;;49972:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;50051:16;50070:12;:10;:12::i;:::-;50051:31;;50093:20;50116:21;50134:2;50116:17;:21::i;:::-;50093:44;;50148:24;50175:25;50193:6;50175:17;:25::i;:::-;50148:52;;50213:66;50234:8;50244:4;50258:1;50262:3;50267:7;50213:66;;;;;;;;;;;;:20;:66::i;:::-;50292:19;50314:9;:13;50324:2;50314:13;;;;;;;;;;;:19;50328:4;50314:19;;;;;;;;;;;;;;;;50292:41;;50367:6;50352:11;:21;;50344:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;50486:6;50472:11;:20;50450:9;:13;50460:2;50450:13;;;;;;;;;;;:19;50464:4;50450:19;;;;;;;;;;;;;;;:42;;;;50560:1;50521:54;;50546:4;50521:54;;50536:8;50521:54;;;50564:2;50568:6;50521:54;;;;;;;:::i;:::-;;;;;;;;50588:65;50608:8;50618:4;50632:1;50636:3;50641:7;50588:65;;;;;;;;;;;;:19;:65::i;:::-;49961:700;;;;49853:808;;;:::o;40087:310::-;40189:4;40241:26;40226:41;;;:11;:41;;;;:110;;;;40299:37;40284:52;;;:11;:52;;;;40226:110;:163;;;;40353:36;40377:11;40353:23;:36::i;:::-;40226:163;40206:183;;40087:310;;;:::o;25074:505::-;25163:22;25171:4;25177:7;25163;:22::i;:::-;25158:414;;25351:41;25379:7;25351:41;;25389:2;25351:19;:41::i;:::-;25465:38;25493:4;25485:13;;25500:2;25465:19;:38::i;:::-;25256:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25202:358;;;;;;;;;;;:::i;:::-;;;;;;;;25158:414;25074:505;;:::o;61782:342::-;10046:8;:6;:8::i;:::-;10045:9;10037:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;61987:3:::1;30022:9;30017:133;30041:7;:14;30037:1;:18;30017:133;;;30085:20;30094:7;30102:1;30094:10;;;;;;;;:::i;:::-;;;;;;;;30085:8;:20::i;:::-;30084:21;30076:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30057:3;;;;;:::i;:::-;;;;30017:133;;;;62050:66:::2;62077:8;62087:4;62093:2;62097:3;62102:7;62111:4;62050:26;:66::i;:::-;10086:1:::1;61782:342:::0;;;;;;:::o;54438:220::-;;;;;;;:::o;55418:813::-;55658:15;:2;:13;;;:15::i;:::-;55654:570;;;55711:2;55694:43;;;55738:8;55748:4;55754:3;55759:7;55768:4;55694:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55690:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;56086:6;56079:14;;;;;;;;;;;:::i;:::-;;;;;;;;55690:523;;;56135:62;;;;;;;;;;:::i;:::-;;;;;;;;55690:523;55867:48;;;55855:60;;;:8;:60;;;;55851:159;;55940:50;;;;;;;;;;:::i;:::-;;;;;;;;55851:159;55774:251;55654:570;55418:813;;;;;;:::o;56239:198::-;56305:16;56334:22;56373:1;56359:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56334:41;;56397:7;56386:5;56392:1;56386:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;56424:5;56417:12;;;56239:198;;;:::o;54666:744::-;54881:15;:2;:13;;;:15::i;:::-;54877:526;;;54934:2;54917:38;;;54956:8;54966:4;54972:2;54976:6;54984:4;54917:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54913:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;55265:6;55258:14;;;;;;;;;;;:::i;:::-;;;;;;;;54913:479;;;55314:62;;;;;;;;;;:::i;:::-;;;;;;;;54913:479;55051:43;;;55039:55;;;:8;:55;;;;55035:154;;55119:50;;;;;;;;;;:::i;:::-;;;;;;;;55035:154;54990:214;54877:526;54666:744;;;;;;:::o;21191:157::-;21276:4;21315:25;21300:40;;;:11;:40;;;;21293:47;;21191:157;;;:::o;1666:451::-;1741:13;1767:19;1812:1;1803:6;1799:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1789:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1767:47;;1825:15;:6;1832:1;1825:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1851;:6;1858:1;1851:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1882:9;1907:1;1898:6;1894:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1882:26;;1877:135;1914:1;1910;:5;1877:135;;;1949:12;1970:3;1962:5;:11;1949:25;;;;;;;:::i;:::-;;;;;1937:6;1944:1;1937:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;1999:1;1989:11;;;;;1917:3;;;;:::i;:::-;;;1877:135;;;;2039:1;2030:5;:10;2022:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2102:6;2088:21;;;1666:451;;;;:::o;58712:931::-;58951:66;58978:8;58988:4;58994:2;58998:3;59003:7;59012:4;58951:26;:66::i;:::-;59050:1;59034:18;;:4;:18;;;59030:160;;;59074:9;59069:110;59093:3;:10;59089:1;:14;59069:110;;;59153:7;59161:1;59153:10;;;;;;;;:::i;:::-;;;;;;;;59129:12;:20;59142:3;59146:1;59142:6;;;;;;;;:::i;:::-;;;;;;;;59129:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;59105:3;;;;:::i;:::-;;;59069:110;;;;59030:160;59220:1;59206:16;;:2;:16;;;59202:434;;;59244:9;59239:386;59263:3;:10;59259:1;:14;59239:386;;;59299:10;59312:3;59316:1;59312:6;;;;;;;;:::i;:::-;;;;;;;;59299:19;;59337:14;59354:7;59362:1;59354:10;;;;;;;;:::i;:::-;;;;;;;;59337:27;;59383:14;59400:12;:16;59413:2;59400:16;;;;;;;;;;;;59383:33;;59453:6;59443;:16;;59435:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;59584:6;59575;:15;59556:12;:16;59569:2;59556:16;;;;;;;;;;;:34;;;;59280:345;;;59275:3;;;;:::i;:::-;;;59239:386;;;;59202:434;58712:931;;;;;;:::o;12139:326::-;12199:4;12456:1;12434:7;:19;;;:23;12427:30;;12139:326;;;:::o;53262:221::-;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:139::-;3447:5;3485:6;3472:20;3463:29;;3501:33;3528:5;3501:33;:::i;:::-;3401:139;;;;:::o;3546:137::-;3591:5;3629:6;3616:20;3607:29;;3645:32;3671:5;3645:32;:::i;:::-;3546:137;;;;:::o;3689:141::-;3745:5;3776:6;3770:13;3761:22;;3792:32;3818:5;3792:32;:::i;:::-;3689:141;;;;:::o;3849:338::-;3904:5;3953:3;3946:4;3938:6;3934:17;3930:27;3920:122;;3961:79;;:::i;:::-;3920:122;4078:6;4065:20;4103:78;4177:3;4169:6;4162:4;4154:6;4150:17;4103:78;:::i;:::-;4094:87;;3910:277;3849:338;;;;:::o;4207:340::-;4263:5;4312:3;4305:4;4297:6;4293:17;4289:27;4279:122;;4320:79;;:::i;:::-;4279:122;4437:6;4424:20;4462:79;4537:3;4529:6;4522:4;4514:6;4510:17;4462:79;:::i;:::-;4453:88;;4269:278;4207:340;;;;:::o;4553:139::-;4599:5;4637:6;4624:20;4615:29;;4653:33;4680:5;4653:33;:::i;:::-;4553:139;;;;:::o;4698:329::-;4757:6;4806:2;4794:9;4785:7;4781:23;4777:32;4774:119;;;4812:79;;:::i;:::-;4774:119;4932:1;4957:53;5002:7;4993:6;4982:9;4978:22;4957:53;:::i;:::-;4947:63;;4903:117;4698:329;;;;:::o;5033:474::-;5101:6;5109;5158:2;5146:9;5137:7;5133:23;5129:32;5126:119;;;5164:79;;:::i;:::-;5126:119;5284:1;5309:53;5354:7;5345:6;5334:9;5330:22;5309:53;:::i;:::-;5299:63;;5255:117;5411:2;5437:53;5482:7;5473:6;5462:9;5458:22;5437:53;:::i;:::-;5427:63;;5382:118;5033:474;;;;;:::o;5513:1509::-;5667:6;5675;5683;5691;5699;5748:3;5736:9;5727:7;5723:23;5719:33;5716:120;;;5755:79;;:::i;:::-;5716:120;5875:1;5900:53;5945:7;5936:6;5925:9;5921:22;5900:53;:::i;:::-;5890:63;;5846:117;6002:2;6028:53;6073:7;6064:6;6053:9;6049:22;6028:53;:::i;:::-;6018:63;;5973:118;6158:2;6147:9;6143:18;6130:32;6189:18;6181:6;6178:30;6175:117;;;6211:79;;:::i;:::-;6175:117;6316:78;6386:7;6377:6;6366:9;6362:22;6316:78;:::i;:::-;6306:88;;6101:303;6471:2;6460:9;6456:18;6443:32;6502:18;6494:6;6491:30;6488:117;;;6524:79;;:::i;:::-;6488:117;6629:78;6699:7;6690:6;6679:9;6675:22;6629:78;:::i;:::-;6619:88;;6414:303;6784:3;6773:9;6769:19;6756:33;6816:18;6808:6;6805:30;6802:117;;;6838:79;;:::i;:::-;6802:117;6943:62;6997:7;6988:6;6977:9;6973:22;6943:62;:::i;:::-;6933:72;;6727:288;5513:1509;;;;;;;;:::o;7028:1089::-;7132:6;7140;7148;7156;7164;7213:3;7201:9;7192:7;7188:23;7184:33;7181:120;;;7220:79;;:::i;:::-;7181:120;7340:1;7365:53;7410:7;7401:6;7390:9;7386:22;7365:53;:::i;:::-;7355:63;;7311:117;7467:2;7493:53;7538:7;7529:6;7518:9;7514:22;7493:53;:::i;:::-;7483:63;;7438:118;7595:2;7621:53;7666:7;7657:6;7646:9;7642:22;7621:53;:::i;:::-;7611:63;;7566:118;7723:2;7749:53;7794:7;7785:6;7774:9;7770:22;7749:53;:::i;:::-;7739:63;;7694:118;7879:3;7868:9;7864:19;7851:33;7911:18;7903:6;7900:30;7897:117;;;7933:79;;:::i;:::-;7897:117;8038:62;8092:7;8083:6;8072:9;8068:22;8038:62;:::i;:::-;8028:72;;7822:288;7028:1089;;;;;;;;:::o;8123:1039::-;8250:6;8258;8266;8315:2;8303:9;8294:7;8290:23;8286:32;8283:119;;;8321:79;;:::i;:::-;8283:119;8441:1;8466:53;8511:7;8502:6;8491:9;8487:22;8466:53;:::i;:::-;8456:63;;8412:117;8596:2;8585:9;8581:18;8568:32;8627:18;8619:6;8616:30;8613:117;;;8649:79;;:::i;:::-;8613:117;8754:78;8824:7;8815:6;8804:9;8800:22;8754:78;:::i;:::-;8744:88;;8539:303;8909:2;8898:9;8894:18;8881:32;8940:18;8932:6;8929:30;8926:117;;;8962:79;;:::i;:::-;8926:117;9067:78;9137:7;9128:6;9117:9;9113:22;9067:78;:::i;:::-;9057:88;;8852:303;8123:1039;;;;;:::o;9168:1363::-;9313:6;9321;9329;9337;9386:3;9374:9;9365:7;9361:23;9357:33;9354:120;;;9393:79;;:::i;:::-;9354:120;9513:1;9538:53;9583:7;9574:6;9563:9;9559:22;9538:53;:::i;:::-;9528:63;;9484:117;9668:2;9657:9;9653:18;9640:32;9699:18;9691:6;9688:30;9685:117;;;9721:79;;:::i;:::-;9685:117;9826:78;9896:7;9887:6;9876:9;9872:22;9826:78;:::i;:::-;9816:88;;9611:303;9981:2;9970:9;9966:18;9953:32;10012:18;10004:6;10001:30;9998:117;;;10034:79;;:::i;:::-;9998:117;10139:78;10209:7;10200:6;10189:9;10185:22;10139:78;:::i;:::-;10129:88;;9924:303;10294:2;10283:9;10279:18;10266:32;10325:18;10317:6;10314:30;10311:117;;;10347:79;;:::i;:::-;10311:117;10452:62;10506:7;10497:6;10486:9;10482:22;10452:62;:::i;:::-;10442:72;;10237:287;9168:1363;;;;;;;:::o;10537:468::-;10602:6;10610;10659:2;10647:9;10638:7;10634:23;10630:32;10627:119;;;10665:79;;:::i;:::-;10627:119;10785:1;10810:53;10855:7;10846:6;10835:9;10831:22;10810:53;:::i;:::-;10800:63;;10756:117;10912:2;10938:50;10980:7;10971:6;10960:9;10956:22;10938:50;:::i;:::-;10928:60;;10883:115;10537:468;;;;;:::o;11011:474::-;11079:6;11087;11136:2;11124:9;11115:7;11111:23;11107:32;11104:119;;;11142:79;;:::i;:::-;11104:119;11262:1;11287:53;11332:7;11323:6;11312:9;11308:22;11287:53;:::i;:::-;11277:63;;11233:117;11389:2;11415:53;11460:7;11451:6;11440:9;11436:22;11415:53;:::i;:::-;11405:63;;11360:118;11011:474;;;;;:::o;11491:619::-;11568:6;11576;11584;11633:2;11621:9;11612:7;11608:23;11604:32;11601:119;;;11639:79;;:::i;:::-;11601:119;11759:1;11784:53;11829:7;11820:6;11809:9;11805:22;11784:53;:::i;:::-;11774:63;;11730:117;11886:2;11912:53;11957:7;11948:6;11937:9;11933:22;11912:53;:::i;:::-;11902:63;;11857:118;12014:2;12040:53;12085:7;12076:6;12065:9;12061:22;12040:53;:::i;:::-;12030:63;;11985:118;11491:619;;;;;:::o;12116:943::-;12211:6;12219;12227;12235;12284:3;12272:9;12263:7;12259:23;12255:33;12252:120;;;12291:79;;:::i;:::-;12252:120;12411:1;12436:53;12481:7;12472:6;12461:9;12457:22;12436:53;:::i;:::-;12426:63;;12382:117;12538:2;12564:53;12609:7;12600:6;12589:9;12585:22;12564:53;:::i;:::-;12554:63;;12509:118;12666:2;12692:53;12737:7;12728:6;12717:9;12713:22;12692:53;:::i;:::-;12682:63;;12637:118;12822:2;12811:9;12807:18;12794:32;12853:18;12845:6;12842:30;12839:117;;;12875:79;;:::i;:::-;12839:117;12980:62;13034:7;13025:6;13014:9;13010:22;12980:62;:::i;:::-;12970:72;;12765:287;12116:943;;;;;;;:::o;13065:894::-;13183:6;13191;13240:2;13228:9;13219:7;13215:23;13211:32;13208:119;;;13246:79;;:::i;:::-;13208:119;13394:1;13383:9;13379:17;13366:31;13424:18;13416:6;13413:30;13410:117;;;13446:79;;:::i;:::-;13410:117;13551:78;13621:7;13612:6;13601:9;13597:22;13551:78;:::i;:::-;13541:88;;13337:302;13706:2;13695:9;13691:18;13678:32;13737:18;13729:6;13726:30;13723:117;;;13759:79;;:::i;:::-;13723:117;13864:78;13934:7;13925:6;13914:9;13910:22;13864:78;:::i;:::-;13854:88;;13649:303;13065:894;;;;;:::o;13965:684::-;14058:6;14066;14115:2;14103:9;14094:7;14090:23;14086:32;14083:119;;;14121:79;;:::i;:::-;14083:119;14269:1;14258:9;14254:17;14241:31;14299:18;14291:6;14288:30;14285:117;;;14321:79;;:::i;:::-;14285:117;14426:78;14496:7;14487:6;14476:9;14472:22;14426:78;:::i;:::-;14416:88;;14212:302;14553:2;14579:53;14624:7;14615:6;14604:9;14600:22;14579:53;:::i;:::-;14569:63;;14524:118;13965:684;;;;;:::o;14655:329::-;14714:6;14763:2;14751:9;14742:7;14738:23;14734:32;14731:119;;;14769:79;;:::i;:::-;14731:119;14889:1;14914:53;14959:7;14950:6;14939:9;14935:22;14914:53;:::i;:::-;14904:63;;14860:117;14655:329;;;;:::o;14990:474::-;15058:6;15066;15115:2;15103:9;15094:7;15090:23;15086:32;15083:119;;;15121:79;;:::i;:::-;15083:119;15241:1;15266:53;15311:7;15302:6;15291:9;15287:22;15266:53;:::i;:::-;15256:63;;15212:117;15368:2;15394:53;15439:7;15430:6;15419:9;15415:22;15394:53;:::i;:::-;15384:63;;15339:118;14990:474;;;;;:::o;15470:327::-;15528:6;15577:2;15565:9;15556:7;15552:23;15548:32;15545:119;;;15583:79;;:::i;:::-;15545:119;15703:1;15728:52;15772:7;15763:6;15752:9;15748:22;15728:52;:::i;:::-;15718:62;;15674:116;15470:327;;;;:::o;15803:349::-;15872:6;15921:2;15909:9;15900:7;15896:23;15892:32;15889:119;;;15927:79;;:::i;:::-;15889:119;16047:1;16072:63;16127:7;16118:6;16107:9;16103:22;16072:63;:::i;:::-;16062:73;;16018:127;15803:349;;;;:::o;16158:329::-;16217:6;16266:2;16254:9;16245:7;16241:23;16237:32;16234:119;;;16272:79;;:::i;:::-;16234:119;16392:1;16417:53;16462:7;16453:6;16442:9;16438:22;16417:53;:::i;:::-;16407:63;;16363:117;16158:329;;;;:::o;16493:654::-;16571:6;16579;16628:2;16616:9;16607:7;16603:23;16599:32;16596:119;;;16634:79;;:::i;:::-;16596:119;16754:1;16779:53;16824:7;16815:6;16804:9;16800:22;16779:53;:::i;:::-;16769:63;;16725:117;16909:2;16898:9;16894:18;16881:32;16940:18;16932:6;16929:30;16926:117;;;16962:79;;:::i;:::-;16926:117;17067:63;17122:7;17113:6;17102:9;17098:22;17067:63;:::i;:::-;17057:73;;16852:288;16493:654;;;;;:::o;17153:474::-;17221:6;17229;17278:2;17266:9;17257:7;17253:23;17249:32;17246:119;;;17284:79;;:::i;:::-;17246:119;17404:1;17429:53;17474:7;17465:6;17454:9;17450:22;17429:53;:::i;:::-;17419:63;;17375:117;17531:2;17557:53;17602:7;17593:6;17582:9;17578:22;17557:53;:::i;:::-;17547:63;;17502:118;17153:474;;;;;:::o;17633:179::-;17702:10;17723:46;17765:3;17757:6;17723:46;:::i;:::-;17801:4;17796:3;17792:14;17778:28;;17633:179;;;;:::o;17818:118::-;17905:24;17923:5;17905:24;:::i;:::-;17900:3;17893:37;17818:118;;:::o;17972:732::-;18091:3;18120:54;18168:5;18120:54;:::i;:::-;18190:86;18269:6;18264:3;18190:86;:::i;:::-;18183:93;;18300:56;18350:5;18300:56;:::i;:::-;18379:7;18410:1;18395:284;18420:6;18417:1;18414:13;18395:284;;;18496:6;18490:13;18523:63;18582:3;18567:13;18523:63;:::i;:::-;18516:70;;18609:60;18662:6;18609:60;:::i;:::-;18599:70;;18455:224;18442:1;18439;18435:9;18430:14;;18395:284;;;18399:14;18695:3;18688:10;;18096:608;;;17972:732;;;;:::o;18710:109::-;18791:21;18806:5;18791:21;:::i;:::-;18786:3;18779:34;18710:109;;:::o;18825:118::-;18912:24;18930:5;18912:24;:::i;:::-;18907:3;18900:37;18825:118;;:::o;18949:360::-;19035:3;19063:38;19095:5;19063:38;:::i;:::-;19117:70;19180:6;19175:3;19117:70;:::i;:::-;19110:77;;19196:52;19241:6;19236:3;19229:4;19222:5;19218:16;19196:52;:::i;:::-;19273:29;19295:6;19273:29;:::i;:::-;19268:3;19264:39;19257:46;;19039:270;18949:360;;;;:::o;19315:364::-;19403:3;19431:39;19464:5;19431:39;:::i;:::-;19486:71;19550:6;19545:3;19486:71;:::i;:::-;19479:78;;19566:52;19611:6;19606:3;19599:4;19592:5;19588:16;19566:52;:::i;:::-;19643:29;19665:6;19643:29;:::i;:::-;19638:3;19634:39;19627:46;;19407:272;19315:364;;;;:::o;19685:377::-;19791:3;19819:39;19852:5;19819:39;:::i;:::-;19874:89;19956:6;19951:3;19874:89;:::i;:::-;19867:96;;19972:52;20017:6;20012:3;20005:4;19998:5;19994:16;19972:52;:::i;:::-;20049:6;20044:3;20040:16;20033:23;;19795:267;19685:377;;;;:::o;20068:366::-;20210:3;20231:67;20295:2;20290:3;20231:67;:::i;:::-;20224:74;;20307:93;20396:3;20307:93;:::i;:::-;20425:2;20420:3;20416:12;20409:19;;20068:366;;;:::o;20440:::-;20582:3;20603:67;20667:2;20662:3;20603:67;:::i;:::-;20596:74;;20679:93;20768:3;20679:93;:::i;:::-;20797:2;20792:3;20788:12;20781:19;;20440:366;;;:::o;20812:::-;20954:3;20975:67;21039:2;21034:3;20975:67;:::i;:::-;20968:74;;21051:93;21140:3;21051:93;:::i;:::-;21169:2;21164:3;21160:12;21153:19;;20812:366;;;:::o;21184:::-;21326:3;21347:67;21411:2;21406:3;21347:67;:::i;:::-;21340:74;;21423:93;21512:3;21423:93;:::i;:::-;21541:2;21536:3;21532:12;21525:19;;21184:366;;;:::o;21556:::-;21698:3;21719:67;21783:2;21778:3;21719:67;:::i;:::-;21712:74;;21795:93;21884:3;21795:93;:::i;:::-;21913:2;21908:3;21904:12;21897:19;;21556:366;;;:::o;21928:::-;22070:3;22091:67;22155:2;22150:3;22091:67;:::i;:::-;22084:74;;22167:93;22256:3;22167:93;:::i;:::-;22285:2;22280:3;22276:12;22269:19;;21928:366;;;:::o;22300:::-;22442:3;22463:67;22527:2;22522:3;22463:67;:::i;:::-;22456:74;;22539:93;22628:3;22539:93;:::i;:::-;22657:2;22652:3;22648:12;22641:19;;22300:366;;;:::o;22672:::-;22814:3;22835:67;22899:2;22894:3;22835:67;:::i;:::-;22828:74;;22911:93;23000:3;22911:93;:::i;:::-;23029:2;23024:3;23020:12;23013:19;;22672:366;;;:::o;23044:::-;23186:3;23207:67;23271:2;23266:3;23207:67;:::i;:::-;23200:74;;23283:93;23372:3;23283:93;:::i;:::-;23401:2;23396:3;23392:12;23385:19;;23044:366;;;:::o;23416:::-;23558:3;23579:67;23643:2;23638:3;23579:67;:::i;:::-;23572:74;;23655:93;23744:3;23655:93;:::i;:::-;23773:2;23768:3;23764:12;23757:19;;23416:366;;;:::o;23788:::-;23930:3;23951:67;24015:2;24010:3;23951:67;:::i;:::-;23944:74;;24027:93;24116:3;24027:93;:::i;:::-;24145:2;24140:3;24136:12;24129:19;;23788:366;;;:::o;24160:::-;24302:3;24323:67;24387:2;24382:3;24323:67;:::i;:::-;24316:74;;24399:93;24488:3;24399:93;:::i;:::-;24517:2;24512:3;24508:12;24501:19;;24160:366;;;:::o;24532:::-;24674:3;24695:67;24759:2;24754:3;24695:67;:::i;:::-;24688:74;;24771:93;24860:3;24771:93;:::i;:::-;24889:2;24884:3;24880:12;24873:19;;24532:366;;;:::o;24904:::-;25046:3;25067:67;25131:2;25126:3;25067:67;:::i;:::-;25060:74;;25143:93;25232:3;25143:93;:::i;:::-;25261:2;25256:3;25252:12;25245:19;;24904:366;;;:::o;25276:::-;25418:3;25439:67;25503:2;25498:3;25439:67;:::i;:::-;25432:74;;25515:93;25604:3;25515:93;:::i;:::-;25633:2;25628:3;25624:12;25617:19;;25276:366;;;:::o;25648:::-;25790:3;25811:67;25875:2;25870:3;25811:67;:::i;:::-;25804:74;;25887:93;25976:3;25887:93;:::i;:::-;26005:2;26000:3;25996:12;25989:19;;25648:366;;;:::o;26020:::-;26162:3;26183:67;26247:2;26242:3;26183:67;:::i;:::-;26176:74;;26259:93;26348:3;26259:93;:::i;:::-;26377:2;26372:3;26368:12;26361:19;;26020:366;;;:::o;26392:::-;26534:3;26555:67;26619:2;26614:3;26555:67;:::i;:::-;26548:74;;26631:93;26720:3;26631:93;:::i;:::-;26749:2;26744:3;26740:12;26733:19;;26392:366;;;:::o;26764:402::-;26924:3;26945:85;27027:2;27022:3;26945:85;:::i;:::-;26938:92;;27039:93;27128:3;27039:93;:::i;:::-;27157:2;27152:3;27148:12;27141:19;;26764:402;;;:::o;27172:366::-;27314:3;27335:67;27399:2;27394:3;27335:67;:::i;:::-;27328:74;;27411:93;27500:3;27411:93;:::i;:::-;27529:2;27524:3;27520:12;27513:19;;27172:366;;;:::o;27544:::-;27686:3;27707:67;27771:2;27766:3;27707:67;:::i;:::-;27700:74;;27783:93;27872:3;27783:93;:::i;:::-;27901:2;27896:3;27892:12;27885:19;;27544:366;;;:::o;27916:::-;28058:3;28079:67;28143:2;28138:3;28079:67;:::i;:::-;28072:74;;28155:93;28244:3;28155:93;:::i;:::-;28273:2;28268:3;28264:12;28257:19;;27916:366;;;:::o;28288:::-;28430:3;28451:67;28515:2;28510:3;28451:67;:::i;:::-;28444:74;;28527:93;28616:3;28527:93;:::i;:::-;28645:2;28640:3;28636:12;28629:19;;28288:366;;;:::o;28660:402::-;28820:3;28841:85;28923:2;28918:3;28841:85;:::i;:::-;28834:92;;28935:93;29024:3;28935:93;:::i;:::-;29053:2;29048:3;29044:12;29037:19;;28660:402;;;:::o;29068:366::-;29210:3;29231:67;29295:2;29290:3;29231:67;:::i;:::-;29224:74;;29307:93;29396:3;29307:93;:::i;:::-;29425:2;29420:3;29416:12;29409:19;;29068:366;;;:::o;29440:108::-;29517:24;29535:5;29517:24;:::i;:::-;29512:3;29505:37;29440:108;;:::o;29554:118::-;29641:24;29659:5;29641:24;:::i;:::-;29636:3;29629:37;29554:118;;:::o;29678:967::-;30060:3;30082:148;30226:3;30082:148;:::i;:::-;30075:155;;30247:95;30338:3;30329:6;30247:95;:::i;:::-;30240:102;;30359:148;30503:3;30359:148;:::i;:::-;30352:155;;30524:95;30615:3;30606:6;30524:95;:::i;:::-;30517:102;;30636:3;30629:10;;29678:967;;;;;:::o;30651:222::-;30744:4;30782:2;30771:9;30767:18;30759:26;;30795:71;30863:1;30852:9;30848:17;30839:6;30795:71;:::i;:::-;30651:222;;;;:::o;30879:1053::-;31202:4;31240:3;31229:9;31225:19;31217:27;;31254:71;31322:1;31311:9;31307:17;31298:6;31254:71;:::i;:::-;31335:72;31403:2;31392:9;31388:18;31379:6;31335:72;:::i;:::-;31454:9;31448:4;31444:20;31439:2;31428:9;31424:18;31417:48;31482:108;31585:4;31576:6;31482:108;:::i;:::-;31474:116;;31637:9;31631:4;31627:20;31622:2;31611:9;31607:18;31600:48;31665:108;31768:4;31759:6;31665:108;:::i;:::-;31657:116;;31821:9;31815:4;31811:20;31805:3;31794:9;31790:19;31783:49;31849:76;31920:4;31911:6;31849:76;:::i;:::-;31841:84;;30879:1053;;;;;;;;:::o;31938:751::-;32161:4;32199:3;32188:9;32184:19;32176:27;;32213:71;32281:1;32270:9;32266:17;32257:6;32213:71;:::i;:::-;32294:72;32362:2;32351:9;32347:18;32338:6;32294:72;:::i;:::-;32376;32444:2;32433:9;32429:18;32420:6;32376:72;:::i;:::-;32458;32526:2;32515:9;32511:18;32502:6;32458:72;:::i;:::-;32578:9;32572:4;32568:20;32562:3;32551:9;32547:19;32540:49;32606:76;32677:4;32668:6;32606:76;:::i;:::-;32598:84;;31938:751;;;;;;;;:::o;32695:373::-;32838:4;32876:2;32865:9;32861:18;32853:26;;32925:9;32919:4;32915:20;32911:1;32900:9;32896:17;32889:47;32953:108;33056:4;33047:6;32953:108;:::i;:::-;32945:116;;32695:373;;;;:::o;33074:634::-;33295:4;33333:2;33322:9;33318:18;33310:26;;33382:9;33376:4;33372:20;33368:1;33357:9;33353:17;33346:47;33410:108;33513:4;33504:6;33410:108;:::i;:::-;33402:116;;33565:9;33559:4;33555:20;33550:2;33539:9;33535:18;33528:48;33593:108;33696:4;33687:6;33593:108;:::i;:::-;33585:116;;33074:634;;;;;:::o;33714:210::-;33801:4;33839:2;33828:9;33824:18;33816:26;;33852:65;33914:1;33903:9;33899:17;33890:6;33852:65;:::i;:::-;33714:210;;;;:::o;33930:222::-;34023:4;34061:2;34050:9;34046:18;34038:26;;34074:71;34142:1;34131:9;34127:17;34118:6;34074:71;:::i;:::-;33930:222;;;;:::o;34158:313::-;34271:4;34309:2;34298:9;34294:18;34286:26;;34358:9;34352:4;34348:20;34344:1;34333:9;34329:17;34322:47;34386:78;34459:4;34450:6;34386:78;:::i;:::-;34378:86;;34158:313;;;;:::o;34477:419::-;34643:4;34681:2;34670:9;34666:18;34658:26;;34730:9;34724:4;34720:20;34716:1;34705:9;34701:17;34694:47;34758:131;34884:4;34758:131;:::i;:::-;34750:139;;34477:419;;;:::o;34902:::-;35068:4;35106:2;35095:9;35091:18;35083:26;;35155:9;35149:4;35145:20;35141:1;35130:9;35126:17;35119:47;35183:131;35309:4;35183:131;:::i;:::-;35175:139;;34902:419;;;:::o;35327:::-;35493:4;35531:2;35520:9;35516:18;35508:26;;35580:9;35574:4;35570:20;35566:1;35555:9;35551:17;35544:47;35608:131;35734:4;35608:131;:::i;:::-;35600:139;;35327:419;;;:::o;35752:::-;35918:4;35956:2;35945:9;35941:18;35933:26;;36005:9;35999:4;35995:20;35991:1;35980:9;35976:17;35969:47;36033:131;36159:4;36033:131;:::i;:::-;36025:139;;35752:419;;;:::o;36177:::-;36343:4;36381:2;36370:9;36366:18;36358:26;;36430:9;36424:4;36420:20;36416:1;36405:9;36401:17;36394:47;36458:131;36584:4;36458:131;:::i;:::-;36450:139;;36177:419;;;:::o;36602:::-;36768:4;36806:2;36795:9;36791:18;36783:26;;36855:9;36849:4;36845:20;36841:1;36830:9;36826:17;36819:47;36883:131;37009:4;36883:131;:::i;:::-;36875:139;;36602:419;;;:::o;37027:::-;37193:4;37231:2;37220:9;37216:18;37208:26;;37280:9;37274:4;37270:20;37266:1;37255:9;37251:17;37244:47;37308:131;37434:4;37308:131;:::i;:::-;37300:139;;37027:419;;;:::o;37452:::-;37618:4;37656:2;37645:9;37641:18;37633:26;;37705:9;37699:4;37695:20;37691:1;37680:9;37676:17;37669:47;37733:131;37859:4;37733:131;:::i;:::-;37725:139;;37452:419;;;:::o;37877:::-;38043:4;38081:2;38070:9;38066:18;38058:26;;38130:9;38124:4;38120:20;38116:1;38105:9;38101:17;38094:47;38158:131;38284:4;38158:131;:::i;:::-;38150:139;;37877:419;;;:::o;38302:::-;38468:4;38506:2;38495:9;38491:18;38483:26;;38555:9;38549:4;38545:20;38541:1;38530:9;38526:17;38519:47;38583:131;38709:4;38583:131;:::i;:::-;38575:139;;38302:419;;;:::o;38727:::-;38893:4;38931:2;38920:9;38916:18;38908:26;;38980:9;38974:4;38970:20;38966:1;38955:9;38951:17;38944:47;39008:131;39134:4;39008:131;:::i;:::-;39000:139;;38727:419;;;:::o;39152:::-;39318:4;39356:2;39345:9;39341:18;39333:26;;39405:9;39399:4;39395:20;39391:1;39380:9;39376:17;39369:47;39433:131;39559:4;39433:131;:::i;:::-;39425:139;;39152:419;;;:::o;39577:::-;39743:4;39781:2;39770:9;39766:18;39758:26;;39830:9;39824:4;39820:20;39816:1;39805:9;39801:17;39794:47;39858:131;39984:4;39858:131;:::i;:::-;39850:139;;39577:419;;;:::o;40002:::-;40168:4;40206:2;40195:9;40191:18;40183:26;;40255:9;40249:4;40245:20;40241:1;40230:9;40226:17;40219:47;40283:131;40409:4;40283:131;:::i;:::-;40275:139;;40002:419;;;:::o;40427:::-;40593:4;40631:2;40620:9;40616:18;40608:26;;40680:9;40674:4;40670:20;40666:1;40655:9;40651:17;40644:47;40708:131;40834:4;40708:131;:::i;:::-;40700:139;;40427:419;;;:::o;40852:::-;41018:4;41056:2;41045:9;41041:18;41033:26;;41105:9;41099:4;41095:20;41091:1;41080:9;41076:17;41069:47;41133:131;41259:4;41133:131;:::i;:::-;41125:139;;40852:419;;;:::o;41277:::-;41443:4;41481:2;41470:9;41466:18;41458:26;;41530:9;41524:4;41520:20;41516:1;41505:9;41501:17;41494:47;41558:131;41684:4;41558:131;:::i;:::-;41550:139;;41277:419;;;:::o;41702:::-;41868:4;41906:2;41895:9;41891:18;41883:26;;41955:9;41949:4;41945:20;41941:1;41930:9;41926:17;41919:47;41983:131;42109:4;41983:131;:::i;:::-;41975:139;;41702:419;;;:::o;42127:::-;42293:4;42331:2;42320:9;42316:18;42308:26;;42380:9;42374:4;42370:20;42366:1;42355:9;42351:17;42344:47;42408:131;42534:4;42408:131;:::i;:::-;42400:139;;42127:419;;;:::o;42552:::-;42718:4;42756:2;42745:9;42741:18;42733:26;;42805:9;42799:4;42795:20;42791:1;42780:9;42776:17;42769:47;42833:131;42959:4;42833:131;:::i;:::-;42825:139;;42552:419;;;:::o;42977:::-;43143:4;43181:2;43170:9;43166:18;43158:26;;43230:9;43224:4;43220:20;43216:1;43205:9;43201:17;43194:47;43258:131;43384:4;43258:131;:::i;:::-;43250:139;;42977:419;;;:::o;43402:::-;43568:4;43606:2;43595:9;43591:18;43583:26;;43655:9;43649:4;43645:20;43641:1;43630:9;43626:17;43619:47;43683:131;43809:4;43683:131;:::i;:::-;43675:139;;43402:419;;;:::o;43827:::-;43993:4;44031:2;44020:9;44016:18;44008:26;;44080:9;44074:4;44070:20;44066:1;44055:9;44051:17;44044:47;44108:131;44234:4;44108:131;:::i;:::-;44100:139;;43827:419;;;:::o;44252:222::-;44345:4;44383:2;44372:9;44368:18;44360:26;;44396:71;44464:1;44453:9;44449:17;44440:6;44396:71;:::i;:::-;44252:222;;;;:::o;44480:332::-;44601:4;44639:2;44628:9;44624:18;44616:26;;44652:71;44720:1;44709:9;44705:17;44696:6;44652:71;:::i;:::-;44733:72;44801:2;44790:9;44786:18;44777:6;44733:72;:::i;:::-;44480:332;;;;;:::o;44818:129::-;44852:6;44879:20;;:::i;:::-;44869:30;;44908:33;44936:4;44928:6;44908:33;:::i;:::-;44818:129;;;:::o;44953:75::-;44986:6;45019:2;45013:9;45003:19;;44953:75;:::o;45034:311::-;45111:4;45201:18;45193:6;45190:30;45187:56;;;45223:18;;:::i;:::-;45187:56;45273:4;45265:6;45261:17;45253:25;;45333:4;45327;45323:15;45315:23;;45034:311;;;:::o;45351:::-;45428:4;45518:18;45510:6;45507:30;45504:56;;;45540:18;;:::i;:::-;45504:56;45590:4;45582:6;45578:17;45570:25;;45650:4;45644;45640:15;45632:23;;45351:311;;;:::o;45668:307::-;45729:4;45819:18;45811:6;45808:30;45805:56;;;45841:18;;:::i;:::-;45805:56;45879:29;45901:6;45879:29;:::i;:::-;45871:37;;45963:4;45957;45953:15;45945:23;;45668:307;;;:::o;45981:308::-;46043:4;46133:18;46125:6;46122:30;46119:56;;;46155:18;;:::i;:::-;46119:56;46193:29;46215:6;46193:29;:::i;:::-;46185:37;;46277:4;46271;46267:15;46259:23;;45981:308;;;:::o;46295:132::-;46362:4;46385:3;46377:11;;46415:4;46410:3;46406:14;46398:22;;46295:132;;;:::o;46433:114::-;46500:6;46534:5;46528:12;46518:22;;46433:114;;;:::o;46553:98::-;46604:6;46638:5;46632:12;46622:22;;46553:98;;;:::o;46657:99::-;46709:6;46743:5;46737:12;46727:22;;46657:99;;;:::o;46762:113::-;46832:4;46864;46859:3;46855:14;46847:22;;46762:113;;;:::o;46881:184::-;46980:11;47014:6;47009:3;47002:19;47054:4;47049:3;47045:14;47030:29;;46881:184;;;;:::o;47071:168::-;47154:11;47188:6;47183:3;47176:19;47228:4;47223:3;47219:14;47204:29;;47071:168;;;;:::o;47245:169::-;47329:11;47363:6;47358:3;47351:19;47403:4;47398:3;47394:14;47379:29;;47245:169;;;;:::o;47420:148::-;47522:11;47559:3;47544:18;;47420:148;;;;:::o;47574:305::-;47614:3;47633:20;47651:1;47633:20;:::i;:::-;47628:25;;47667:20;47685:1;47667:20;:::i;:::-;47662:25;;47821:1;47753:66;47749:74;47746:1;47743:81;47740:107;;;47827:18;;:::i;:::-;47740:107;47871:1;47868;47864:9;47857:16;;47574:305;;;;:::o;47885:348::-;47925:7;47948:20;47966:1;47948:20;:::i;:::-;47943:25;;47982:20;48000:1;47982:20;:::i;:::-;47977:25;;48170:1;48102:66;48098:74;48095:1;48092:81;48087:1;48080:9;48073:17;48069:105;48066:131;;;48177:18;;:::i;:::-;48066:131;48225:1;48222;48218:9;48207:20;;47885:348;;;;:::o;48239:96::-;48276:7;48305:24;48323:5;48305:24;:::i;:::-;48294:35;;48239:96;;;:::o;48341:90::-;48375:7;48418:5;48411:13;48404:21;48393:32;;48341:90;;;:::o;48437:77::-;48474:7;48503:5;48492:16;;48437:77;;;:::o;48520:149::-;48556:7;48596:66;48589:5;48585:78;48574:89;;48520:149;;;:::o;48675:126::-;48712:7;48752:42;48745:5;48741:54;48730:65;;48675:126;;;:::o;48807:77::-;48844:7;48873:5;48862:16;;48807:77;;;:::o;48890:154::-;48974:6;48969:3;48964;48951:30;49036:1;49027:6;49022:3;49018:16;49011:27;48890:154;;;:::o;49050:307::-;49118:1;49128:113;49142:6;49139:1;49136:13;49128:113;;;49227:1;49222:3;49218:11;49212:18;49208:1;49203:3;49199:11;49192:39;49164:2;49161:1;49157:10;49152:15;;49128:113;;;49259:6;49256:1;49253:13;49250:101;;;49339:1;49330:6;49325:3;49321:16;49314:27;49250:101;49099:258;49050:307;;;:::o;49363:171::-;49402:3;49425:24;49443:5;49425:24;:::i;:::-;49416:33;;49471:4;49464:5;49461:15;49458:41;;;49479:18;;:::i;:::-;49458:41;49526:1;49519:5;49515:13;49508:20;;49363:171;;;:::o;49540:320::-;49584:6;49621:1;49615:4;49611:12;49601:22;;49668:1;49662:4;49658:12;49689:18;49679:81;;49745:4;49737:6;49733:17;49723:27;;49679:81;49807:2;49799:6;49796:14;49776:18;49773:38;49770:84;;;49826:18;;:::i;:::-;49770:84;49591:269;49540:320;;;:::o;49866:281::-;49949:27;49971:4;49949:27;:::i;:::-;49941:6;49937:40;50079:6;50067:10;50064:22;50043:18;50031:10;50028:34;50025:62;50022:88;;;50090:18;;:::i;:::-;50022:88;50130:10;50126:2;50119:22;49909:238;49866:281;;:::o;50153:233::-;50192:3;50215:24;50233:5;50215:24;:::i;:::-;50206:33;;50261:66;50254:5;50251:77;50248:103;;;50331:18;;:::i;:::-;50248:103;50378:1;50371:5;50367:13;50360:20;;50153:233;;;:::o;50392:180::-;50440:77;50437:1;50430:88;50537:4;50534:1;50527:15;50561:4;50558:1;50551:15;50578:180;50626:77;50623:1;50616:88;50723:4;50720:1;50713:15;50747:4;50744:1;50737:15;50764:180;50812:77;50809:1;50802:88;50909:4;50906:1;50899:15;50933:4;50930:1;50923:15;50950:180;50998:77;50995:1;50988:88;51095:4;51092:1;51085:15;51119:4;51116:1;51109:15;51136:183;51171:3;51209:1;51191:16;51188:23;51185:128;;;51247:1;51244;51241;51226:23;51269:34;51300:1;51294:8;51269:34;:::i;:::-;51262:41;;51185:128;51136:183;:::o;51325:117::-;51434:1;51431;51424:12;51448:117;51557:1;51554;51547:12;51571:117;51680:1;51677;51670:12;51694:117;51803:1;51800;51793:12;51817:117;51926:1;51923;51916:12;51940:102;51981:6;52032:2;52028:7;52023:2;52016:5;52012:14;52008:28;51998:38;;51940:102;;;:::o;52048:106::-;52092:8;52141:5;52136:3;52132:15;52111:36;;52048:106;;;:::o;52160:239::-;52300:34;52296:1;52288:6;52284:14;52277:58;52369:22;52364:2;52356:6;52352:15;52345:47;52160:239;:::o;52405:182::-;52545:34;52541:1;52533:6;52529:14;52522:58;52405:182;:::o;52593:227::-;52733:34;52729:1;52721:6;52717:14;52710:58;52802:10;52797:2;52789:6;52785:15;52778:35;52593:227;:::o;52826:170::-;52966:22;52962:1;52954:6;52950:14;52943:46;52826:170;:::o;53002:181::-;53142:33;53138:1;53130:6;53126:14;53119:57;53002:181;:::o;53189:230::-;53329:34;53325:1;53317:6;53313:14;53306:58;53398:13;53393:2;53385:6;53381:15;53374:38;53189:230;:::o;53425:225::-;53565:34;53561:1;53553:6;53549:14;53542:58;53634:8;53629:2;53621:6;53617:15;53610:33;53425:225;:::o;53656:223::-;53796:34;53792:1;53784:6;53780:14;53773:58;53865:6;53860:2;53852:6;53848:15;53841:31;53656:223;:::o;53885:228::-;54025:34;54021:1;54013:6;54009:14;54002:58;54094:11;54089:2;54081:6;54077:15;54070:36;53885:228;:::o;54119:166::-;54259:18;54255:1;54247:6;54243:14;54236:42;54119:166;:::o;54291:224::-;54431:34;54427:1;54419:6;54415:14;54408:58;54500:7;54495:2;54487:6;54483:15;54476:32;54291:224;:::o;54521:237::-;54661:34;54657:1;54649:6;54645:14;54638:58;54730:20;54725:2;54717:6;54713:15;54706:45;54521:237;:::o;54764:222::-;54904:34;54900:1;54892:6;54888:14;54881:58;54973:5;54968:2;54960:6;54956:15;54949:30;54764:222;:::o;54992:229::-;55132:34;55128:1;55120:6;55116:14;55109:58;55201:12;55196:2;55188:6;55184:15;55177:37;54992:229;:::o;55227:178::-;55367:30;55363:1;55355:6;55351:14;55344:54;55227:178;:::o;55411:182::-;55551:34;55547:1;55539:6;55535:14;55528:58;55411:182;:::o;55599:227::-;55739:34;55735:1;55727:6;55723:14;55716:58;55808:10;55803:2;55795:6;55791:15;55784:35;55599:227;:::o;55832:178::-;55972:30;55968:1;55960:6;55956:14;55949:54;55832:178;:::o;56016:173::-;56156:25;56152:1;56144:6;56140:14;56133:49;56016:173;:::o;56195:228::-;56335:34;56331:1;56323:6;56319:14;56312:58;56404:11;56399:2;56391:6;56387:15;56380:36;56195:228;:::o;56429:::-;56569:34;56565:1;56557:6;56553:14;56546:58;56638:11;56633:2;56625:6;56621:15;56614:36;56429:228;:::o;56663:227::-;56803:34;56799:1;56791:6;56787:14;56780:58;56872:10;56867:2;56859:6;56855:15;56848:35;56663:227;:::o;56896:220::-;57036:34;57032:1;57024:6;57020:14;57013:58;57105:3;57100:2;57092:6;57088:15;57081:28;56896:220;:::o;57122:167::-;57262:19;57258:1;57250:6;57246:14;57239:43;57122:167;:::o;57295:234::-;57435:34;57431:1;57423:6;57419:14;57412:58;57504:17;57499:2;57491:6;57487:15;57480:42;57295:234;:::o;57535:711::-;57574:3;57612:4;57594:16;57591:26;57588:39;;;57620:5;;57588:39;57649:20;;:::i;:::-;57724:1;57706:16;57702:24;57699:1;57693:4;57678:49;57757:4;57751:11;57856:16;57849:4;57841:6;57837:17;57834:39;57801:18;57793:6;57790:30;57774:113;57771:146;;;57902:5;;;;57771:146;57948:6;57942:4;57938:17;57984:3;57978:10;58011:18;58003:6;58000:30;57997:43;;;58033:5;;;;;;57997:43;58081:6;58074:4;58069:3;58065:14;58061:27;58140:1;58122:16;58118:24;58112:4;58108:35;58103:3;58100:44;58097:57;;;58147:5;;;;;;;58097:57;58164;58212:6;58206:4;58202:17;58194:6;58190:30;58184:4;58164:57;:::i;:::-;58237:3;58230:10;;57578:668;;;;;57535:711;;:::o;58252:122::-;58325:24;58343:5;58325:24;:::i;:::-;58318:5;58315:35;58305:63;;58364:1;58361;58354:12;58305:63;58252:122;:::o;58380:116::-;58450:21;58465:5;58450:21;:::i;:::-;58443:5;58440:32;58430:60;;58486:1;58483;58476:12;58430:60;58380:116;:::o;58502:122::-;58575:24;58593:5;58575:24;:::i;:::-;58568:5;58565:35;58555:63;;58614:1;58611;58604:12;58555:63;58502:122;:::o;58630:120::-;58702:23;58719:5;58702:23;:::i;:::-;58695:5;58692:34;58682:62;;58740:1;58737;58730:12;58682:62;58630:120;:::o;58756:122::-;58829:24;58847:5;58829:24;:::i;:::-;58822:5;58819:35;58809:63;;58868:1;58865;58858:12;58809:63;58756:122;:::o
Swarm Source
ipfs://6e2e0ecfa94916712f0942d7344693a3080a820db0b0ef4592839427902b90fa
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.