Contract is not verified. However, we found a verified contract with the same bytecode in Blockscout DB 0x687923956655c0271dcd20ebd90895c27cd69926.
All metadata displayed below is from that contract. In order to verify current contract, click Verify & Publish button
Verify & Publish
All metadata displayed below is from that contract. In order to verify current contract, click Verify & Publish button
- Contract name:
- PKPNFT
- Optimization enabled
- false
- Compiler version
- v0.8.17+commit.8df45f5f
- Verified at
- 2023-11-17T17:46:20.101535Z
contracts/lit-node/PKPNFT.sol
// SPDX-License-Identifier: MITpragma solidity ^0.8.0;/******************************************************************************\* Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen)* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535** Implementation of a diamond./******************************************************************************/import { LibDiamond } from "../libraries/LibDiamond.sol";import { IDiamondCut } from "../interfaces/IDiamondCut.sol";import { IDiamondLoupe } from "../interfaces/IDiamondLoupe.sol";import { IERC173 } from "../interfaces/IERC173.sol";import { IERC165 } from "../interfaces/IERC165.sol";import { IERC20Metadata } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";import { ContractResolver } from "../lit-core/ContractResolver.sol";import { LibPKPNFTStorage } from "./PKPNFT/LibPKPNFTStorage.sol";// When no function exists for function callederror FunctionNotFound(bytes4 _functionSelector);// This is used in diamond constructor// more arguments are added to this struct// this avoids stack too deep errorsstruct StakingArgs {address owner;address init;bytes initCalldata;address contractResolver;ContractResolver.Env env;}contract PKPNFT {constructor(IDiamondCut.FacetCut[] memory _diamondCut,StakingArgs memory _args) payable {LibDiamond.setContractOwner(_args.owner);LibDiamond.diamondCut(_diamondCut, _args.init, _args.initCalldata);
@openzeppelin/contracts/access/AccessControl.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)pragma solidity ^0.8.0;import "./IAccessControl.sol";import "../utils/Context.sol";import "../utils/Strings.sol";import "../utils/introspection/ERC165.sol";/*** @dev Contract module that allows children to implement role-based access* control mechanisms. This is a lightweight version that doesn't allow enumerating role* members except through off-chain means by accessing the contract event logs. Some* applications may benefit from on-chain enumerability, for those cases see* {AccessControlEnumerable}.** Roles are referred to by their `bytes32` identifier. These should be exposed* in the external API and be unique. The best way to achieve this is by* using `public constant` hash digests:** ```solidity* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");* ```** Roles can be used to represent a set of permissions. To restrict access to a* function call, use {hasRole}:** ```solidity* function foo() public {* require(hasRole(MY_ROLE, msg.sender));* ...* }* ```** Roles can be granted and revoked dynamically via the {grantRole} and* {revokeRole} functions. Each role has an associated admin role, and only* accounts that have a role's admin role can call {grantRole} and {revokeRole}.** By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means* that only accounts with this role will be able to grant or revoke other
contracts/interfaces/IERC173.sol
// SPDX-License-Identifier: MITpragma solidity ^0.8.0;/// @title ERC-173 Contract Ownership Standard/// Note: the ERC-165 identifier for this interface is 0x7f5828d0/* is ERC165 */interface IERC173 {/// @dev This emits when ownership of a contract changes.event OwnershipTransferred(address indexed previousOwner,address indexed newOwner);/// @notice Get the address of the owner/// @return owner_ The address of the owner.function owner() external view returns (address owner_);/// @notice Set the address of the new owner of the contract/// @dev Set _newOwner to address(0) to renounce any ownership./// @param _newOwner The address of the new owner of the contractfunction transferOwnership(address _newOwner) external;}
contracts/libraries/LibDiamond.sol
// SPDX-License-Identifier: MITpragma solidity ^0.8.0;/******************************************************************************\* Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen)* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535/******************************************************************************/import { IDiamond } from "../interfaces/IDiamond.sol";import { IDiamondCut } from "../interfaces/IDiamondCut.sol";// Remember to add the loupe functions from DiamondLoupeFacet to the diamond.// The loupe functions are required by the EIP2535 Diamonds standarderror NoSelectorsGivenToAdd();error NotContractOwner(address _user, address _contractOwner);error NoSelectorsProvidedForFacetForCut(address _facetAddress);error CannotAddSelectorsToZeroAddress(bytes4[] _selectors);error NoBytecodeAtAddress(address _contractAddress, string _message);error IncorrectFacetCutAction(uint8 _action);error CannotAddFunctionToDiamondThatAlreadyExists(bytes4 _selector);error CannotReplaceFunctionsFromFacetWithZeroAddress(bytes4[] _selectors);error CannotReplaceImmutableFunction(bytes4 _selector);error CannotReplaceFunctionWithTheSameFunctionFromTheSameFacet(bytes4 _selector);error CannotReplaceFunctionThatDoesNotExists(bytes4 _selector);error RemoveFacetAddressMustBeZeroAddress(address _facetAddress);error CannotRemoveFunctionThatDoesNotExist(bytes4 _selector);error CannotRemoveImmutableFunction(bytes4 _selector);error InitializationFunctionReverted(address _initializationContractAddress,bytes _calldata);library LibDiamond {bytes32 constant DIAMOND_STORAGE_POSITION =keccak256("diamond.standard.diamond.storage");struct FacetAddressAndSelectorPosition {address facetAddress;uint16 selectorPosition;
contracts/lit-core/ContractResolver.sol
// SPDX-License-Identifier: GPL-3.0-or-laterpragma solidity ^0.8.0;import "@openzeppelin/contracts/access/AccessControl.sol";import "hardhat/console.sol";contract ContractResolver is AccessControl {/* ========== TYPE DEFINITIONS ========== */// the comments following each one of these are the keccak256 hashes of the string values// this is very useful if you have to manually set any of these, so that you// don't have to calculate the hahes yourself.bytes32 public constant ADMIN_ROLE = keccak256("ADMIN"); // 0xdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42bytes32 public constant RELEASE_REGISTER_CONTRACT =keccak256("RELEASE_REGISTER"); // 0x3a68dbfd8bbb64015c42bc131c388dea7965e28c1004d09b39f59500c3a763ecbytes32 public constant STAKING_CONTRACT = keccak256("STAKING"); // 0x080909c18c958ce5a2d36481697824e477319323d03154ceba3b78f28a61887bbytes32 public constant STAKING_BALANCES_CONTRACT =keccak256("STAKING_BALANCES"); // 0xaa06d108dbd7bf976b16b7bf5adb29d2d0ef2c385ca8b9d833cc802f33942d72bytes32 public constant MULTI_SENDER_CONTRACT = keccak256("MULTI_SENDER"); // 0xdd5b9b8a5e8e01f2962ed7e983d58fe32e1f66aa88dd7ab30770fa9b77da7243bytes32 public constant LIT_TOKEN_CONTRACT = keccak256("LIT_TOKEN");bytes32 public constant PUB_KEY_ROUTER_CONTRACT =keccak256("PUB_KEY_ROUTER"); // 0xb1f79813bc7630a52ae948bc99781397e409d0dd3521953bf7d8d7a2db6147f7bytes32 public constant PKP_NFT_CONTRACT = keccak256("PKP_NFT"); // 0xb7b4fde9944d3c13e9a78835431c33a5084d90a7f0c73def76d7886315fe87b0bytes32 public constant RATE_LIMIT_NFT_CONTRACT =keccak256("RATE_LIMIT_NFT"); // 0xb931b2719aeb2a65a5035fa0a190bfdc4c8622ce8cbff7a3d1ab42531fb1a918bytes32 public constant PKP_HELPER_CONTRACT = keccak256("PKP_HELPER"); // 0x27d764ea2a4a3865434bbf4a391110149644be31448f3479fd15b44388755765bytes32 public constant PKP_PERMISSIONS_CONTRACT =keccak256("PKP_PERMISSIONS"); // 0x54953c23068b8fc4c0736301b50f10027d6b469327de1fd42841a5072b1bcebebytes32 public constant PKP_NFT_METADATA_CONTRACT =keccak256("PKP_NFT_METADATA"); // 0xf14f431dadc82e7dbc5e379f71234e5735c9187e4327a7c6ac014d55d1b7727abytes32 public constant ALLOWLIST_CONTRACT = keccak256("ALLOWLIST"); // 0x74845de37cfabd357633214b47fa91ccd19b05b7c5a08ac22c187f811fb62bcabytes32 public constant DOMAIN_WALLET_ORACLE =keccak256("DOMAIN_WALLET_ORACLE");bytes32 public constant DOMAIN_WALLET_REGISTRY =keccak256("DOMAIN_WALLET_REGISTRY");bytes32 public constant HD_KEY_DERIVER_CONTRACT =keccak256("HD_KEY_DERIVER");bytes32 public constant BACKUP_RECOVERY_CONTRACT =
@openzeppelin/contracts/access/IAccessControl.sol
// SPDX-License-Identifier: MIT// 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);
@openzeppelin/contracts/token/ERC20/IERC20.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)pragma solidity ^0.8.0;/*** @dev Interface of the ERC20 standard as defined in the EIP.*/interface IERC20 {/*** @dev Emitted when `value` tokens are moved from one account (`from`) to* another (`to`).** Note that `value` may be zero.*/event Transfer(address indexed from, address indexed to, uint256 value);/*** @dev Emitted when the allowance of a `spender` for an `owner` is set by* a call to {approve}. `value` is the new allowance.*/event Approval(address indexed owner, address indexed spender, uint256 value);/*** @dev Returns the amount of tokens in existence.*/function totalSupply() external view returns (uint256);/*** @dev Returns the amount of tokens owned by `account`.*/function balanceOf(address account) external view returns (uint256);/*** @dev Moves `amount` tokens from the caller's account to `to`.** Returns a boolean value indicating whether the operation succeeded.** Emits a {Transfer} event.*/function transfer(address to, uint256 amount) external returns (bool);
@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)pragma solidity ^0.8.0;import "../IERC20.sol";/*** @dev Interface for the optional metadata functions from the ERC20 standard.** _Available since v4.1._*/interface IERC20Metadata is IERC20 {/*** @dev Returns the name of the token.*/function name() external view returns (string memory);/*** @dev Returns the symbol of the token.*/function symbol() external view returns (string memory);/*** @dev Returns the decimals places of the token.*/function decimals() external view returns (uint8);}
@openzeppelin/contracts/utils/Context.sol
// SPDX-License-Identifier: MIT// 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;}}
@openzeppelin/contracts/utils/Strings.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)pragma solidity ^0.8.0;import "./math/Math.sol";import "./math/SignedMath.sol";/*** @dev String operations.*/library Strings {bytes16 private constant _SYMBOLS = "0123456789abcdef";uint8 private constant _ADDRESS_LENGTH = 20;/*** @dev Converts a `uint256` to its ASCII `string` decimal representation.*/function toString(uint256 value) internal pure returns (string memory) {unchecked {uint256 length = Math.log10(value) + 1;string memory buffer = new string(length);uint256 ptr;/// @solidity memory-safe-assemblyassembly {ptr := add(buffer, add(32, length))}while (true) {ptr--;/// @solidity memory-safe-assemblyassembly {mstore8(ptr, byte(mod(value, 10), _SYMBOLS))}value /= 10;if (value == 0) break;}return buffer;}}/**
@openzeppelin/contracts/utils/introspection/ERC165.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)pragma solidity ^0.8.0;import "./IERC165.sol";/*** @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;}}
@openzeppelin/contracts/utils/introspection/IERC165.sol
// SPDX-License-Identifier: MIT// 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);}
@openzeppelin/contracts/utils/math/Math.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)pragma solidity ^0.8.0;/*** @dev Standard math utilities missing in the Solidity language.*/library Math {enum Rounding {Down, // Toward negative infinityUp, // Toward infinityZero // Toward zero}/*** @dev Returns the largest of two numbers.*/function max(uint256 a, uint256 b) internal pure returns (uint256) {return a > b ? a : b;}/*** @dev Returns the smallest of two numbers.*/function min(uint256 a, uint256 b) internal pure returns (uint256) {return a < b ? a : b;}/*** @dev Returns the average of two numbers. The result is rounded towards* zero.*/function average(uint256 a, uint256 b) internal pure returns (uint256) {// (a + b) / 2 can overflow.return (a & b) + (a ^ b) / 2;}/*** @dev Returns the ceiling of the division of two numbers.*
@openzeppelin/contracts/utils/math/SignedMath.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)pragma solidity ^0.8.0;/*** @dev Standard signed math utilities missing in the Solidity language.*/library SignedMath {/*** @dev Returns the largest of two signed numbers.*/function max(int256 a, int256 b) internal pure returns (int256) {return a > b ? a : b;}/*** @dev Returns the smallest of two signed numbers.*/function min(int256 a, int256 b) internal pure returns (int256) {return a < b ? a : b;}/*** @dev Returns the average of two signed numbers without overflow.* The result is rounded towards zero.*/function average(int256 a, int256 b) internal pure returns (int256) {// Formula from the book "Hacker's Delight"int256 x = (a & b) + ((a ^ b) >> 1);return x + (int256(uint256(x) >> 255) & (a ^ b));}/*** @dev Returns the absolute unsigned value of a signed value.*/function abs(int256 n) internal pure returns (uint256) {unchecked {// must be unchecked in order to support `n = type(int256).min`return uint256(n >= 0 ? n : -n);}
@openzeppelin/contracts/utils/structs/BitMaps.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/BitMaps.sol)pragma solidity ^0.8.0;/*** @dev Library for managing uint256 to bool mapping in a compact and efficient way, providing the keys are sequential.* Largely inspired by Uniswap's https://github.com/Uniswap/merkle-distributor/blob/master/contracts/MerkleDistributor.sol[merkle-distributor].*/library BitMaps {struct BitMap {mapping(uint256 => uint256) _data;}/*** @dev Returns whether the bit at `index` is set.*/function get(BitMap storage bitmap, uint256 index) internal view returns (bool) {uint256 bucket = index >> 8;uint256 mask = 1 << (index & 0xff);return bitmap._data[bucket] & mask != 0;}/*** @dev Sets the bit at `index` to the boolean `value`.*/function setTo(BitMap storage bitmap, uint256 index, bool value) internal {if (value) {set(bitmap, index);} else {unset(bitmap, index);}}/*** @dev Sets the bit at `index`.*/function set(BitMap storage bitmap, uint256 index) internal {uint256 bucket = index >> 8;uint256 mask = 1 << (index & 0xff);bitmap._data[bucket] |= mask;}
@openzeppelin/contracts/utils/structs/EnumerableSet.sol
// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol)// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.pragma solidity ^0.8.0;/*** @dev Library for managing* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive* types.** Sets have the following properties:** - Elements are added, removed, and checked for existence in constant time* (O(1)).* - Elements are enumerated in O(n). No guarantees are made on the ordering.** ```solidity* contract Example {* // Add the library methods* using EnumerableSet for EnumerableSet.AddressSet;** // Declare a set state variable* EnumerableSet.AddressSet private mySet;* }* ```** As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)* and `uint256` (`UintSet`) are supported.** [WARNING]* ====* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure* unusable.* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.** In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an* array of EnumerableSet.* ====*/library EnumerableSet {
contracts/interfaces/IDiamond.sol
// SPDX-License-Identifier: MITpragma solidity ^0.8.0;/******************************************************************************\* Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen)* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535/******************************************************************************/interface IDiamond {enum FacetCutAction {Add,Replace,Remove}// Add=0, Replace=1, Remove=2struct FacetCut {address facetAddress;FacetCutAction action;bytes4[] functionSelectors;}event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);}
contracts/interfaces/IDiamondCut.sol
// SPDX-License-Identifier: MITpragma solidity ^0.8.0;/******************************************************************************\* Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen)* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535/******************************************************************************/import { IDiamond } from "./IDiamond.sol";interface IDiamondCut is IDiamond {/// @notice Add/replace/remove any number of functions and optionally execute/// a function with delegatecall/// @param _diamondCut Contains the facet addresses and function selectors/// @param _init The address of the contract or facet to execute _calldata/// @param _calldata A function call, including function selector and arguments/// _calldata is executed with delegatecall on _initfunction diamondCut(FacetCut[] calldata _diamondCut,address _init,bytes calldata _calldata) external;}
contracts/interfaces/IDiamondLoupe.sol
// SPDX-License-Identifier: MITpragma solidity ^0.8.0;/******************************************************************************\* Author: Nick Mudge <nick@perfectabstractions.com> (https://twitter.com/mudgen)* EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535/******************************************************************************/// A loupe is a small magnifying glass used to look at diamonds.// These functions look at diamondsinterface IDiamondLoupe {/// These functions are expected to be called frequently/// by tools.struct Facet {address facetAddress;bytes4[] functionSelectors;}/// @notice Gets all facet addresses and their four byte function selectors./// @return facets_ Facetfunction facets() external view returns (Facet[] memory facets_);/// @notice Gets all the function selectors supported by a specific facet./// @param _facet The facet address./// @return facetFunctionSelectors_function facetFunctionSelectors(address _facet) external view returns (bytes4[] memory facetFunctionSelectors_);/// @notice Get all the facet addresses used by a diamond./// @return facetAddresses_function facetAddresses()externalviewreturns (address[] memory facetAddresses_);/// @notice Gets the facet that supports the given selector./// @dev If facet is not found return address(0)./// @param _functionSelector The function selector./// @return facetAddress_ The facet address.
contracts/interfaces/IERC165.sol
// SPDX-License-Identifier: MITpragma solidity ^0.8.0;interface IERC165 {/// @notice Query if a contract implements an interface/// @param interfaceId The interface identifier, as specified in ERC-165/// @dev Interface identification is specified in ERC-165. This function/// uses less than 30,000 gas./// @return `true` if the contract implements `interfaceID` and/// `interfaceID` is not 0xffffffff, `false` otherwisefunction supportsInterface(bytes4 interfaceId) external view returns (bool);}
contracts/lit-node/PKPNFT/LibPKPNFTStorage.sol
//SPDX-License-Identifier: GPL-3.0-or-laterpragma solidity ^0.8.17;import { EnumerableSet } from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";import { BitMaps } from "@openzeppelin/contracts/utils/structs/BitMaps.sol";import "solidity-bytes-utils/contracts/BytesLib.sol";import { ContractResolver } from "../../lit-core/ContractResolver.sol";import { IPubkeyRouter } from "../PubkeyRouter/LibPubkeyRouterStorage.sol";library LibPKPNFTStorage {using EnumerableSet for EnumerableSet.AddressSet;bytes32 constant PKP_NFT_POSITION = keccak256("pkpnft.storage");struct ClaimMaterial {uint256 keyType;bytes32 derivedKeyId;IPubkeyRouter.Signature[] signatures;}struct PKPNFTStorage {ContractResolver contractResolver;ContractResolver.Env env;uint256 mintCost;address freeMintSigner;mapping(uint256 => bool) redeemedFreeMintIds;}// Return ERC721 storage struct for reading and writingfunction getStorage()internalpurereturns (PKPNFTStorage storage storageStruct){bytes32 position = PKP_NFT_POSITION;assembly {storageStruct.slot := position}}}
contracts/lit-node/PubkeyRouter/LibPubkeyRouterStorage.sol
//SPDX-License-Identifier: GPL-3.0-or-laterpragma solidity ^0.8.17;import { EnumerableSet } from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";import { BitMaps } from "@openzeppelin/contracts/utils/structs/BitMaps.sol";import "solidity-bytes-utils/contracts/BytesLib.sol";import { ContractResolver } from "../../lit-core/ContractResolver.sol";interface IPubkeyRouter {struct RootKey {bytes pubkey;uint256 keyType; // 1 = BLS, 2 = ECDSA. Not doing this in an enum so we can add more keytypes in the future without redeploying.}struct Signature {bytes32 r;bytes32 s;uint8 v;}}library LibPubkeyRouterStorage {using EnumerableSet for EnumerableSet.AddressSet;using EnumerableSet for EnumerableSet.Bytes32Set;using EnumerableSet for EnumerableSet.UintSet;using BytesLib for bytes;using BitMaps for BitMaps.BitMap;bytes32 constant PUBKEY_ROUTER_POSITION = keccak256("pubkeyrouter.storage");struct PubkeyRoutingData {bytes pubkey;uint256 keyType; // 1 = BLS, 2 = ECDSA. Not doing this in an enum so we can add more keytypes in the future without redeploying.bytes32 derivedKeyId;}struct VoteToRegisterRootKey {uint256 votes;mapping(address => bool) voted;}
hardhat/console.sol
// SPDX-License-Identifier: MITpragma solidity >=0.4.22 <0.9.0;library console {address constant CONSOLE_ADDRESS =0x000000000000000000636F6e736F6c652e6c6f67;function _sendLogPayloadImplementation(bytes memory payload) internal view {address consoleAddress = CONSOLE_ADDRESS;/// @solidity memory-safe-assemblyassembly {pop(staticcall(gas(),consoleAddress,add(payload, 32),mload(payload),0,0))}}function _castToPure(function(bytes memory) internal view fnIn) internal pure returns (function(bytes memory) pure fnOut) {assembly {fnOut := fnIn}}function _sendLogPayload(bytes memory payload) internal pure {_castToPure(_sendLogPayloadImplementation)(payload);}function log() internal pure {_sendLogPayload(abi.encodeWithSignature("log()"));}function logInt(int256 p0) internal pure {_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
solidity-bytes-utils/contracts/BytesLib.sol
// SPDX-License-Identifier: Unlicense/** @title Solidity Bytes Arrays Utils* @author Gonçalo Sá <goncalo.sa@consensys.net>** @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.* The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.*/pragma solidity >=0.8.0 <0.9.0;library BytesLib {function concat(bytes memory _preBytes,bytes memory _postBytes)internalpurereturns (bytes memory){bytes memory tempBytes;assembly {// Get a location of some free memory and store it in tempBytes as// Solidity does for memory variables.tempBytes := mload(0x40)// Store the length of the first bytes array at the beginning of// the memory for tempBytes.let length := mload(_preBytes)mstore(tempBytes, length)// Maintain a memory counter for the current write location in the// temp bytes array by adding the 32 bytes for the array length to// the starting location.let mc := add(tempBytes, 0x20)// Stop copying when the memory counter reaches the length of the// first bytes array.let end := add(mc, length)for {
Contract ABI
[{"type":"constructor","stateMutability":"payable","inputs":[{"type":"tuple[]","name":"_diamondCut","internalType":"struct IDiamond.FacetCut[]","components":[{"type":"address","name":"facetAddress","internalType":"address"},{"type":"uint8","name":"action","internalType":"enum IDiamond.FacetCutAction"},{"type":"bytes4[]","name":"functionSelectors","internalType":"bytes4[]"}]},{"type":"tuple","name":"_args","internalType":"struct StakingArgs","components":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"init","internalType":"address"},{"type":"bytes","name":"initCalldata","internalType":"bytes"},{"type":"address","name":"contractResolver","internalType":"address"},{"type":"uint8","name":"env","internalType":"enum ContractResolver.Env"}]}]},{"type":"error","name":"CannotAddFunctionToDiamondThatAlreadyExists","inputs":[{"type":"bytes4","name":"_selector","internalType":"bytes4"}]},{"type":"error","name":"CannotAddSelectorsToZeroAddress","inputs":[{"type":"bytes4[]","name":"_selectors","internalType":"bytes4[]"}]},{"type":"error","name":"CannotRemoveFunctionThatDoesNotExist","inputs":[{"type":"bytes4","name":"_selector","internalType":"bytes4"}]},{"type":"error","name":"CannotRemoveImmutableFunction","inputs":[{"type":"bytes4","name":"_selector","internalType":"bytes4"}]},{"type":"error","name":"CannotReplaceFunctionThatDoesNotExists","inputs":[{"type":"bytes4","name":"_selector","internalType":"bytes4"}]},{"type":"error","name":"CannotReplaceFunctionWithTheSameFunctionFromTheSameFacet","inputs":[{"type":"bytes4","name":"_selector","internalType":"bytes4"}]},{"type":"error","name":"CannotReplaceFunctionsFromFacetWithZeroAddress","inputs":[{"type":"bytes4[]","name":"_selectors","internalType":"bytes4[]"}]},{"type":"error","name":"CannotReplaceImmutableFunction","inputs":[{"type":"bytes4","name":"_selector","internalType":"bytes4"}]},{"type":"error","name":"FunctionNotFound","inputs":[{"type":"bytes4","name":"_functionSelector","internalType":"bytes4"}]},{"type":"error","name":"IncorrectFacetCutAction","inputs":[{"type":"uint8","name":"_action","internalType":"uint8"}]},{"type":"error","name":"InitializationFunctionReverted","inputs":[{"type":"address","name":"_initializationContractAddress","internalType":"address"},{"type":"bytes","name":"_calldata","internalType":"bytes"}]},{"type":"error","name":"NoBytecodeAtAddress","inputs":[{"type":"address","name":"_contractAddress","internalType":"address"},{"type":"string","name":"_message","internalType":"string"}]},{"type":"error","name":"NoSelectorsProvidedForFacetForCut","inputs":[{"type":"address","name":"_facetAddress","internalType":"address"}]},{"type":"error","name":"RemoveFacetAddressMustBeZeroAddress","inputs":[{"type":"address","name":"_facetAddress","internalType":"address"}]},{"type":"fallback","stateMutability":"payable"}]
Contract Creation Code
0x608060405260405162003889380380620038898339818101604052810190620000299190620017da565b6200004381600001516200018660201b620001861760201c565b6200006382826020015183604001516200026560201b6200025d1760201c565b80606001516200007d620004d160201b6200047a1760201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060800151620000d8620004d160201b6200047a1760201c565b60000160146101000a81548160ff021916908360028111156200010057620000ff6200185f565b5b021790555060016200011c620004d160201b6200047a1760201c565b6001018190555080600001516200013d620004d160201b6200047a1760201c565b60020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062001f31565b600062000198620004fe60201b60201c565b905060008160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b60005b83518110156200047c5760008482815181106200028a57620002896200188e565b5b60200260200101516040015190506000858381518110620002b057620002af6200188e565b5b602002602001015160000151905060008251036200030757806040517fe767f91f000000000000000000000000000000000000000000000000000000008152600401620002fe9190620018ce565b60405180910390fd5b60008684815181106200031f576200031e6200188e565b5b6020026020010151602001519050600060028111156200034457620003436200185f565b5b8160028111156200035a57620003596200185f565b5b0362000378576200037282846200052b60201b60201c565b62000463565b600160028111156200038f576200038e6200185f565b5b816002811115620003a557620003a46200185f565b5b03620003c357620003bd82846200087360201b60201c565b62000462565b600280811115620003d957620003d86200185f565b5b816002811115620003ef57620003ee6200185f565b5b036200040d5762000407828462000bdd60201b60201c565b62000461565b8060028111156200042357620004226200185f565b5b6040517f7fe9a41e00000000000000000000000000000000000000000000000000000000815260040162000458919062001909565b60405180910390fd5b5b5b505050808062000473906200195f565b91505062000268565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673838383604051620004b29392919062001c5f565b60405180910390a1620004cc82826200108860201b60201c565b505050565b6000807fdd40e1fc471fef58a9b638822d14c35549994757e95ac83b6e1a8018ad2db4f390508091505090565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200059f57806040517f0ae3681c00000000000000000000000000000000000000000000000000000000815260040162000596919062001d25565b60405180910390fd5b6000620005b1620004fe60201b60201c565b9050600081600101805490509050620005ea846040518060600160405280602481526020016200381560249139620011bc60201b60201c565b60005b83518110156200086c5760008482815181106200060f576200060e6200188e565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146200070857816040517febbf5d07000000000000000000000000000000000000000000000000000000008152600401620006ff919062001d5a565b60405180910390fd5b60405180604001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018561ffff16815250856000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff160217905550905050846001018290806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c02179055508380620008519062001d85565b9450505050808062000863906200195f565b915050620005ed565b5050505050565b600062000885620004fe60201b60201c565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620008fb57816040517fcd98a96f000000000000000000000000000000000000000000000000000000008152600401620008f2919062001d25565b60405180910390fd5b62000926836040518060600160405280602881526020016200386160289139620011bc60201b60201c565b60005b825181101562000bd75760008382815181106200094b576200094a6200188e565b5b602002602001015190506000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000a4357816040517f520300da00000000000000000000000000000000000000000000000000000000815260040162000a3a919062001d5a565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000ab657816040517f358d9d1a00000000000000000000000000000000000000000000000000000000815260040162000aad919062001d5a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000b2a57816040517f7479f93900000000000000000000000000000000000000000000000000000000815260040162000b21919062001d5a565b60405180910390fd5b85846000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050808062000bce906200195f565b91505062000929565b50505050565b600062000bef620004fe60201b60201c565b9050600081600101805490509050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161462000c7157836040517fd091bc8100000000000000000000000000000000000000000000000000000000815260040162000c689190620018ce565b60405180910390fd5b60005b83518110156200108157600084828151811062000c965762000c956200188e565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900461ffff1661ffff1661ffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff160362000df057816040517f7a08a22d00000000000000000000000000000000000000000000000000000000815260040162000de7919062001d5a565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff160362000e6757816040517f6fafeb0800000000000000000000000000000000000000000000000000000000815260040162000e5e919062001d5a565b60405180910390fd5b838062000e749062001db4565b94505083816020015161ffff161462000f9057600085600101858154811062000ea25762000ea16200188e565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90508086600101836020015161ffff168154811062000ee95762000ee86200188e565b5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908360e01c02179055508160200151866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a81548161ffff021916908361ffff160217905550505b8460010180548062000fa75762000fa662001de2565b5b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff02191690559055846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549061ffff021916905550505050808062001078906200195f565b91505062000c74565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160315620011b857620010e9826040518060600160405280602881526020016200383960289139620011bc60201b60201c565b6000808373ffffffffffffffffffffffffffffffffffffffff168360405162001113919062001e53565b600060405180830381855af49150503d806000811462001150576040519150601f19603f3d011682016040523d82523d6000602084013e62001155565b606091505b509150915081620011b557600081511115620011745780518082602001fd5b83836040517f192105d7000000000000000000000000000000000000000000000000000000008152600401620011ac92919062001e6c565b60405180910390fd5b50505b5050565b6000823b9050600081036200120c5782826040517f919834b90000000000000000000000000000000000000000000000000000000081526004016200120392919062001efd565b60405180910390fd5b505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62001275826200122a565b810181811067ffffffffffffffff821117156200129757620012966200123b565b5b80604052505050565b6000620012ac62001211565b9050620012ba82826200126a565b919050565b600067ffffffffffffffff821115620012dd57620012dc6200123b565b5b602082029050602081019050919050565b600080fd5b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200132a82620012fd565b9050919050565b6200133c816200131d565b81146200134857600080fd5b50565b6000815190506200135c8162001331565b92915050565b600381106200137057600080fd5b50565b600081519050620013848162001362565b92915050565b600067ffffffffffffffff821115620013a857620013a76200123b565b5b602082029050602081019050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b620013f081620013b9565b8114620013fc57600080fd5b50565b6000815190506200141081620013e5565b92915050565b60006200142d62001427846200138a565b620012a0565b90508083825260208201905060208402830185811115620014535762001452620012ee565b5b835b818110156200148057806200146b8882620013ff565b84526020840193505060208101905062001455565b5050509392505050565b600082601f830112620014a257620014a162001225565b5b8151620014b484826020860162001416565b91505092915050565b600060608284031215620014d657620014d5620012f3565b5b620014e26060620012a0565b90506000620014f4848285016200134b565b60008301525060206200150a8482850162001373565b602083015250604082015167ffffffffffffffff811115620015315762001530620012f8565b5b6200153f848285016200148a565b60408301525092915050565b6000620015626200155c84620012bf565b620012a0565b90508083825260208201905060208402830185811115620015885762001587620012ee565b5b835b81811015620015d657805167ffffffffffffffff811115620015b157620015b062001225565b5b808601620015c08982620014bd565b855260208501945050506020810190506200158a565b5050509392505050565b600082601f830112620015f857620015f762001225565b5b81516200160a8482602086016200154b565b91505092915050565b600080fd5b600067ffffffffffffffff8211156200163657620016356200123b565b5b62001641826200122a565b9050602081019050919050565b60005b838110156200166e57808201518184015260208101905062001651565b60008484015250505050565b6000620016916200168b8462001618565b620012a0565b905082815260208101848484011115620016b057620016af62001613565b5b620016bd8482856200164e565b509392505050565b600082601f830112620016dd57620016dc62001225565b5b8151620016ef8482602086016200167a565b91505092915050565b600381106200170657600080fd5b50565b6000815190506200171a81620016f8565b92915050565b600060a08284031215620017395762001738620012f3565b5b6200174560a0620012a0565b9050600062001757848285016200134b565b60008301525060206200176d848285016200134b565b602083015250604082015167ffffffffffffffff811115620017945762001793620012f8565b5b620017a284828501620016c5565b6040830152506060620017b8848285016200134b565b6060830152506080620017ce8482850162001709565b60808301525092915050565b60008060408385031215620017f457620017f36200121b565b5b600083015167ffffffffffffffff81111562001815576200181462001220565b5b6200182385828601620015e0565b925050602083015167ffffffffffffffff81111562001847576200184662001220565b5b620018558582860162001720565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b620018c8816200131d565b82525050565b6000602082019050620018e56000830184620018bd565b92915050565b600060ff82169050919050565b6200190381620018eb565b82525050565b6000602082019050620019206000830184620018f8565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b60006200196c8262001955565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620019a157620019a062001926565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b620019e3816200131d565b82525050565b60038110620019fd57620019fc6200185f565b5b50565b600081905062001a1082620019e9565b919050565b600062001a228262001a00565b9050919050565b62001a348162001a15565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b62001a7181620013b9565b82525050565b600062001a85838362001a66565b60208301905092915050565b6000602082019050919050565b600062001aab8262001a3a565b62001ab7818562001a45565b935062001ac48362001a56565b8060005b8381101562001afb57815162001adf888262001a77565b975062001aec8362001a91565b92505060018101905062001ac8565b5085935050505092915050565b600060608301600083015162001b226000860182620019d8565b50602083015162001b37602086018262001a29565b506040830151848203604086015262001b51828262001a9e565b9150508091505092915050565b600062001b6c838362001b08565b905092915050565b6000602082019050919050565b600062001b8e82620019ac565b62001b9a8185620019b7565b93508360208202850162001bae85620019c8565b8060005b8581101562001bf0578484038952815162001bce858262001b5e565b945062001bdb8362001b74565b925060208a0199505060018101905062001bb2565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b600062001c2b8262001c02565b62001c37818562001c0d565b935062001c498185602086016200164e565b62001c54816200122a565b840191505092915050565b6000606082019050818103600083015262001c7b818662001b81565b905062001c8c6020830185620018bd565b818103604083015262001ca0818462001c1e565b9050949350505050565b600082825260208201905092915050565b600062001cc88262001a3a565b62001cd4818562001caa565b935062001ce18362001a56565b8060005b8381101562001d1857815162001cfc888262001a77565b975062001d098362001a91565b92505060018101905062001ce5565b5085935050505092915050565b6000602082019050818103600083015262001d41818462001cbb565b905092915050565b62001d5481620013b9565b82525050565b600060208201905062001d71600083018462001d49565b92915050565b600061ffff82169050919050565b600062001d928262001d77565b915061ffff820362001da95762001da862001926565b5b600182019050919050565b600062001dc18262001955565b91506000820362001dd75762001dd662001926565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081905092915050565b600062001e298262001c02565b62001e35818562001e11565b935062001e478185602086016200164e565b80840191505092915050565b600062001e61828462001e1c565b915081905092915050565b600060408201905062001e836000830185620018bd565b818103602083015262001e97818462001c1e565b90509392505050565b600081519050919050565b600082825260208201905092915050565b600062001ec98262001ea0565b62001ed5818562001eab565b935062001ee78185602086016200164e565b62001ef2816200122a565b840191505092915050565b600060408201905062001f146000830185620018bd565b818103602083015262001f28818462001ebc565b90509392505050565b6118d48062001f416000396000f3fe60806040526000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c9050809150600082600001600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610160576000357fffffffff00000000000000000000000000000000000000000000000000000000166040517f5416eb980000000000000000000000000000000000000000000000000000000081526004016101579190611178565b60405180910390fd5b3660008037600080366000845af43d6000803e8060008114610181573d6000f35b3d6000fd5b60006101906104a7565b905060008160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b60005b835181101561042f57600084828151811061027e5761027d611193565b5b602002602001015160400151905060008583815181106102a1576102a0611193565b5b602002602001015160000151905060008251036102f557806040517fe767f91f0000000000000000000000000000000000000000000000000000000081526004016102ec9190611203565b60405180910390fd5b600086848151811061030a57610309611193565b5b60200260200101516020015190506000600281111561032c5761032b61121e565b5b81600281111561033f5761033e61121e565b5b036103535761034e82846104d4565b610419565b600160028111156103675761036661121e565b5b81600281111561037a5761037961121e565b5b0361038e5761038982846107fc565b610418565b6002808111156103a1576103a061121e565b5b8160028111156103b4576103b361121e565b5b036103c8576103c38284610b42565b610417565b8060028111156103db576103da61121e565b5b6040517f7fe9a41e00000000000000000000000000000000000000000000000000000000815260040161040e9190611269565b60405180910390fd5b5b5b5050508080610427906112bd565b915050610260565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673838383604051610463939291906115bc565b60405180910390a16104758282610fc9565b505050565b6000807fdd40e1fc471fef58a9b638822d14c35549994757e95ac83b6e1a8018ad2db4f390508091505090565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361054557806040517f0ae3681c00000000000000000000000000000000000000000000000000000000815260040161053c9190611670565b60405180910390fd5b600061054f6104a7565b905060008160010180549050905061057f8460405180606001604052806024815260200161182b602491396110eb565b60005b83518110156107f55760008482815181106105a05761059f611193565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461069657816040517febbf5d0700000000000000000000000000000000000000000000000000000000815260040161068d9190611178565b60405180910390fd5b60405180604001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018561ffff16815250856000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff160217905550905050846001018290806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c021790555083806107dd906116a0565b945050505080806107ed906112bd565b915050610582565b5050505050565b60006108066104a7565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361087957816040517fcd98a96f0000000000000000000000000000000000000000000000000000000081526004016108709190611670565b60405180910390fd5b61089b83604051806060016040528060288152602001611877602891396110eb565b60005b8251811015610b3c5760008382815181106108bc576108bb611193565b5b602002602001015190506000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109b157816040517f520300da0000000000000000000000000000000000000000000000000000000081526004016109a89190611178565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a2157816040517f358d9d1a000000000000000000000000000000000000000000000000000000008152600401610a189190611178565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a9257816040517f7479f939000000000000000000000000000000000000000000000000000000008152600401610a899190611178565b60405180910390fd5b85846000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050508080610b34906112bd565b91505061089e565b50505050565b6000610b4c6104a7565b9050600081600101805490509050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610bcb57836040517fd091bc81000000000000000000000000000000000000000000000000000000008152600401610bc29190611203565b60405180910390fd5b60005b8351811015610fc2576000848281518110610bec57610beb611193565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900461ffff1661ffff1661ffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610d4357816040517f7a08a22d000000000000000000000000000000000000000000000000000000008152600401610d3a9190611178565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610db757816040517f6fafeb08000000000000000000000000000000000000000000000000000000008152600401610dae9190611178565b60405180910390fd5b8380610dc2906116ca565b94505083816020015161ffff1614610ed7576000856001018581548110610dec57610deb611193565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90508086600101836020015161ffff1681548110610e3057610e2f611193565b5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908360e01c02179055508160200151866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a81548161ffff021916908361ffff160217905550505b84600101805480610eeb57610eea6116f3565b5b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff02191690559055846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549061ffff0219169055505050508080610fba906112bd565b915050610bce565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603156110e7576110208260405180606001604052806028815260200161184f602891396110eb565b6000808373ffffffffffffffffffffffffffffffffffffffff1683604051611048919061175e565b600060405180830381855af49150503d8060008114611083576040519150601f19603f3d011682016040523d82523d6000602084013e611088565b606091505b5091509150816110e4576000815111156110a55780518082602001fd5b83836040517f192105d70000000000000000000000000000000000000000000000000000000081526004016110db929190611775565b60405180910390fd5b50505b5050565b6000823b9050600081036111385782826040517f919834b900000000000000000000000000000000000000000000000000000000815260040161112f9291906117fa565b60405180910390fd5b505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6111728161113d565b82525050565b600060208201905061118d6000830184611169565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006111ed826111c2565b9050919050565b6111fd816111e2565b82525050565b600060208201905061121860008301846111f4565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060ff82169050919050565b6112638161124d565b82525050565b600060208201905061127e600083018461125a565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b60006112c8826112b3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036112fa576112f9611284565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61133a816111e2565b82525050565b600381106113515761135061121e565b5b50565b600081905061136282611340565b919050565b600061137282611354565b9050919050565b61138281611367565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6113bd8161113d565b82525050565b60006113cf83836113b4565b60208301905092915050565b6000602082019050919050565b60006113f382611388565b6113fd8185611393565b9350611408836113a4565b8060005b8381101561143957815161142088826113c3565b975061142b836113db565b92505060018101905061140c565b5085935050505092915050565b600060608301600083015161145e6000860182611331565b5060208301516114716020860182611379565b506040830151848203604086015261148982826113e8565b9150508091505092915050565b60006114a28383611446565b905092915050565b6000602082019050919050565b60006114c282611305565b6114cc8185611310565b9350836020820285016114de85611321565b8060005b8581101561151a57848403895281516114fb8582611496565b9450611506836114aa565b925060208a019950506001810190506114e2565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561156657808201518184015260208101905061154b565b60008484015250505050565b6000601f19601f8301169050919050565b600061158e8261152c565b6115988185611537565b93506115a8818560208601611548565b6115b181611572565b840191505092915050565b600060608201905081810360008301526115d681866114b7565b90506115e560208301856111f4565b81810360408301526115f78184611583565b9050949350505050565b600082825260208201905092915050565b600061161d82611388565b6116278185611601565b9350611632836113a4565b8060005b8381101561166357815161164a88826113c3565b9750611655836113db565b925050600181019050611636565b5085935050505092915050565b6000602082019050818103600083015261168a8184611612565b905092915050565b600061ffff82169050919050565b60006116ab82611692565b915061ffff82036116bf576116be611284565b5b600182019050919050565b60006116d5826112b3565b9150600082036116e8576116e7611284565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081905092915050565b60006117388261152c565b6117428185611722565b9350611752818560208601611548565b80840191505092915050565b600061176a828461172d565b915081905092915050565b600060408201905061178a60008301856111f4565b818103602083015261179c8184611583565b90509392505050565b600081519050919050565b600082825260208201905092915050565b60006117cc826117a5565b6117d681856117b0565b93506117e6818560208601611548565b6117ef81611572565b840191505092915050565b600060408201905061180f60008301856111f4565b818103602083015261182181846117c1565b9050939250505056fe4c69624469616d6f6e644375743a2041646420666163657420686173206e6f20636f64654c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a205265706c61636520666163657420686173206e6f20636f6465a2646970667358221220509984431da03304be7efb319cba788d4ae3b3de7e88d17bfe3686264abfd28364736f6c634300081100334c69624469616d6f6e644375743a2041646420666163657420686173206e6f20636f64654c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a205265706c61636520666163657420686173206e6f20636f646500000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000860000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000000002e00000000000000000000000009cb01665fc3eef0b0bc2787b72b7f055b6fd48b50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000011f931c1c0000000000000000000000000000000000000000000000000000000000000000000000000000000008bee424c4126dee592abb856704b75137e41a4c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004cdffacc60000000000000000000000000000000000000000000000000000000052ef6b2c00000000000000000000000000000000000000000000000000000000adfca15e000000000000000000000000000000000000000000000000000000007a0ed6270000000000000000000000000000000000000000000000000000000000000000000000000000000021b89d7a83f59efe715df709348b49c46d934fac0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000028da5cb5b00000000000000000000000000000000000000000000000000000000f2fde38b000000000000000000000000000000000000000000000000000000000000000000000000000000008842e11a65e10d81c17bbaae99a466ad523f3739000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000025095ea7b30000000000000000000000000000000000000000000000000000000070a082310000000000000000000000000000000000000000000000000000000042966c6800000000000000000000000000000000000000000000000000000000c70384b8000000000000000000000000000000000000000000000000000000004f558e7900000000000000000000000000000000000000000000000000000000b94a210200000000000000000000000000000000000000000000000000000000081812fc00000000000000000000000000000000000000000000000000000000bd4986a00000000000000000000000000000000000000000000000000000000072b1b85900000000000000000000000000000000000000000000000000000000b3464fd6000000000000000000000000000000000000000000000000000000003276558c00000000000000000000000000000000000000000000000000000000ef6fd87800000000000000000000000000000000000000000000000000000000d54f7d5e000000000000000000000000000000000000000000000000000000000e9ed68b000000000000000000000000000000000000000000000000000000008129fc1c00000000000000000000000000000000000000000000000000000000e985e9c500000000000000000000000000000000000000000000000000000000bdb4b8480000000000000000000000000000000000000000000000000000000066a306d7000000000000000000000000000000000000000000000000000000005d228b160000000000000000000000000000000000000000000000000000000006fdde03000000000000000000000000000000000000000000000000000000006352211e000000000000000000000000000000000000000000000000000000001f2757130000000000000000000000000000000000000000000000000000000056e3a1ae0000000000000000000000000000000000000000000000000000000042842e0e00000000000000000000000000000000000000000000000000000000b88d4fde00000000000000000000000000000000000000000000000000000000a22cb46500000000000000000000000000000000000000000000000000000000f95d71b1000000000000000000000000000000000000000000000000000000003b189852000000000000000000000000000000000000000000000000000000008545f4ea0000000000000000000000000000000000000000000000000000000001ffc9a70000000000000000000000000000000000000000000000000000000095d89b41000000000000000000000000000000000000000000000000000000004f6ccce7000000000000000000000000000000000000000000000000000000002f745c5900000000000000000000000000000000000000000000000000000000c87b56dd0000000000000000000000000000000000000000000000000000000018160ddd0000000000000000000000000000000000000000000000000000000023b872dd000000000000000000000000000000000000000000000000000000003ccfd60b00000000000000000000000000000000000000000000000000000000000000000000000000000000046bf7bb88e0e0941358ce3f5a765c9acdda7b9c000000000000000000000000d93990f21b3223bbbc727ae53ca11095c50c7ec300000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000dfff808a2b1809409b7e6394fb98bc696ecaf73800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004e1c7392a00000000000000000000000000000000000000000000000000000000
Deployed ByteCode
0x60806040526000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c9050809150600082600001600080357fffffffff00000000000000000000000000000000000000000000000000000000167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610160576000357fffffffff00000000000000000000000000000000000000000000000000000000166040517f5416eb980000000000000000000000000000000000000000000000000000000081526004016101579190611178565b60405180910390fd5b3660008037600080366000845af43d6000803e8060008114610181573d6000f35b3d6000fd5b60006101906104a7565b905060008160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050828260030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b60005b835181101561042f57600084828151811061027e5761027d611193565b5b602002602001015160400151905060008583815181106102a1576102a0611193565b5b602002602001015160000151905060008251036102f557806040517fe767f91f0000000000000000000000000000000000000000000000000000000081526004016102ec9190611203565b60405180910390fd5b600086848151811061030a57610309611193565b5b60200260200101516020015190506000600281111561032c5761032b61121e565b5b81600281111561033f5761033e61121e565b5b036103535761034e82846104d4565b610419565b600160028111156103675761036661121e565b5b81600281111561037a5761037961121e565b5b0361038e5761038982846107fc565b610418565b6002808111156103a1576103a061121e565b5b8160028111156103b4576103b361121e565b5b036103c8576103c38284610b42565b610417565b8060028111156103db576103da61121e565b5b6040517f7fe9a41e00000000000000000000000000000000000000000000000000000000815260040161040e9190611269565b60405180910390fd5b5b5b5050508080610427906112bd565b915050610260565b507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673838383604051610463939291906115bc565b60405180910390a16104758282610fc9565b505050565b6000807fdd40e1fc471fef58a9b638822d14c35549994757e95ac83b6e1a8018ad2db4f390508091505090565b6000807fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c90508091505090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361054557806040517f0ae3681c00000000000000000000000000000000000000000000000000000000815260040161053c9190611670565b60405180910390fd5b600061054f6104a7565b905060008160010180549050905061057f8460405180606001604052806024815260200161182b602491396110eb565b60005b83518110156107f55760008482815181106105a05761059f611193565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461069657816040517febbf5d0700000000000000000000000000000000000000000000000000000000815260040161068d9190611178565b60405180910390fd5b60405180604001604052808873ffffffffffffffffffffffffffffffffffffffff1681526020018561ffff16815250856000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548161ffff021916908361ffff160217905550905050846001018290806001815401808255809150506001900390600052602060002090600891828204019190066004029091909190916101000a81548163ffffffff021916908360e01c021790555083806107dd906116a0565b945050505080806107ed906112bd565b915050610582565b5050505050565b60006108066104a7565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361087957816040517fcd98a96f0000000000000000000000000000000000000000000000000000000081526004016108709190611670565b60405180910390fd5b61089b83604051806060016040528060288152602001611877602891396110eb565b60005b8251811015610b3c5760008382815181106108bc576108bb611193565b5b602002602001015190506000836000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109b157816040517f520300da0000000000000000000000000000000000000000000000000000000081526004016109a89190611178565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a2157816040517f358d9d1a000000000000000000000000000000000000000000000000000000008152600401610a189190611178565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a9257816040517f7479f939000000000000000000000000000000000000000000000000000000008152600401610a899190611178565b60405180910390fd5b85846000016000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050508080610b34906112bd565b91505061089e565b50505050565b6000610b4c6104a7565b9050600081600101805490509050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610bcb57836040517fd091bc81000000000000000000000000000000000000000000000000000000008152600401610bc29190611203565b60405180910390fd5b60005b8351811015610fc2576000848281518110610bec57610beb611193565b5b602002602001015190506000846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900461ffff1661ffff1661ffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610d4357816040517f7a08a22d000000000000000000000000000000000000000000000000000000008152600401610d3a9190611178565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610db757816040517f6fafeb08000000000000000000000000000000000000000000000000000000008152600401610dae9190611178565b60405180910390fd5b8380610dc2906116ca565b94505083816020015161ffff1614610ed7576000856001018581548110610dec57610deb611193565b5b90600052602060002090600891828204019190066004029054906101000a900460e01b90508086600101836020015161ffff1681548110610e3057610e2f611193565b5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908360e01c02179055508160200151866000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060000160146101000a81548161ffff021916908361ffff160217905550505b84600101805480610eeb57610eea6116f3565b5b60019003818190600052602060002090600891828204019190066004026101000a81549063ffffffff02191690559055846000016000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a81549061ffff0219169055505050508080610fba906112bd565b915050610bce565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603156110e7576110208260405180606001604052806028815260200161184f602891396110eb565b6000808373ffffffffffffffffffffffffffffffffffffffff1683604051611048919061175e565b600060405180830381855af49150503d8060008114611083576040519150601f19603f3d011682016040523d82523d6000602084013e611088565b606091505b5091509150816110e4576000815111156110a55780518082602001fd5b83836040517f192105d70000000000000000000000000000000000000000000000000000000081526004016110db929190611775565b60405180910390fd5b50505b5050565b6000823b9050600081036111385782826040517f919834b900000000000000000000000000000000000000000000000000000000815260040161112f9291906117fa565b60405180910390fd5b505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6111728161113d565b82525050565b600060208201905061118d6000830184611169565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006111ed826111c2565b9050919050565b6111fd816111e2565b82525050565b600060208201905061121860008301846111f4565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060ff82169050919050565b6112638161124d565b82525050565b600060208201905061127e600083018461125a565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000819050919050565b60006112c8826112b3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036112fa576112f9611284565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61133a816111e2565b82525050565b600381106113515761135061121e565b5b50565b600081905061136282611340565b919050565b600061137282611354565b9050919050565b61138281611367565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6113bd8161113d565b82525050565b60006113cf83836113b4565b60208301905092915050565b6000602082019050919050565b60006113f382611388565b6113fd8185611393565b9350611408836113a4565b8060005b8381101561143957815161142088826113c3565b975061142b836113db565b92505060018101905061140c565b5085935050505092915050565b600060608301600083015161145e6000860182611331565b5060208301516114716020860182611379565b506040830151848203604086015261148982826113e8565b9150508091505092915050565b60006114a28383611446565b905092915050565b6000602082019050919050565b60006114c282611305565b6114cc8185611310565b9350836020820285016114de85611321565b8060005b8581101561151a57848403895281516114fb8582611496565b9450611506836114aa565b925060208a019950506001810190506114e2565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561156657808201518184015260208101905061154b565b60008484015250505050565b6000601f19601f8301169050919050565b600061158e8261152c565b6115988185611537565b93506115a8818560208601611548565b6115b181611572565b840191505092915050565b600060608201905081810360008301526115d681866114b7565b90506115e560208301856111f4565b81810360408301526115f78184611583565b9050949350505050565b600082825260208201905092915050565b600061161d82611388565b6116278185611601565b9350611632836113a4565b8060005b8381101561166357815161164a88826113c3565b9750611655836113db565b925050600181019050611636565b5085935050505092915050565b6000602082019050818103600083015261168a8184611612565b905092915050565b600061ffff82169050919050565b60006116ab82611692565b915061ffff82036116bf576116be611284565b5b600182019050919050565b60006116d5826112b3565b9150600082036116e8576116e7611284565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081905092915050565b60006117388261152c565b6117428185611722565b9350611752818560208601611548565b80840191505092915050565b600061176a828461172d565b915081905092915050565b600060408201905061178a60008301856111f4565b818103602083015261179c8184611583565b90509392505050565b600081519050919050565b600082825260208201905092915050565b60006117cc826117a5565b6117d681856117b0565b93506117e6818560208601611548565b6117ef81611572565b840191505092915050565b600060408201905061180f60008301856111f4565b818103602083015261182181846117c1565b9050939250505056fe4c69624469616d6f6e644375743a2041646420666163657420686173206e6f20636f64654c69624469616d6f6e644375743a205f696e6974206164647265737320686173206e6f20636f64654c69624469616d6f6e644375743a205265706c61636520666163657420686173206e6f20636f6465a2646970667358221220509984431da03304be7efb319cba788d4ae3b3de7e88d17bfe3686264abfd28364736f6c63430008110033