diff --git a/deployments/compiler-inputs/f096d2968ac6c775921975b16cb0c91e.json b/deployments/compiler-inputs/f096d2968ac6c775921975b16cb0c91e.json new file mode 100644 index 0000000..54559a8 --- /dev/null +++ b/deployments/compiler-inputs/f096d2968ac6c775921975b16cb0c91e.json @@ -0,0 +1,1451 @@ +{ + "solcVersion": "0.8.23", + "solcLongVersion": "0.8.23", + "id": "f096d2968ac6c775921975b16cb0c91e", + "input": { + "language": "Solidity", + "settings": { + "viaIR": false, + "optimizer": { + "runs": 100000000, + "enabled": true + }, + "metadata": { + "useLiteralContent": false, + "bytecodeHash": "ipfs", + "appendCBOR": true + }, + "outputSelection": { + "lib/forge-std/lib/ds-test/src/test.sol": { + "*": [] + }, + "lib/forge-std/src/Base.sol": { + "*": [] + }, + "lib/forge-std/src/Script.sol": { + "*": [] + }, + "lib/forge-std/src/StdAssertions.sol": { + "*": [] + }, + "lib/forge-std/src/StdChains.sol": { + "*": [] + }, + "lib/forge-std/src/StdCheats.sol": { + "*": [] + }, + "lib/forge-std/src/StdError.sol": { + "*": [] + }, + "lib/forge-std/src/StdInvariant.sol": { + "*": [] + }, + "lib/forge-std/src/StdJson.sol": { + "*": [] + }, + "lib/forge-std/src/StdMath.sol": { + "*": [] + }, + "lib/forge-std/src/StdStorage.sol": { + "*": [] + }, + "lib/forge-std/src/StdStyle.sol": { + "*": [] + }, + "lib/forge-std/src/StdUtils.sol": { + "*": [] + }, + "lib/forge-std/src/Test.sol": { + "*": [] + }, + "lib/forge-std/src/Vm.sol": { + "*": [] + }, + "lib/forge-std/src/console.sol": { + "*": [] + }, + "lib/forge-std/src/console2.sol": { + "*": [] + }, + "lib/forge-std/src/interfaces/IMulticall3.sol": { + "*": [] + }, + "lib/forge-std/src/mocks/MockERC20.sol": { + "*": [] + }, + "lib/forge-std/src/mocks/MockERC721.sol": { + "*": [] + }, + "lib/forge-std/src/safeconsole.sol": { + "*": [] + }, + "node_modules/@bananapus/core/script/helpers/CoreDeploymentLib.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/src/JBController.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/src/JBDeadline.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/src/JBDirectory.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/JBERC20.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/JBFeelessAddresses.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/JBFundAccessLimits.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/JBMultiTerminal.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/src/JBPermissions.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/JBPrices.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/JBProjects.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/JBRulesets.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/src/JBSplits.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/src/JBTerminalStore.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/src/JBTokens.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/abstract/JBControlled.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/abstract/JBPermissioned.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/enums/JBApprovalStatus.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBControlled.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBController.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/src/interfaces/IJBDirectory.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBDirectoryAccessControl.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBFeeTerminal.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBFeelessAddresses.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBFundAccessLimits.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBMigratable.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBMultiTerminal.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/src/interfaces/IJBPayHook.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBPayoutTerminal.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBPermissioned.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBPermissions.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBPermitTerminal.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBPriceFeed.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBPrices.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBProjectUriRegistry.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBProjects.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBRedeemHook.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBRedeemTerminal.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBRulesetApprovalHook.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBRulesetDataHook.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/src/interfaces/IJBRulesets.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/src/interfaces/IJBSplitHook.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBSplits.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBTerminal.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBTerminalStore.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/src/interfaces/IJBToken.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBTokenUriResolver.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/interfaces/IJBTokens.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/libraries/JBConstants.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/src/libraries/JBCurrencyIds.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/libraries/JBFees.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/src/libraries/JBFixedPointNumber.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/libraries/JBMetadataResolver.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/libraries/JBRedemptions.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/src/libraries/JBRulesetMetadataResolver.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/src/libraries/JBSplitGroupIds.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/structs/JBAccountingContext.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/structs/JBAfterPayRecordedContext.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/structs/JBAfterRedeemRecordedContext.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/structs/JBBeforePayRecordedContext.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/src/structs/JBBeforeRedeemRecordedContext.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/structs/JBCurrencyAmount.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/structs/JBFee.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/structs/JBFundAccessLimitGroup.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/structs/JBPayHookSpecification.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/structs/JBPermissionsData.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/structs/JBRedeemHookSpecification.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/structs/JBRuleset.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/src/structs/JBRulesetConfig.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/src/structs/JBRulesetMetadata.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/src/structs/JBRulesetWeightCache.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/structs/JBRulesetWithMetadata.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/src/structs/JBSingleAllowance.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/structs/JBSplit.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/structs/JBSplitGroup.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/structs/JBSplitHookContext.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/structs/JBTerminalConfig.sol": { + "*": [] + }, + "node_modules/@bananapus/core/src/structs/JBTokenAmount.sol": { + "*": [] + }, + "node_modules/@bananapus/core/test/helpers/JBTest.sol": { + "*": [] + }, + "node_modules/@bananapus/core/test/helpers/MetadataResolverHelper.sol": { + "*": [] + }, + "node_modules/@bananapus/core/test/helpers/TestBaseWorkflow.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/core/test/mock/MockERC20.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@bananapus/permission-ids/src/JBPermissionIds.sol": { + "*": [] + }, + "node_modules/@exhausted-pigeon/uniswap-v3-forge-quoter/src/UniswapV3ForgeQuoter.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/access/Ownable.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/governance/utils/Votes.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC20.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/metatx/ERC2771Context.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/proxy/Clones.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/token/ERC721/ERC721.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/utils/Address.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/utils/Context.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/utils/Nonces.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/utils/ReentrancyGuard.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/utils/ShortStrings.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/utils/StorageSlot.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/utils/Strings.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/utils/introspection/ERC165Checker.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/utils/math/Math.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/utils/structs/Checkpoints.sol": { + "*": [] + }, + "node_modules/@openzeppelin/contracts/utils/types/Time.sol": { + "*": [] + }, + "node_modules/@prb/math/src/Common.sol": { + "*": [] + }, + "node_modules/@prb/math/src/UD60x18.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@prb/math/src/sd1x18/Casting.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@prb/math/src/sd1x18/Constants.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@prb/math/src/sd1x18/Errors.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@prb/math/src/sd1x18/ValueType.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@prb/math/src/sd59x18/Casting.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@prb/math/src/sd59x18/Constants.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@prb/math/src/sd59x18/Errors.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@prb/math/src/sd59x18/Helpers.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@prb/math/src/sd59x18/Math.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@prb/math/src/sd59x18/ValueType.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@prb/math/src/ud2x18/Casting.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@prb/math/src/ud2x18/Constants.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@prb/math/src/ud2x18/Errors.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@prb/math/src/ud2x18/ValueType.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@prb/math/src/ud60x18/Casting.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@prb/math/src/ud60x18/Constants.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@prb/math/src/ud60x18/Conversions.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@prb/math/src/ud60x18/Errors.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@prb/math/src/ud60x18/Helpers.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@prb/math/src/ud60x18/Math.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@prb/math/src/ud60x18/ValueType.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "node_modules/@sphinx-labs/contracts/contracts/core/SphinxDataTypes.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/core/interfaces/ISphinxModule.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/core/interfaces/ISphinxModuleProxyFactory.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/forge-std/src/StdUtils.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/forge-std/src/Vm.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/forge-std/src/interfaces/IERC165.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/forge-std/src/interfaces/IERC20.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/forge-std/src/interfaces/IERC721.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/forge-std/src/interfaces/IMulticall3.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/forge-std/src/mocks/MockERC20.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/forge-std/src/mocks/MockERC721.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/foundry/Sphinx.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/foundry/SphinxConstants.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/foundry/SphinxForkCheck.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/foundry/SphinxPlugin.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/foundry/SphinxPluginTypes.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/foundry/SphinxUtils.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/foundry/interfaces/ICreateCall.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/foundry/interfaces/IEnum.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/foundry/interfaces/IGnosisSafe.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/foundry/interfaces/IGnosisSafeProxy.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/foundry/interfaces/IGnosisSafeProxyFactory.sol": { + "*": [] + }, + "node_modules/@sphinx-labs/contracts/contracts/foundry/interfaces/IMultiSend.sol": { + "*": [] + }, + "node_modules/@uniswap/permit2/src/interfaces/IAllowanceTransfer.sol": { + "*": [] + }, + "node_modules/@uniswap/permit2/src/interfaces/IEIP712.sol": { + "*": [] + }, + "node_modules/@uniswap/permit2/src/interfaces/IPermit2.sol": { + "*": [] + }, + "node_modules/@uniswap/permit2/src/interfaces/ISignatureTransfer.sol": { + "*": [] + }, + "node_modules/@uniswap/permit2/test/utils/DeployPermit2.sol": { + "*": [] + }, + "node_modules/@uniswap/v3-core/contracts/interfaces/IUniswapV3Factory.sol": { + "*": [] + }, + "node_modules/@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol": { + "*": [] + }, + "node_modules/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol": { + "*": [] + }, + "node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions.sol": { + "*": [] + }, + "node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState.sol": { + "*": [] + }, + "node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolErrors.sol": { + "*": [] + }, + "node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents.sol": { + "*": [] + }, + "node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables.sol": { + "*": [] + }, + "node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions.sol": { + "*": [] + }, + "node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.sol": { + "*": [] + }, + "node_modules/@uniswap/v3-core/contracts/libraries/FullMath.sol": { + "*": [] + }, + "node_modules/@uniswap/v3-core/contracts/libraries/TickMath.sol": { + "*": [] + }, + "node_modules/@uniswap/v3-periphery/contracts/libraries/OracleLibrary.sol": { + "*": [] + }, + "script/Deploy.s.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "script/helpers/BuybackDeploymentLib.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "src/JBBuybackHook.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "src/interfaces/IJBBuybackHook.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "src/interfaces/external/IWETH9.sol": { + "*": [] + }, + "test/Fork.t.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "test/Unit.t.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + }, + "test/helpers/PoolAddress.sol": { + "*": [] + }, + "test/helpers/TestBaseWorkflowV3.sol": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + } + }, + "evmVersion": "paris", + "libraries": {}, + "remappings": [ + "@sphinx-labs/contracts/=node_modules/@sphinx-labs/contracts/contracts/foundry/", + "@bananapus/=node_modules/@bananapus/", + "@chainlink/=node_modules/@chainlink/", + "@eth-optimism/=node_modules/@eth-optimism/", + "@exhausted-pigeon/=node_modules/@exhausted-pigeon/", + "@openzeppelin/=node_modules/@openzeppelin/", + "@prb/=node_modules/@prb/", + "@scroll-tech/=node_modules/@scroll-tech/", + "@uniswap/=node_modules/@uniswap/", + "base64-sol/=node_modules/base64-sol/", + "ds-test/=lib/forge-std/lib/ds-test/src/", + "forge-std/=lib/forge-std/src/", + "hardhat/=node_modules/hardhat/", + "solmate/=node_modules/solmate/", + "sphinx/=lib/sphinx/packages/contracts/contracts/forge-std/src/" + ] + }, + "sources": { + "node_modules/@bananapus/core/src/abstract/JBPermissioned.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {Context} from \"@openzeppelin/contracts/utils/Context.sol\";\n\nimport {IJBPermissioned} from \"./../interfaces/IJBPermissioned.sol\";\nimport {IJBPermissions} from \"./../interfaces/IJBPermissions.sol\";\n\n/// @notice Modifiers to allow access to transactions based on which permissions the message's sender has.\nabstract contract JBPermissioned is Context, IJBPermissioned {\n //*********************************************************************//\n // --------------------------- custom errors -------------------------- //\n //*********************************************************************//\n error UNAUTHORIZED();\n\n //*********************************************************************//\n // ---------------- public immutable stored properties --------------- //\n //*********************************************************************//\n\n /// @notice A contract storing permissions.\n IJBPermissions public immutable override PERMISSIONS;\n\n //*********************************************************************//\n // -------------------------- constructor ---------------------------- //\n //*********************************************************************//\n\n /// @param permissions A contract storing permissions.\n constructor(IJBPermissions permissions) {\n PERMISSIONS = permissions;\n }\n\n //*********************************************************************//\n // -------------------------- internal views ------------------------- //\n //*********************************************************************//\n\n /// @notice Require the message sender to be the account or have the relevant permission.\n /// @param account The account to allow.\n /// @param projectId The project ID to check the permission under.\n /// @param permissionId The required permission ID. The operator must have this permission within the specified\n /// project ID.\n function _requirePermissionFrom(address account, uint256 projectId, uint256 permissionId) internal view {\n address sender = _msgSender();\n if (\n sender != account\n && !PERMISSIONS.hasPermission({\n operator: sender,\n account: account,\n projectId: projectId,\n permissionId: permissionId,\n includeRoot: true,\n includeWildcardProjectId: true\n })\n ) revert UNAUTHORIZED();\n }\n\n /// @notice If the 'alsoGrantAccessIf' condition is truthy, proceed. Otherwise, require the message sender to be the\n /// account or\n /// have the relevant permission.\n /// @param account The account to allow.\n /// @param projectId The project ID to check the permission under.\n /// @param permissionId The required permission ID. The operator must have this permission within the specified\n /// project ID.\n /// @param alsoGrantAccessIf An override condition which will allow access regardless of permissions.\n function _requirePermissionAllowingOverrideFrom(\n address account,\n uint256 projectId,\n uint256 permissionId,\n bool alsoGrantAccessIf\n )\n internal\n view\n {\n if (alsoGrantAccessIf) return;\n _requirePermissionFrom(account, projectId, permissionId);\n }\n}\n" + }, + "node_modules/@bananapus/core/src/enums/JBApprovalStatus.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice A ruleset's approval status in a ruleset approval hook.\nenum JBApprovalStatus {\n Empty,\n Upcoming,\n Active,\n ApprovalExpected,\n Approved,\n Failed\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBController.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IERC165} from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\nimport {JBApprovalStatus} from \"./../enums/JBApprovalStatus.sol\";\nimport {JBRuleset} from \"./../structs/JBRuleset.sol\";\nimport {JBRulesetConfig} from \"./../structs/JBRulesetConfig.sol\";\nimport {JBRulesetMetadata} from \"./../structs/JBRulesetMetadata.sol\";\nimport {JBRulesetWithMetadata} from \"./../structs/JBRulesetWithMetadata.sol\";\nimport {JBSplit} from \"./../structs/JBSplit.sol\";\nimport {JBSplitGroup} from \"./../structs/JBSplitGroup.sol\";\nimport {JBTerminalConfig} from \"./../structs/JBTerminalConfig.sol\";\nimport {IJBDirectory} from \"./IJBDirectory.sol\";\nimport {IJBDirectoryAccessControl} from \"./IJBDirectoryAccessControl.sol\";\nimport {IJBFundAccessLimits} from \"./IJBFundAccessLimits.sol\";\nimport {IJBPriceFeed} from \"./IJBPriceFeed.sol\";\nimport {IJBPrices} from \"./IJBPrices.sol\";\nimport {IJBProjects} from \"./IJBProjects.sol\";\nimport {IJBProjectUriRegistry} from \"./IJBProjectUriRegistry.sol\";\nimport {IJBRulesets} from \"./IJBRulesets.sol\";\nimport {IJBSplits} from \"./IJBSplits.sol\";\nimport {IJBTerminal} from \"./IJBTerminal.sol\";\nimport {IJBToken} from \"./IJBToken.sol\";\nimport {IJBTokens} from \"./IJBTokens.sol\";\n\ninterface IJBController is IERC165, IJBProjectUriRegistry, IJBDirectoryAccessControl {\n event LaunchProject(uint256 rulesetId, uint256 projectId, string metadata, string memo, address caller);\n\n event LaunchRulesets(uint256 rulesetId, uint256 projectId, string memo, address caller);\n\n event QueueRulesets(uint256 rulesetId, uint256 projectId, string memo, address caller);\n\n event SendReservedTokensToSplits(\n uint256 indexed rulesetId,\n uint256 indexed rulesetCycleNumber,\n uint256 indexed projectId,\n address beneficiary,\n uint256 tokenCount,\n uint256 beneficiaryTokenCount,\n address caller\n );\n\n event SendReservedTokensToSplit(\n uint256 indexed projectId,\n uint256 indexed rulesetId,\n uint256 indexed group,\n JBSplit split,\n uint256 tokenCount,\n address caller\n );\n\n event MintTokens(\n address indexed beneficiary,\n uint256 indexed projectId,\n uint256 tokenCount,\n uint256 beneficiaryTokenCount,\n string memo,\n uint256 reservedPercent,\n address caller\n );\n\n event BurnTokens(\n address indexed holder, uint256 indexed projectId, uint256 tokenCount, string memo, address caller\n );\n\n event ReservedDistributionReverted(\n uint256 indexed projectId, JBSplit split, uint256 amount, bytes reason, address caller\n );\n\n event PrepMigration(uint256 indexed projectId, address from, address caller);\n\n event SetMetadata(uint256 indexed projectId, string metadata, address caller);\n\n function PROJECTS() external view returns (IJBProjects);\n\n function DIRECTORY() external view returns (IJBDirectory);\n\n function RULESETS() external view returns (IJBRulesets);\n\n function TOKENS() external view returns (IJBTokens);\n\n function SPLITS() external view returns (IJBSplits);\n\n function FUND_ACCESS_LIMITS() external view returns (IJBFundAccessLimits);\n\n function PRICES() external view returns (IJBPrices);\n\n function pendingReservedTokenBalanceOf(uint256 projectId) external view returns (uint256);\n\n function totalTokenSupplyWithReservedTokensOf(uint256 projectId) external view returns (uint256);\n\n function getRulesetOf(\n uint256 projectId,\n uint256 rulesetId\n )\n external\n view\n returns (JBRuleset memory ruleset, JBRulesetMetadata memory metadata);\n\n function latestQueuedRulesetOf(uint256 projectId)\n external\n view\n returns (JBRuleset memory, JBRulesetMetadata memory metadata, JBApprovalStatus);\n\n function rulesetsOf(\n uint256 projectId,\n uint256 startingId,\n uint256 size\n )\n external\n view\n returns (JBRulesetWithMetadata[] memory rulesets);\n\n function currentRulesetOf(uint256 projectId)\n external\n view\n returns (JBRuleset memory ruleset, JBRulesetMetadata memory metadata);\n\n function upcomingRulesetOf(uint256 projectId)\n external\n view\n returns (JBRuleset memory ruleset, JBRulesetMetadata memory metadata);\n\n function launchProjectFor(\n address owner,\n string calldata projectUri,\n JBRulesetConfig[] calldata rulesetConfigurations,\n JBTerminalConfig[] memory terminalConfigurations,\n string calldata memo\n )\n external\n returns (uint256 projectId);\n\n function launchRulesetsFor(\n uint256 projectId,\n JBRulesetConfig[] calldata rulesetConfigurations,\n JBTerminalConfig[] memory terminalConfigurations,\n string calldata memo\n )\n external\n returns (uint256 rulesetId);\n\n function queueRulesetsOf(\n uint256 projectId,\n JBRulesetConfig[] calldata rulesetConfigurations,\n string calldata memo\n )\n external\n returns (uint256 rulesetId);\n\n function mintTokensOf(\n uint256 projectId,\n uint256 tokenCount,\n address beneficiary,\n string calldata memo,\n bool useReservedPercent\n )\n external\n returns (uint256 beneficiaryTokenCount);\n\n function executePayReservedTokenToTerminal(\n IJBTerminal terminal,\n uint256 projectId,\n IJBToken token,\n uint256 splitAmount,\n address beneficiary,\n bytes calldata metadata\n )\n external;\n\n function burnTokensOf(address holder, uint256 projectId, uint256 tokenCount, string calldata memo) external;\n\n function sendReservedTokensToSplitsOf(uint256 projectId) external returns (uint256);\n\n function setSplitGroupsOf(uint256 projectId, uint256 rulesetId, JBSplitGroup[] calldata splitGroups) external;\n\n function deployERC20For(\n uint256 projectId,\n string calldata name,\n string calldata symbol,\n bytes32 salt\n )\n external\n returns (IJBToken token);\n\n function setTokenFor(uint256 _projectId, IJBToken _token) external;\n\n function claimTokensFor(address holder, uint256 projectId, uint256 amount, address beneficiary) external;\n\n function transferCreditsFrom(address holder, uint256 projectId, address recipient, uint256 amount) external;\n\n function addPriceFeed(\n uint256 projectId,\n uint256 pricingCurrency,\n uint256 unitCurrency,\n IJBPriceFeed feed\n )\n external;\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBDirectory.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IERC165} from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\nimport {IJBProjects} from \"./IJBProjects.sol\";\nimport {IJBTerminal} from \"./IJBTerminal.sol\";\n\ninterface IJBDirectory {\n event SetController(uint256 indexed projectId, IERC165 indexed controller, address caller);\n\n event AddTerminal(uint256 indexed projectId, IJBTerminal indexed terminal, address caller);\n\n event SetTerminals(uint256 indexed projectId, IJBTerminal[] terminals, address caller);\n\n event SetPrimaryTerminal(\n uint256 indexed projectId, address indexed token, IJBTerminal indexed terminal, address caller\n );\n\n event SetIsAllowedToSetFirstController(address indexed addr, bool indexed flag, address caller);\n\n function PROJECTS() external view returns (IJBProjects);\n\n function controllerOf(uint256 projectId) external view returns (IERC165);\n\n function isAllowedToSetFirstController(address account) external view returns (bool);\n\n function terminalsOf(uint256 projectId) external view returns (IJBTerminal[] memory);\n\n function isTerminalOf(uint256 projectId, IJBTerminal terminal) external view returns (bool);\n\n function primaryTerminalOf(uint256 projectId, address token) external view returns (IJBTerminal);\n\n function setControllerOf(uint256 projectId, IERC165 controller) external;\n\n function setTerminalsOf(uint256 projectId, IJBTerminal[] calldata terminals) external;\n\n function setPrimaryTerminalOf(uint256 projectId, address token, IJBTerminal terminal) external;\n\n function setIsAllowedToSetFirstController(address account, bool flag) external;\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBDirectoryAccessControl.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IJBDirectoryAccessControl {\n function setTerminalsAllowed(uint256 projectId) external view returns (bool);\n function setControllerAllowed(uint256 projectId) external view returns (bool);\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBFeeTerminal.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {JBFee} from \"../structs/JBFee.sol\";\nimport {IJBFeelessAddresses} from \"./IJBFeelessAddresses.sol\";\nimport {IJBTerminal} from \"./IJBTerminal.sol\";\n\n/// @notice A terminal that can process and hold fees.\ninterface IJBFeeTerminal is IJBTerminal {\n event HoldFee(\n uint256 indexed projectId,\n address indexed token,\n uint256 indexed amount,\n uint256 fee,\n address beneficiary,\n address caller\n );\n\n event ProcessFee(\n uint256 indexed projectId,\n address indexed token,\n uint256 indexed amount,\n bool wasHeld,\n address beneficiary,\n address caller\n );\n\n event ReturnHeldFees(\n uint256 indexed projectId,\n address indexed token,\n uint256 indexed amount,\n uint256 returnedFees,\n uint256 leftoverAmount,\n address caller\n );\n\n event FeeReverted(\n uint256 indexed projectId,\n address indexed token,\n uint256 indexed feeProjectId,\n uint256 amount,\n bytes reason,\n address caller\n );\n\n function FEE() external view returns (uint256);\n\n function FEELESS_ADDRESSES() external view returns (IJBFeelessAddresses);\n\n function heldFeesOf(uint256 projectId, address token) external view returns (JBFee[] memory);\n\n function processHeldFeesOf(uint256 projectId, address token) external;\n\n function executeProcessFee(\n uint256 projectId,\n address token,\n uint256 amount,\n address beneficiary,\n IJBTerminal feeTerminal\n )\n external;\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBFeelessAddresses.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IJBFeelessAddresses {\n event SetFeelessAddress(address indexed account, bool indexed isFeeless, address caller);\n\n function isFeeless(address account) external view returns (bool);\n\n function setFeelessAddress(address account, bool flag) external;\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBFundAccessLimits.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {JBCurrencyAmount} from \"./../structs/JBCurrencyAmount.sol\";\nimport {JBFundAccessLimitGroup} from \"./../structs/JBFundAccessLimitGroup.sol\";\n\ninterface IJBFundAccessLimits {\n event SetFundAccessLimits(\n uint256 indexed rulesetId, uint256 indexed projectId, JBFundAccessLimitGroup limits, address caller\n );\n\n function payoutLimitsOf(\n uint256 projectId,\n uint256 rulesetId,\n address terminal,\n address token\n )\n external\n view\n returns (JBCurrencyAmount[] memory payoutLimits);\n\n function payoutLimitOf(\n uint256 projectId,\n uint256 rulesetId,\n address terminal,\n address token,\n uint256 currency\n )\n external\n view\n returns (uint256 payoutLimit);\n\n function surplusAllowancesOf(\n uint256 projectId,\n uint256 rulesetId,\n address terminal,\n address token\n )\n external\n view\n returns (JBCurrencyAmount[] memory surplusAllowances);\n\n function surplusAllowanceOf(\n uint256 projectId,\n uint256 rulesetId,\n address terminal,\n address token,\n uint256 currency\n )\n external\n view\n returns (uint256 surplusAllowance);\n\n function setFundAccessLimitsFor(\n uint256 projectId,\n uint256 rulesetId,\n JBFundAccessLimitGroup[] memory fundAccessConstaints\n )\n external;\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBMultiTerminal.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IJBDirectory} from \"./IJBDirectory.sol\";\nimport {IJBFeeTerminal} from \"./IJBFeeTerminal.sol\";\nimport {IJBPayoutTerminal} from \"./IJBPayoutTerminal.sol\";\nimport {IJBPermitTerminal} from \"./IJBPermitTerminal.sol\";\nimport {IJBProjects} from \"./IJBProjects.sol\";\nimport {IJBRedeemTerminal} from \"./IJBRedeemTerminal.sol\";\nimport {IJBRulesets} from \"./IJBRulesets.sol\";\nimport {IJBSplits} from \"./IJBSplits.sol\";\nimport {IJBTerminal} from \"./IJBTerminal.sol\";\nimport {IJBTerminalStore} from \"./IJBTerminalStore.sol\";\n\ninterface IJBMultiTerminal is IJBTerminal, IJBFeeTerminal, IJBRedeemTerminal, IJBPayoutTerminal, IJBPermitTerminal {\n function STORE() external view returns (IJBTerminalStore);\n\n function PROJECTS() external view returns (IJBProjects);\n\n function DIRECTORY() external view returns (IJBDirectory);\n\n function SPLITS() external view returns (IJBSplits);\n\n function RULESETS() external view returns (IJBRulesets);\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBPayHook.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IERC165} from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\nimport {JBAfterPayRecordedContext} from \"./../structs/JBAfterPayRecordedContext.sol\";\n\n/// @notice Hook called after a terminal's `pay(...)` logic completes (if passed by the ruleset's data hook).\ninterface IJBPayHook is IERC165 {\n /// @notice This function is called by the terminal's `pay(...)` function after the payment has been recorded in the\n /// terminal store.\n /// @dev Critical business logic should be protected by appropriate access control.\n /// @param context The context passed in by the terminal, as a `JBAfterPayRecordedContext` struct.\n function afterPayRecordedWith(JBAfterPayRecordedContext calldata context) external payable;\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBPayoutTerminal.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {JBSplit} from \"../structs/JBSplit.sol\";\nimport {IJBSplits} from \"./IJBSplits.sol\";\nimport {IJBTerminal} from \"./IJBTerminal.sol\";\n\n/// @notice A terminal that can send payouts.\ninterface IJBPayoutTerminal is IJBTerminal {\n event SendPayouts(\n uint256 indexed rulesetId,\n uint256 indexed rulesetCycleNumber,\n uint256 indexed projectId,\n address beneficiary,\n uint256 amount,\n uint256 amountPaidOut,\n uint256 fee,\n uint256 beneficiaryDistributionAmount,\n address caller\n );\n\n event SendPayoutToSplit(\n uint256 indexed projectId,\n uint256 indexed rulesetId,\n uint256 indexed group,\n JBSplit split,\n uint256 amount,\n uint256 netAmount,\n address caller\n );\n\n event UseAllowance(\n uint256 indexed rulesetId,\n uint256 indexed rulesetCycleNumber,\n uint256 indexed projectId,\n address beneficiary,\n uint256 amount,\n uint256 amountPaidOut,\n uint256 netAmountPaidOut,\n string memo,\n address caller\n );\n\n event PayoutReverted(uint256 indexed projectId, JBSplit split, uint256 amount, bytes reason, address caller);\n\n /// @notice Only callable by itself, included for testing.\n function executePayout(\n JBSplit calldata split,\n uint256 projectId,\n address token,\n uint256 amount,\n address originalMessageSender\n )\n external\n returns (uint256 netPayoutAmount);\n\n function sendPayoutsOf(\n uint256 projectId,\n address token,\n uint256 amount,\n uint256 currency,\n uint256 minTokensPaidOut\n )\n external\n returns (uint256 netLeftoverPayoutAmount);\n\n function useAllowanceOf(\n uint256 projectId,\n address token,\n uint256 amount,\n uint256 currency,\n uint256 minTokensPaidOut,\n address payable beneficiary,\n string calldata memo\n )\n external\n returns (uint256 netAmountPaidOut);\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBPermissioned.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IJBPermissions} from \"./IJBPermissions.sol\";\n\ninterface IJBPermissioned {\n function PERMISSIONS() external view returns (IJBPermissions);\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBPermissions.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {JBPermissionsData} from \"./../structs/JBPermissionsData.sol\";\n\ninterface IJBPermissions {\n event OperatorPermissionsSet(\n address indexed operator,\n address indexed account,\n uint256 indexed projectId,\n uint8[] permissionIds,\n uint256 packed,\n address caller\n );\n\n function WILDCARD_PROJECT_ID() external view returns (uint256);\n\n function permissionsOf(address operator, address account, uint256 projectId) external view returns (uint256);\n\n function hasPermission(\n address operator,\n address account,\n uint256 projectId,\n uint256 permissionId,\n bool includeRoot,\n bool includeWildcardProjectId\n )\n external\n view\n returns (bool);\n\n function hasPermissions(\n address operator,\n address account,\n uint256 projectId,\n uint256[] calldata permissionIds,\n bool includeRoot,\n bool includeWildcardProjectId\n )\n external\n view\n returns (bool);\n\n function setPermissionsFor(address account, JBPermissionsData calldata permissionsData) external;\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBPermitTerminal.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IPermit2} from \"@uniswap/permit2/src/interfaces/IPermit2.sol\";\n\nimport {IJBTerminal} from \"./IJBTerminal.sol\";\n\ninterface IJBPermitTerminal is IJBTerminal {\n function PERMIT2() external returns (IPermit2);\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBPriceFeed.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IJBPriceFeed {\n function currentUnitPrice(uint256 targetDecimals) external view returns (uint256);\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBPrices.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IJBPriceFeed} from \"./IJBPriceFeed.sol\";\nimport {IJBProjects} from \"./IJBProjects.sol\";\n\ninterface IJBPrices {\n event AddPriceFeed(\n uint256 indexed projectId, uint256 indexed pricingCurrency, uint256 indexed unitCurrency, IJBPriceFeed feed\n );\n\n function DEFAULT_PROJECT_ID() external view returns (uint256);\n\n function PROJECTS() external view returns (IJBProjects);\n\n function priceFeedFor(\n uint256 projectId,\n uint256 pricingCurrency,\n uint256 unitCurrency\n )\n external\n view\n returns (IJBPriceFeed);\n\n function pricePerUnitOf(\n uint256 projectId,\n uint256 pricingCurrency,\n uint256 unitCurrency,\n uint256 decimals\n )\n external\n view\n returns (uint256);\n\n function addPriceFeedFor(\n uint256 projectId,\n uint256 pricingCurrency,\n uint256 unitCurrency,\n IJBPriceFeed feed\n )\n external;\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBProjectUriRegistry.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IJBProjectUriRegistry {\n function uriOf(uint256 projectId) external view returns (string memory);\n function setUriOf(uint256 projectId, string calldata metadata) external;\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBProjects.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IERC721} from \"@openzeppelin/contracts/token/ERC721/IERC721.sol\";\n\nimport {IJBTokenUriResolver} from \"./IJBTokenUriResolver.sol\";\n\ninterface IJBProjects is IERC721 {\n event Create(uint256 indexed projectId, address indexed owner, address caller);\n\n event SetTokenUriResolver(IJBTokenUriResolver indexed resolver, address caller);\n\n function count() external view returns (uint256);\n\n function tokenUriResolver() external view returns (IJBTokenUriResolver);\n\n function createFor(address owner) external returns (uint256 projectId);\n\n function setTokenUriResolver(IJBTokenUriResolver newResolver) external;\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBRedeemHook.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IERC165} from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\nimport {JBAfterRedeemRecordedContext} from \"./../structs/JBAfterRedeemRecordedContext.sol\";\n\n/// @notice Hook called after a terminal's `redeemTokensOf(...)` logic completes (if passed by the ruleset's data hook).\ninterface IJBRedeemHook is IERC165 {\n /// @notice This function is called by the terminal's `redeemTokensOf(...)` function after the redemption has been\n /// recorded in the terminal store.\n /// @dev Critical business logic should be protected by appropriate access control.\n /// @param context The context passed in by the terminal, as a `JBAfterRedeemRecordedContext` struct.\n function afterRedeemRecordedWith(JBAfterRedeemRecordedContext calldata context) external payable;\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBRedeemTerminal.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {JBAfterRedeemRecordedContext} from \"../structs/JBAfterRedeemRecordedContext.sol\";\nimport {IJBRedeemHook} from \"./IJBRedeemHook.sol\";\nimport {IJBTerminal} from \"./IJBTerminal.sol\";\n\n/// @notice A terminal that can be redeemed from.\ninterface IJBRedeemTerminal is IJBTerminal {\n event RedeemTokens(\n uint256 indexed rulesetId,\n uint256 indexed rulesetCycleNumber,\n uint256 indexed projectId,\n address holder,\n address beneficiary,\n uint256 tokenCount,\n uint256 redemptionRate,\n uint256 reclaimedAmount,\n bytes metadata,\n address caller\n );\n\n event HookAfterRecordRedeem(\n IJBRedeemHook indexed hook,\n JBAfterRedeemRecordedContext context,\n uint256 specificationAmount,\n uint256 fee,\n address caller\n );\n\n function redeemTokensOf(\n address holder,\n uint256 projectId,\n address tokenToReclaim,\n uint256 redeemCount,\n uint256 minTokensReclaimed,\n address payable beneficiary,\n bytes calldata metadata\n )\n external\n returns (uint256 reclaimAmount);\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBRulesetApprovalHook.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IERC165} from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\nimport {JBApprovalStatus} from \"./../enums/JBApprovalStatus.sol\";\n\n/// @notice `IJBRulesetApprovalHook`s are used to determine whether the next ruleset in the ruleset queue is approved or\n/// rejected.\n/// @dev Project rulesets are stored in a queue. Rulesets take effect after the previous ruleset in the queue ends, and\n/// only if they are approved by the previous ruleset's approval hook.\ninterface IJBRulesetApprovalHook is IERC165 {\n function DURATION() external view returns (uint256);\n\n function approvalStatusOf(\n uint256 projectId,\n uint256 rulesetId,\n uint256 start\n )\n external\n view\n returns (JBApprovalStatus);\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBRulesetDataHook.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IERC165} from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\nimport {JBBeforePayRecordedContext} from \"./../structs/JBBeforePayRecordedContext.sol\";\nimport {JBBeforeRedeemRecordedContext} from \"./../structs/JBBeforeRedeemRecordedContext.sol\";\nimport {JBPayHookSpecification} from \"./../structs/JBPayHookSpecification.sol\";\nimport {JBRedeemHookSpecification} from \"./../structs/JBRedeemHookSpecification.sol\";\n\n/// @notice Data hooks can extend a terminal's core pay/redeem functionality by overriding the weight or memo. They can\n/// also specify pay/redeem hooks for the terminal to fulfill, or allow addresses to mint a project's tokens on-demand.\n/// @dev If a project's ruleset has `useDataHookForPay` or `useDataHookForRedeem` enabled, its `dataHook` is called by\n/// the terminal upon payments/redemptions (respectively).\ninterface IJBRulesetDataHook is IERC165 {\n /// @notice A flag indicating whether an address has permission to mint a project's tokens on-demand.\n /// @dev A project's data hook can allow any address to mint its tokens.\n /// @param projectId The ID of the project whose token can be minted.\n /// @param addr The address to check the token minting permission of.\n /// @return flag A flag indicating whether the address has permission to mint the project's tokens on-demand.\n function hasMintPermissionFor(uint256 projectId, address addr) external view returns (bool flag);\n\n /// @notice The data calculated before a payment is recorded in the terminal store. This data is provided to the\n /// terminal's `pay(...)` transaction.\n /// @param context The context passed to this data hook by the `pay(...)` function as a `JBBeforePayRecordedContext`\n /// struct.\n /// @return weight The new `weight` to use, overriding the ruleset's `weight`.\n /// @return hookSpecifications The amount and data to send to pay hooks instead of adding to the terminal's balance.\n function beforePayRecordedWith(JBBeforePayRecordedContext calldata context)\n external\n view\n returns (uint256 weight, JBPayHookSpecification[] memory hookSpecifications);\n\n /// @notice The data calculated before a redemption is recorded in the terminal store. This data is provided to the\n /// terminal's `redeemTokensOf(...)` transaction.\n /// @param context The context passed to this data hook by the `redeemTokensOf(...)` function as a\n /// `JBBeforeRedeemRecordedContext` struct.\n /// @return redemptionRate The rate determining the amount that should be reclaimable for a given surplus and token\n /// supply.\n /// @return redeemCount The amount of tokens that should be considered redeemed.\n /// @return totalSupply The total amount of tokens that are considered to be existing.\n /// @return hookSpecifications The amount and data to send to redeem hooks instead of returning to the beneficiary.\n function beforeRedeemRecordedWith(JBBeforeRedeemRecordedContext calldata context)\n external\n view\n returns (\n uint256 redemptionRate,\n uint256 redeemCount,\n uint256 totalSupply,\n JBRedeemHookSpecification[] memory hookSpecifications\n );\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBRulesets.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {JBApprovalStatus} from \"./../enums/JBApprovalStatus.sol\";\nimport {JBRuleset} from \"./../structs/JBRuleset.sol\";\nimport {IJBRulesetApprovalHook} from \"./IJBRulesetApprovalHook.sol\";\n\ninterface IJBRulesets {\n event RulesetQueued(\n uint256 indexed rulesetId,\n uint256 indexed projectId,\n uint256 duration,\n uint256 weight,\n uint256 decayPercent,\n IJBRulesetApprovalHook hook,\n uint256 metadata,\n uint256 mustStartAtOrAfter,\n address caller\n );\n\n event RulesetInitialized(uint256 indexed rulesetId, uint256 indexed projectId, uint256 indexed basedOnId);\n\n function latestRulesetIdOf(uint256 projectId) external view returns (uint256);\n\n function getRulesetOf(uint256 projectId, uint256 rulesetId) external view returns (JBRuleset memory);\n\n function latestQueuedOf(uint256 projectId)\n external\n view\n returns (JBRuleset memory ruleset, JBApprovalStatus approvalStatus);\n\n function rulesetsOf(\n uint256 projectId,\n uint256 startingId,\n uint256 size\n )\n external\n view\n returns (JBRuleset[] memory rulesets);\n\n function upcomingOf(uint256 projectId) external view returns (JBRuleset memory ruleset);\n\n function currentOf(uint256 projectId) external view returns (JBRuleset memory ruleset);\n\n function currentApprovalStatusForLatestRulesetOf(uint256 projectId) external view returns (JBApprovalStatus);\n\n function queueFor(\n uint256 projectId,\n uint256 duration,\n uint256 weight,\n uint256 decayPercent,\n IJBRulesetApprovalHook approvalHook,\n uint256 metadata,\n uint256 mustStartAtOrAfter\n )\n external\n returns (JBRuleset memory ruleset);\n\n function updateRulesetWeightCache(uint256 projectId) external;\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBSplitHook.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IERC165} from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\nimport {JBSplitHookContext} from \"../structs/JBSplitHookContext.sol\";\n\n/// @title Split hook\n/// @notice Allows processing a single split with custom logic.\n/// @dev The split hook's address should be set as the `hook` in the relevant split.\ninterface IJBSplitHook is IERC165 {\n /// @notice If a split has a split hook, payment terminals and controllers call this function while processing the\n /// split.\n /// @dev Critical business logic should be protected by appropriate access control. The tokens and/or native tokens\n /// are optimistically transferred to the split hook when this function is called.\n /// @param context The context passed by the terminal/controller to the split hook as a `JBSplitHookContext` struct:\n function processSplitWith(JBSplitHookContext calldata context) external payable;\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBSplits.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {JBSplit} from \"./../structs/JBSplit.sol\";\nimport {JBSplitGroup} from \"./../structs/JBSplitGroup.sol\";\nimport {IJBProjects} from \"./IJBProjects.sol\";\n\ninterface IJBSplits {\n event SetSplit(\n uint256 indexed projectId, uint256 indexed rulesetId, uint256 indexed groupId, JBSplit split, address caller\n );\n\n function FALLBACK_RULESET_ID() external view returns (uint256);\n\n function splitsOf(uint256 projectId, uint256 rulesetId, uint256 groupId) external view returns (JBSplit[] memory);\n\n function setSplitGroupsOf(uint256 projectId, uint256 rulesetId, JBSplitGroup[] memory splitGroups) external;\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBTerminal.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IERC165} from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\nimport {JBAccountingContext} from \"../structs/JBAccountingContext.sol\";\nimport {JBAfterPayRecordedContext} from \"../structs/JBAfterPayRecordedContext.sol\";\nimport {IJBPayHook} from \"../interfaces/IJBPayHook.sol\";\n\n/// @notice A terminal that accepts payments and can be migrated.\ninterface IJBTerminal is IERC165 {\n event MigrateTerminal(\n uint256 indexed projectId, address indexed token, IJBTerminal indexed to, uint256 amount, address caller\n );\n\n event AddToBalance(\n uint256 indexed projectId, uint256 amount, uint256 unlockedFees, string memo, bytes metadata, address caller\n );\n\n event SetAccountingContext(uint256 indexed projectId, JBAccountingContext context, address caller);\n\n event Pay(\n uint256 indexed rulesetId,\n uint256 indexed rulesetCycleNumber,\n uint256 indexed projectId,\n address payer,\n address beneficiary,\n uint256 amount,\n uint256 beneficiaryTokenCount,\n string memo,\n bytes metadata,\n address caller\n );\n\n event HookAfterRecordPay(\n IJBPayHook indexed hook, JBAfterPayRecordedContext context, uint256 specificationAmount, address caller\n );\n\n function accountingContextForTokenOf(\n uint256 projectId,\n address token\n )\n external\n view\n returns (JBAccountingContext memory);\n\n function accountingContextsOf(uint256 projectId) external view returns (JBAccountingContext[] memory);\n\n function currentSurplusOf(uint256 projectId, uint256 decimals, uint256 currency) external view returns (uint256);\n\n function migrateBalanceOf(uint256 projectId, address token, IJBTerminal to) external returns (uint256 balance);\n\n function addAccountingContextsFor(uint256 projectId, JBAccountingContext[] calldata accountingContexts) external;\n\n function pay(\n uint256 projectId,\n address token,\n uint256 amount,\n address beneficiary,\n uint256 minReturnedTokens,\n string calldata memo,\n bytes calldata metadata\n )\n external\n payable\n returns (uint256 beneficiaryTokenCount);\n\n function addToBalanceOf(\n uint256 projectId,\n address token,\n uint256 amount,\n bool shouldReturnHeldFees,\n string calldata memo,\n bytes calldata metadata\n )\n external\n payable;\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBTerminalStore.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {JBAccountingContext} from \"./../structs/JBAccountingContext.sol\";\nimport {JBPayHookSpecification} from \"./../structs/JBPayHookSpecification.sol\";\nimport {JBRedeemHookSpecification} from \"./../structs/JBRedeemHookSpecification.sol\";\nimport {JBRuleset} from \"./../structs/JBRuleset.sol\";\nimport {JBTokenAmount} from \"./../structs/JBTokenAmount.sol\";\nimport {IJBDirectory} from \"./IJBDirectory.sol\";\nimport {IJBPrices} from \"./IJBPrices.sol\";\nimport {IJBRulesets} from \"./IJBRulesets.sol\";\n\ninterface IJBTerminalStore {\n function RULESETS() external view returns (IJBRulesets);\n\n function DIRECTORY() external view returns (IJBDirectory);\n\n function PRICES() external view returns (IJBPrices);\n\n function balanceOf(address terminal, uint256 projectId, address token) external view returns (uint256);\n\n function usedPayoutLimitOf(\n address terminal,\n uint256 projectId,\n address token,\n uint256 rulesetCycleNumber,\n uint256 currency\n )\n external\n view\n returns (uint256);\n\n function usedSurplusAllowanceOf(\n address terminal,\n uint256 projectId,\n address token,\n uint256 rulesetId,\n uint256 currency\n )\n external\n view\n returns (uint256);\n\n function currentSurplusOf(\n address terminal,\n uint256 projectId,\n JBAccountingContext[] calldata accountingContexts,\n uint256 decimals,\n uint256 currency\n )\n external\n view\n returns (uint256);\n\n function currentTotalSurplusOf(\n uint256 projectId,\n uint256 decimals,\n uint256 currency\n )\n external\n view\n returns (uint256);\n\n function currentReclaimableSurplusOf(\n address terminal,\n uint256 projectId,\n JBAccountingContext[] calldata accountingContexts,\n uint256 _decimals,\n uint256 _currency,\n uint256 tokenCount,\n bool useTotalSurplus\n )\n external\n view\n returns (uint256);\n\n function currentReclaimableSurplusOf(\n uint256 projectId,\n uint256 tokenCount,\n uint256 totalSupply,\n uint256 surplus\n )\n external\n view\n returns (uint256);\n\n function recordPaymentFrom(\n address payer,\n JBTokenAmount memory amount,\n uint256 projectId,\n address beneficiary,\n bytes calldata metadata\n )\n external\n returns (JBRuleset memory ruleset, uint256 tokenCount, JBPayHookSpecification[] memory hookSpecifications);\n\n function recordRedemptionFor(\n address holder,\n uint256 projectId,\n uint256 redeemCount,\n JBAccountingContext calldata accountingContext,\n JBAccountingContext[] calldata balanceAccountingContexts,\n bytes calldata metadata\n )\n external\n returns (\n JBRuleset memory ruleset,\n uint256 reclaimAmount,\n uint256 redemptionRate,\n JBRedeemHookSpecification[] memory hookSpecifications\n );\n\n function recordPayoutFor(\n uint256 projectId,\n JBAccountingContext calldata accountingContext,\n uint256 amount,\n uint256 currency\n )\n external\n returns (JBRuleset memory ruleset, uint256 amountPaidOut);\n\n function recordUsedAllowanceOf(\n uint256 projectId,\n JBAccountingContext calldata accountingContext,\n uint256 amount,\n uint256 currency\n )\n external\n returns (JBRuleset memory ruleset, uint256 withdrawnAmount);\n\n function recordAddedBalanceFor(uint256 projectId, address token, uint256 amount) external;\n\n function recordTerminalMigration(uint256 projectId, address token) external returns (uint256 balance);\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IJBToken {\n function decimals() external view returns (uint8);\n\n function totalSupply() external view returns (uint256);\n\n function balanceOf(address account) external view returns (uint256);\n\n function mint(address account, uint256 amount) external;\n\n function burn(address account, uint256 amount) external;\n\n function initialize(string memory name, string memory symbol, address owner) external;\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBTokenUriResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IJBTokenUriResolver {\n function getUri(uint256 projectId) external view returns (string memory tokenUri);\n}\n" + }, + "node_modules/@bananapus/core/src/interfaces/IJBTokens.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IJBToken} from \"./IJBToken.sol\";\n\ninterface IJBTokens {\n event DeployERC20(\n uint256 indexed projectId, IJBToken indexed token, string name, string symbol, bytes32 salt, address caller\n );\n\n event Mint(\n address indexed holder, uint256 indexed projectId, uint256 amount, bool tokensWereClaimed, address caller\n );\n\n event Burn(\n address indexed holder,\n uint256 indexed projectId,\n uint256 amount,\n uint256 initialCreditBalance,\n uint256 initialTokenBalance,\n address caller\n );\n\n event ClaimTokens(\n address indexed holder,\n uint256 indexed projectId,\n uint256 initialCreditBalance,\n uint256 amount,\n address beneficiary,\n address caller\n );\n\n event SetToken(uint256 indexed projectId, IJBToken indexed newToken, address caller);\n\n event TransferCredits(\n address indexed holder, uint256 indexed projectId, address indexed recipient, uint256 amount, address caller\n );\n\n function tokenOf(uint256 projectId) external view returns (IJBToken);\n\n function projectIdOf(IJBToken token) external view returns (uint256);\n\n function creditBalanceOf(address holder, uint256 projectId) external view returns (uint256);\n\n function totalCreditSupplyOf(uint256 projectId) external view returns (uint256);\n\n function totalSupplyOf(uint256 projectId) external view returns (uint256);\n\n function totalBalanceOf(address holder, uint256 projectId) external view returns (uint256 result);\n\n function deployERC20For(\n uint256 projectId,\n string calldata name,\n string calldata symbol,\n bytes32 salt\n )\n external\n returns (IJBToken token);\n\n function setTokenFor(uint256 projectId, IJBToken token) external;\n\n function burnFrom(address holder, uint256 projectId, uint256 amount) external;\n\n function mintFor(address holder, uint256 projectId, uint256 amount) external;\n\n function claimTokensFor(address holder, uint256 projectId, uint256 amount, address beneficiary) external;\n\n function transferCreditsFrom(address holder, uint256 projectId, address recipient, uint256 amount) external;\n}\n" + }, + "node_modules/@bananapus/core/src/libraries/JBConstants.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Global constants used across Juicebox contracts.\nlibrary JBConstants {\n /// @notice Each chain's native token address in Juicebox is represented by\n /// 0x000000000000000000000000000000000000EEEe.\n address public constant NATIVE_TOKEN = address(0x000000000000000000000000000000000000EEEe);\n uint16 public constant MAX_RESERVED_PERCENT = 10_000;\n uint16 public constant MAX_REDEMPTION_RATE = 10_000;\n uint32 public constant MAX_DECAY_PERCENT = 1_000_000_000;\n uint32 public constant SPLITS_TOTAL_PERCENT = 1_000_000_000;\n uint16 public constant MAX_FEE = 1000;\n}\n" + }, + "node_modules/@bananapus/core/src/libraries/JBMetadataResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.17;\n\n/**\n * @notice Library to parse and create metadata to store {id: data} entries.\n *\n * @dev Metadata are built as:\n * - 32B of reserved space for the protocol\n * - a lookup table `Id: offset`, defining the offset of the data for a given 4 bytes id.\n * The offset fits 1 bytes, the ID 4 bytes. This table is padded to 32B.\n * - the data for each id, padded to 32B each\n *\n * +-----------------------+ offset: 0\n * | 32B reserved |\n * +-----------------------+ offset: 1 = end of first 32B\n * | (ID1,offset1) |\n * | (ID2,offset2) |\n * | 0's padding |\n * +-----------------------+ offset: offset1 = 1 + number of words taken by the padded table\n * | id1 data1 |\n * | 0's padding |\n * +-----------------------+ offset: offset2 = offset1 + number of words taken by the data1\n * | id2 data2 |\n * | 0's padding |\n * +-----------------------+\n */\nlibrary JBMetadataResolver {\n error DATA_NOT_PADDED();\n error LENGTH_MISMATCH();\n error METADATA_TOO_LONG();\n error METADATA_TOO_SHORT();\n\n // The various sizes used in bytes.\n uint256 constant ID_SIZE = 4;\n uint256 constant ID_OFFSET_SIZE = 1;\n uint256 constant WORD_SIZE = 32;\n\n // The size that an ID takes in the lookup table (Identifier + Offset).\n uint256 constant TOTAL_ID_SIZE = 5; // ID_SIZE + ID_OFFSET_SIZE;\n\n // The amount of bytes to go forward to get to the offset of the next ID (aka. the end of the offset of the current\n // ID).\n uint256 constant NEXT_ID_OFFSET = 9; // TOTAL_ID_SIZE + ID_SIZE;\n\n // 1 word (32B) is reserved for the protocol .\n uint256 constant RESERVED_SIZE = 32; // 1 * WORD_SIZE;\n uint256 constant MIN_METADATA_LENGTH = 37; // RESERVED_SIZE + ID_SIZE + ID_OFFSET_SIZE;\n\n /**\n * @notice Parse the metadata to find the data for a specific ID\n *\n * @dev Returns false and an empty bytes if no data is found\n *\n * @param id The ID to find\n * @param metadata The metadata to parse\n *\n * @return found Whether the {id:data} was found\n * @return targetData The data for the ID (can be empty)\n */\n function getDataFor(bytes4 id, bytes memory metadata) internal pure returns (bool found, bytes memory targetData) {\n // Either no data or empty one with only one selector (32+4+1)\n if (metadata.length <= MIN_METADATA_LENGTH) return (false, \"\");\n\n // Get the first data offset - upcast to avoid overflow (same for other offset)\n uint256 firstOffset = uint8(metadata[RESERVED_SIZE + ID_SIZE]);\n\n // Parse the id's to find id, stop when next offset == 0 or current = first offset\n for (uint256 i = RESERVED_SIZE; metadata[i + ID_SIZE] != bytes1(0) && i < firstOffset * WORD_SIZE;) {\n uint256 currentOffset = uint256(uint8(metadata[i + ID_SIZE]));\n\n bytes4 parsedId;\n assembly {\n parsedId := mload(add(add(metadata, 0x20), i))\n }\n\n // _id found?\n if (parsedId == id) {\n // Are we at the end of the lookup table (either at the start of data's or next offset is 0/in the\n // padding)\n // If not, only return until from this offset to the begining of the next offset\n uint256 end = (i + NEXT_ID_OFFSET >= firstOffset * WORD_SIZE || metadata[i + NEXT_ID_OFFSET] == 0)\n ? metadata.length\n : uint256(uint8(metadata[i + NEXT_ID_OFFSET])) * WORD_SIZE;\n\n return (true, _sliceBytes(metadata, currentOffset * WORD_SIZE, end));\n }\n unchecked {\n i += TOTAL_ID_SIZE;\n }\n }\n }\n\n /**\n * @notice Add an {id: data} entry to an existing metadata. This is an append-only mechanism.\n *\n * @param originalMetadata The original metadata\n * @param idToAdd The id to add\n * @param dataToAdd The data to add\n *\n * @return newMetadata The new metadata with the entry added\n */\n function addToMetadata(\n bytes memory originalMetadata,\n bytes4 idToAdd,\n bytes memory dataToAdd\n )\n internal\n pure\n returns (bytes memory newMetadata)\n {\n // Empty original metadata and maybe something in the first 32 bytes: create new metadata\n if (originalMetadata.length <= RESERVED_SIZE) {\n return abi.encodePacked(bytes32(originalMetadata), bytes32(abi.encodePacked(idToAdd, uint8(2))), dataToAdd);\n }\n\n // There is something in the table offset, but not a valid entry - avoid overwriting\n if (originalMetadata.length < RESERVED_SIZE + ID_SIZE + 1) revert METADATA_TOO_SHORT();\n\n // Make sure the data is padded to 32 bytes.\n if (dataToAdd.length < 32) revert DATA_NOT_PADDED();\n\n // Get the first data offset - upcast to avoid overflow (same for other offset)...\n uint256 firstOffset = uint8(originalMetadata[RESERVED_SIZE + ID_SIZE]);\n\n // ...go back to the beginning of the previous word (ie the last word of the table, as it can be padded)\n uint256 lastWordOfTable = firstOffset - 1;\n\n // The last offset stored in the table and its index\n uint256 lastOffset;\n\n uint256 lastOffsetIndex;\n\n // The number of words taken by the last data stored\n uint256 numberOfWordslastData;\n\n // Iterate to find the last entry of the table, lastOffset - we start from the end as the first value\n // encountered\n // will be the last offset\n for (uint256 i = firstOffset * WORD_SIZE - 1; i > lastWordOfTable * WORD_SIZE - 1; i--) {\n // If the byte is not 0, this is the last offset we're looking for\n if (originalMetadata[i] != 0) {\n lastOffset = uint8(originalMetadata[i]);\n lastOffsetIndex = i;\n\n // No rounding as this should be padded to 32B\n numberOfWordslastData = (originalMetadata.length - lastOffset * WORD_SIZE) / WORD_SIZE;\n\n // Copy the reserved word and the table and remove the previous padding\n newMetadata = _sliceBytes(originalMetadata, 0, lastOffsetIndex + 1);\n\n // Check if the new entry is still fitting in this word\n if (i + TOTAL_ID_SIZE >= firstOffset * WORD_SIZE) {\n // Increment every offset by 1 (as the table now takes one more word)\n for (uint256 j = RESERVED_SIZE + ID_SIZE; j < lastOffsetIndex + 1; j += TOTAL_ID_SIZE) {\n newMetadata[j] = bytes1(uint8(originalMetadata[j]) + 1);\n }\n\n // Increment the last offset so the new offset will be properly set too\n lastOffset++;\n }\n\n break;\n }\n }\n\n // Add the new entry after the last entry of the table, the new offset is the last offset + the number of words\n // taken by the last data\n newMetadata = abi.encodePacked(newMetadata, idToAdd, bytes1(uint8(lastOffset + numberOfWordslastData)));\n\n // Pad as needed - inlined for gas saving\n uint256 paddedLength =\n newMetadata.length % WORD_SIZE == 0 ? newMetadata.length : (newMetadata.length / WORD_SIZE + 1) * WORD_SIZE;\n assembly {\n mstore(newMetadata, paddedLength)\n }\n\n // Add existing data at the end\n newMetadata = abi.encodePacked(\n newMetadata, _sliceBytes(originalMetadata, firstOffset * WORD_SIZE, originalMetadata.length)\n );\n\n // Pad as needed\n paddedLength =\n newMetadata.length % WORD_SIZE == 0 ? newMetadata.length : (newMetadata.length / WORD_SIZE + 1) * WORD_SIZE;\n assembly {\n mstore(newMetadata, paddedLength)\n }\n\n // Append new data at the end\n newMetadata = abi.encodePacked(newMetadata, dataToAdd);\n\n // Pad again again as needed\n paddedLength =\n newMetadata.length % WORD_SIZE == 0 ? newMetadata.length : (newMetadata.length / WORD_SIZE + 1) * WORD_SIZE;\n\n assembly {\n mstore(newMetadata, paddedLength)\n }\n }\n\n /**\n * @notice Create the metadata for a list of {id:data}\n *\n * @dev Intended for offchain use (gas heavy)\n *\n * @param _ids The list of ids\n * @param _datas The list of corresponding datas\n *\n * @return metadata The resulting metadata\n */\n function createMetadata(\n bytes4[] memory _ids,\n bytes[] memory _datas\n )\n internal\n pure\n returns (bytes memory metadata)\n {\n if (_ids.length != _datas.length) revert LENGTH_MISMATCH();\n\n // Add a first empty 32B for the protocol reserved word\n metadata = abi.encodePacked(bytes32(0));\n\n // First offset for the data is after the first reserved word...\n uint256 _offset = 1;\n\n // ... and after the id/offset lookup table, rounding up to 32 bytes words if not a multiple\n _offset += ((_ids.length * JBMetadataResolver.TOTAL_ID_SIZE) - 1) / JBMetadataResolver.WORD_SIZE + 1;\n\n // For each id, add it to the lookup table with the next free offset, then increment the offset by the data\n // length (rounded up)\n for (uint256 _i; _i < _ids.length; ++_i) {\n if (_datas[_i].length < 32 || _datas[_i].length % JBMetadataResolver.WORD_SIZE != 0) {\n revert DATA_NOT_PADDED();\n }\n\n metadata = abi.encodePacked(metadata, _ids[_i], bytes1(uint8(_offset)));\n _offset += _datas[_i].length / JBMetadataResolver.WORD_SIZE;\n\n // Overflowing a bytes1?\n if (_offset > 255) revert METADATA_TOO_LONG();\n }\n\n // Pad the table to a multiple of 32B\n uint256 _paddedLength = metadata.length % JBMetadataResolver.WORD_SIZE == 0\n ? metadata.length\n : (metadata.length / JBMetadataResolver.WORD_SIZE + 1) * JBMetadataResolver.WORD_SIZE;\n assembly {\n mstore(metadata, _paddedLength)\n }\n\n // Add each metadata to the array, each padded to 32 bytes\n for (uint256 _i; _i < _datas.length; _i++) {\n metadata = abi.encodePacked(metadata, _datas[_i]);\n _paddedLength = metadata.length % JBMetadataResolver.WORD_SIZE == 0\n ? metadata.length\n : (metadata.length / JBMetadataResolver.WORD_SIZE + 1) * JBMetadataResolver.WORD_SIZE;\n\n assembly {\n mstore(metadata, _paddedLength)\n }\n }\n }\n\n /**\n * @notice Returns an unique id following a suggested format\n * (`xor(address(this), purpose name)` where purpose name is a string\n * giving context to the id (Permit2, quoteForSwap, etc)\n *\n * @param purpose A string describing the purpose associated with the id\n *\n * @return id The resulting id\n */\n function getId(string memory purpose) internal view returns (bytes4) {\n return getId(purpose, address(this));\n }\n\n /**\n * @notice Returns an unique id following a suggested format\n * (`xor(address(this), purpose name)` where purpose name is a string\n * giving context to the id (Permit2, quoteForSwap, etc)\n *\n * @param purpose A string describing the purpose associated with the id\n * @param target The target which will use the metadata\n *\n * @return id The resulting id\n */\n function getId(string memory purpose, address target) internal pure returns (bytes4) {\n return bytes4(bytes20(target) ^ bytes20(keccak256(bytes(purpose))));\n }\n\n /// @notice Slice bytes from a start index to an end index.\n /// @param data The bytes array to slice\n /// @param start The start index to slice at.\n /// @param end The end index to slice at.\n /// @param slicedBytes The sliced array.\n function _sliceBytes(\n bytes memory data,\n uint256 start,\n uint256 end\n )\n internal\n pure\n returns (bytes memory slicedBytes)\n {\n assembly {\n let length := sub(end, start)\n\n // Allocate memory at the freemem(add 0x20 to include the length)\n slicedBytes := mload(0x40)\n mstore(0x40, add(add(slicedBytes, length), 0x20))\n\n // Store the length (first element)\n mstore(slicedBytes, length)\n\n // compute the actual data first offset only once\n let startBytes := add(add(data, 0x20), start)\n\n // same for the out array\n let sliceBytesStartOfData := add(slicedBytes, 0x20)\n\n // store dem data\n for { let i := 0 } lt(i, end) { i := add(i, 0x20) } {\n mstore(add(sliceBytesStartOfData, i), mload(add(startBytes, i)))\n }\n }\n }\n}\n" + }, + "node_modules/@bananapus/core/src/structs/JBAccountingContext.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @custom:member token The address of the token that accounting is being done with.\n/// @custom:member decimals The number of decimals expected in that token's fixed point accounting.\n/// @custom:member currency The currency that the token is priced in terms of. By convention, this is\n/// `uint32(uint160(tokenAddress))` for tokens, or a constant ID from e.g. `JBCurrencyIds` for other currencies.\nstruct JBAccountingContext {\n address token;\n uint8 decimals;\n uint32 currency;\n}\n" + }, + "node_modules/@bananapus/core/src/structs/JBAfterPayRecordedContext.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {JBTokenAmount} from \"./JBTokenAmount.sol\";\n\n/// @custom:member payer The address the payment originated from.\n/// @custom:member projectId The ID of the project being paid.\n/// @custom:member rulesetId The ID of the ruleset the payment is being made during.\n/// @custom:member amount The payment's token amount. Includes the token being paid, the value, the number of decimals\n/// included, and the currency of the amount.\n/// @custom:member forwardedAmount The token amount being forwarded to the pay hook. Includes the token\n/// being paid, the value, the number of decimals included, and the currency of the amount.\n/// @custom:member weight The current ruleset's weight (used to determine how many tokens should be minted).\n/// @custom:member projectTokenCount The number of project tokens minted for the beneficiary.\n/// @custom:member beneficiary The address which receives any tokens this payment yields.\n/// @custom:member hookMetadata Extra data specified by the data hook, which is sent to the pay hook.\n/// @custom:member payerMetadata Extra data specified by the payer, which is sent to the pay hook.\nstruct JBAfterPayRecordedContext {\n address payer;\n uint256 projectId;\n uint256 rulesetId;\n JBTokenAmount amount;\n JBTokenAmount forwardedAmount;\n uint256 weight;\n uint256 projectTokenCount;\n address beneficiary;\n bytes hookMetadata;\n bytes payerMetadata;\n}\n" + }, + "node_modules/@bananapus/core/src/structs/JBAfterRedeemRecordedContext.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {JBTokenAmount} from \"./JBTokenAmount.sol\";\n\n/// @custom:member holder The holder of the tokens being redeemed.\n/// @custom:member projectId The ID of the project being redeemed from.\n/// @custom:member rulesetId The ID of the ruleset the redemption is being made during.\n/// @custom:member redeemCount The number of project tokens being redeemed.\n/// @custom:member redemptionRate The current ruleset's redemption rate.\n/// @custom:member reclaimedAmount The token amount being reclaimed from the project's terminal balance. Includes the\n/// token being\n/// reclaimed, the value, the number of decimals included, and the currency of the amount.\n/// @custom:member forwardedAmount The token amount being forwarded to the redeem hook. Includes the token\n/// being forwarded, the value, the number of decimals included, and the currency of the amount.\n/// @custom:member beneficiary The address the reclaimed amount will be sent to.\n/// @custom:member hookMetadata Extra data specified by the data hook, which is sent to the redeem hook.\n/// @custom:member redeemerMetadata Extra data specified by the redeemer, which is sent to the redeem hook.\nstruct JBAfterRedeemRecordedContext {\n address holder;\n uint256 projectId;\n uint256 rulesetId;\n uint256 redeemCount;\n JBTokenAmount reclaimedAmount;\n JBTokenAmount forwardedAmount;\n uint256 redemptionRate;\n address payable beneficiary;\n bytes hookMetadata;\n bytes redeemerMetadata;\n}\n" + }, + "node_modules/@bananapus/core/src/structs/JBBeforePayRecordedContext.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {JBTokenAmount} from \"./JBTokenAmount.sol\";\n\n/// @notice Context sent from the terminal to the ruleset's data hook upon payment.\n/// @custom:member terminal The terminal that is facilitating the payment.\n/// @custom:member payer The address that the payment originated from.\n/// @custom:member amount The payment's token amount, including the token being paid, the value, the number of decimals\n/// included, and the currency of the amount.\n/// @custom:member projectId The ID of the project being paid.\n/// @custom:member rulesetId The ID of the ruleset the payment is being made during.\n/// @custom:member beneficiary The specified address that should be the beneficiary of anything that this payment\n/// yields.\n/// @custom:member weight The weight of the ruleset during which the payment is being made.\n/// @custom:member reservedPercent The reserved percent of the ruleset the payment is being made during.\n/// @custom:member metadata Extra data specified by the payer.\nstruct JBBeforePayRecordedContext {\n address terminal;\n address payer;\n JBTokenAmount amount;\n uint256 projectId;\n uint256 rulesetId;\n address beneficiary;\n uint256 weight;\n uint256 reservedPercent;\n bytes metadata;\n}\n" + }, + "node_modules/@bananapus/core/src/structs/JBBeforeRedeemRecordedContext.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {JBTokenAmount} from \"./JBTokenAmount.sol\";\n\n/// @notice Context sent from the terminal to the ruleset's data hook upon redemption.\n/// @custom:member terminal The terminal that is facilitating the redemption.\n/// @custom:member holder The holder of the tokens being redeemed.\n/// @custom:member projectId The ID of the project whose tokens are being redeemed.\n/// @custom:member rulesetId The ID of the ruleset the redemption is being made during.\n/// @custom:member redeemCount The number of tokens being redeemed, as a fixed point number with 18 decimals.\n/// @custom:member totalSupply The total token supply being used for the calculation, as a fixed point number with 18\n/// decimals.\n/// @custom:member surplus The surplus amount used for the calculation, as a fixed point number with 18 decimals.\n/// Includes the token of the surplus, the surplus value, the number of decimals\n/// included, and the currency of the surplus.\n/// @custom:member useTotalSurplus If surplus across all of a project's terminals is being used when making redemptions.\n/// @custom:member redemptionRate The redemption rate of the ruleset the redemption is being made during.\n/// @custom:member metadata Extra data provided by the redeemer.\nstruct JBBeforeRedeemRecordedContext {\n address terminal;\n address holder;\n uint256 projectId;\n uint256 rulesetId;\n uint256 redeemCount;\n uint256 totalSupply;\n JBTokenAmount surplus;\n bool useTotalSurplus;\n uint256 redemptionRate;\n bytes metadata;\n}\n" + }, + "node_modules/@bananapus/core/src/structs/JBCurrencyAmount.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @custom:member amount The amount of the currency.\n/// @custom:member currency The currency. By convention, this is `uint32(uint160(tokenAddress))` for tokens, or a\n/// constant ID from e.g. `JBCurrencyIds` for other currencies.\nstruct JBCurrencyAmount {\n uint224 amount;\n uint32 currency;\n}\n" + }, + "node_modules/@bananapus/core/src/structs/JBFee.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @custom:member amount The total amount the fee was taken from, as a fixed point number with the same number of\n/// decimals as the terminal in which this struct was created.\n/// @custom:member beneficiary The address that will receive the tokens that are minted as a result of the fee payment.\n/// @custom:member unlockTimestamp The timestamp at which the fee is unlocked and can be processed.\nstruct JBFee {\n uint256 amount;\n address beneficiary;\n uint48 unlockTimestamp;\n}\n" + }, + "node_modules/@bananapus/core/src/structs/JBFundAccessLimitGroup.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {JBCurrencyAmount} from \"./JBCurrencyAmount.sol\";\n\n/// @dev Payout limit example: if the `amount` is 5, the `currency` is 1 (USD), and the terminal's token is ETH, then\n/// the project can pay out 5 USD worth of ETH during a ruleset.\n/// @dev Surplus allowance example: if the `amount` is 5, the `currency` is 1 (USD), and the terminal's token is ETH,\n/// then the project can pay out 5 USD worth of ETH from its surplus during a ruleset. A project's surplus is its\n/// balance minus its current combined payout limit.\n/// @dev If a project has multiple payout limits or surplus allowances, they are all available. They can all be used\n/// during a single ruleset.\n/// @dev The payout limits' and surplus allowances' fixed point amounts have the same number of decimals as the\n/// terminal.\n/// @custom:member terminal The terminal that the payout limits and surplus allowances apply to.\n/// @custom:member token The token that the payout limits and surplus allowances apply to within the `terminal`.\n/// @custom:member payoutLimits An array of payout limits. The payout limits cumulatively dictate the maximum value of\n/// `token`s a project can pay out from its balance in a terminal during a ruleset. Each payout limit can have a unique\n/// currency and amount.\n/// @custom:member surplusAllowances An array of surplus allowances. The surplus allowances cumulatively dictates the\n/// maximum value of `token`s a project can pay out from its surplus (balance less payouts) in a terminal during a\n/// ruleset. Each surplus allowance can have a unique currency and amount.\nstruct JBFundAccessLimitGroup {\n address terminal;\n address token;\n JBCurrencyAmount[] payoutLimits;\n JBCurrencyAmount[] surplusAllowances;\n}\n" + }, + "node_modules/@bananapus/core/src/structs/JBPayHookSpecification.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IJBPayHook} from \"../interfaces/IJBPayHook.sol\";\n\n/// @notice A pay hook specification sent from the ruleset's data hook back to the terminal. This specification is\n/// fulfilled by the terminal.\n/// @custom:member hook The pay hook to use when fulfilling this specification.\n/// @custom:member amount The amount to send to the hook.\n/// @custom:member metadata Metadata to pass the hook.\nstruct JBPayHookSpecification {\n IJBPayHook hook;\n uint256 amount;\n bytes metadata;\n}\n" + }, + "node_modules/@bananapus/core/src/structs/JBPermissionsData.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @custom:member operator The address that permissions are being given to.\n/// @custom:member projectId The ID of the project the operator is being given permissions for. Operators only have\n/// permissions under this project's scope. An ID of 0 is a wildcard, which gives an operator permissions across all\n/// projects.\n/// @custom:member permissionIds The IDs of the permissions being given. See the `JBPermissionIds` library.\nstruct JBPermissionsData {\n address operator;\n uint56 projectId;\n uint8[] permissionIds;\n}\n" + }, + "node_modules/@bananapus/core/src/structs/JBRedeemHookSpecification.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IJBRedeemHook} from \"../interfaces/IJBRedeemHook.sol\";\n\n/// @notice A redeem hook specification sent from the ruleset's data hook back to the terminal. This specification is\n/// fulfilled by the terminal.\n/// @custom:member hook The redeem hook to use when fulfilling this specification.\n/// @custom:member amount The amount to send to the hook.\n/// @custom:member metadata Metadata to pass to the hook.\nstruct JBRedeemHookSpecification {\n IJBRedeemHook hook;\n uint256 amount;\n bytes metadata;\n}\n" + }, + "node_modules/@bananapus/core/src/structs/JBRuleset.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IJBRulesetApprovalHook} from \"./../interfaces/IJBRulesetApprovalHook.sol\";\n\n/// @dev `JBRuleset` timestamps are unix timestamps (seconds since 00:00 January 1st, 1970 UTC).\n/// @custom:member cycleNumber The ruleset's cycle number. Each ruleset's `cycleNumber` is the previous ruleset's\n/// `cycleNumber` plus one. Each project's first ruleset has a `cycleNumber` of 1.\n/// @custom:member id The ruleset's ID, which is a timestamp of when this ruleset's rules were initialized. The\n/// `rulesetId` stays the same for rulesets that automatically cycle over from a manually queued ruleset.\n/// @custom:member basedOnId The `rulesetId` of the ruleset which was active when this ruleset was created.\n/// @custom:member start The timestamp from which this ruleset is considered active.\n/// @custom:member duration The number of seconds the ruleset lasts for. After this duration, a new ruleset will start.\n/// The project owner can queue new rulesets at any time, which will take effect once the current ruleset's duration is\n/// over. If the `duration` is 0, newly queued rulesets will take effect immediately. If a ruleset ends and there are no\n/// new rulesets queued, the current ruleset cycles over to another one with the same properties but a new `start`\n/// timestamp and a `weight` reduced by the ruleset's `decayPercent`.\n/// @custom:member weight A fixed point number with 18 decimals which is typically used by payment terminals to\n/// determine how many tokens should be minted when a payment is received. This can be used by other contracts for\n/// arbitrary calculations.\n/// @custom:member decayPercent The percentage by which to reduce the `weight` each time a new ruleset starts. `weight`\n/// is\n/// a percentage out of `JBConstants.MAX_DECAY_PERCENT`. If it's 0, the next ruleset will have the same `weight` by\n/// default. If it's 90%, the next ruleset's `weight` will be 10% smaller. If a ruleset explicitly sets a new `weight`,\n/// the `decayPercent` doesn't apply.\n/// @custom:member approvalHook An address of a contract that says whether a queued ruleset should be approved or\n/// rejected. If a\n/// ruleset is rejected, it won't go into effect. An approval hook can be used to create rules which dictate how a\n/// project owner can change their ruleset over time.\n/// @custom:member metadata Extra data associated with a ruleset which can be used by other contracts.\nstruct JBRuleset {\n uint48 cycleNumber;\n uint48 id;\n uint48 basedOnId;\n uint48 start;\n uint32 duration;\n uint112 weight;\n uint32 decayPercent;\n IJBRulesetApprovalHook approvalHook;\n uint256 metadata;\n}\n" + }, + "node_modules/@bananapus/core/src/structs/JBRulesetConfig.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IJBRulesetApprovalHook} from \"../interfaces/IJBRulesetApprovalHook.sol\";\nimport {JBFundAccessLimitGroup} from \"./JBFundAccessLimitGroup.sol\";\nimport {JBRulesetMetadata} from \"./JBRulesetMetadata.sol\";\nimport {JBSplitGroup} from \"./JBSplitGroup.sol\";\n\n/// @custom:member mustStartAtOrAfter The earliest time the ruleset can start.\n/// @custom:member duration The number of seconds the ruleset lasts for, after which a new ruleset will start. A\n/// duration of 0 means that the ruleset will stay active until the project owner explicitly issues a reconfiguration,\n/// at which point a new ruleset will immediately start with the updated properties. If the duration is greater than 0,\n/// a project owner cannot make changes to a ruleset's parameters while it is active – any proposed changes will apply\n/// to the subsequent ruleset. If no changes are proposed, a ruleset rolls over to another one with the same properties\n/// but new `start` timestamp and a decayed `weight`.\n/// @custom:member weight A fixed point number with 18 decimals that contracts can use to base arbitrary calculations\n/// on. For example, payment terminals can use this to determine how many tokens should be minted when a payment is\n/// received.\n/// @custom:member decayPercent A percent by how much the `weight` of the subsequent ruleset should be reduced, if the\n/// project owner hasn't queued the subsequent ruleset with an explicit `weight`. If it's 0, each ruleset will have\n/// equal weight. If the number is 90%, the next ruleset will have a 10% smaller weight. This weight is out of\n/// `JBConstants.MAX_DECAY_PERCENT`.\n/// @custom:member approvalHook An address of a contract that says whether a proposed ruleset should be accepted or\n/// rejected. It\n/// can be used to create rules around how a project owner can change ruleset parameters over time.\n/// @custom:member metadata Metadata specifying the controller-specific parameters that a ruleset can have. These\n/// properties cannot change until the next ruleset starts.\n/// @custom:member splitGroups An array of splits to use for any number of groups while the ruleset is active.\n/// @custom:member fundAccessLimitGroups An array of structs which dictate the amount of funds a project can access from\n/// its balance in each payment terminal while the ruleset is active. Amounts are fixed point numbers using the same\n/// number of decimals as the corresponding terminal. The `_payoutLimit` and `_surplusAllowance` parameters must fit in\n/// a `uint232`.\nstruct JBRulesetConfig {\n uint48 mustStartAtOrAfter;\n uint32 duration;\n uint112 weight;\n uint32 decayPercent;\n IJBRulesetApprovalHook approvalHook;\n JBRulesetMetadata metadata;\n JBSplitGroup[] splitGroups;\n JBFundAccessLimitGroup[] fundAccessLimitGroups;\n}\n" + }, + "node_modules/@bananapus/core/src/structs/JBRulesetMetadata.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @custom:member reservedPercent The reserved percent of the ruleset. This number is a percentage calculated out of\n/// `JBConstants.MAX_RESERVED_PERCENT`.\n/// @custom:member redemptionRate The redemption rate of the ruleset. This number is a percentage calculated out of\n/// `JBConstants.MAX_REDEMPTION_RATE`.\n/// @custom:member baseCurrency The currency on which to base the ruleset's weight. By convention, this is\n/// `uint32(uint160(tokenAddress))` for tokens, or a constant ID from e.g. `JBCurrencyIds` for other currencies.\n/// @custom:member pausePay A flag indicating if the pay functionality should be paused during the ruleset.\n/// @custom:member pauseCreditTransfers A flag indicating if the project token transfer functionality should be paused\n/// during the funding cycle.\n/// @custom:member allowOwnerMinting A flag indicating if the project owner or an operator with the `MINT_TOKENS`\n/// permission from the owner should be allowed to mint project tokens on demand during this ruleset.\n/// @custom:member allowTerminalMigration A flag indicating if migrating terminals should be allowed during this\n/// ruleset.\n/// @custom:member allowSetTerminals A flag indicating if a project's terminals can be added or removed.\n/// @custom:member allowSetController A flag indicating if a project's controller can be changed.\n/// @custom:member allowAddAccountingContext A flag indicating if a project can add new accounting contexts for its\n/// terminals to use.\n/// @custom:member allowAddPriceFeed A flag indicating if a project can add new price feeds to calculate exchange rates\n/// between its tokens.\n/// @custom:member ownerMustSendPayouts A flag indicating if privileged payout distribution should be\n/// enforced, otherwise payouts can be distributed by anyone.\n/// @custom:member holdFees A flag indicating if fees should be held during this ruleset.\n/// @custom:member useTotalSurplusForRedemptions A flag indicating if redemptions should use the project's balance held\n/// in all terminals instead of the project's local terminal balance from which the redemption is being fulfilled.\n/// @custom:member useDataHookForPay A flag indicating if the data hook should be used for pay transactions during this\n/// ruleset.\n/// @custom:member useDataHookForRedeem A flag indicating if the data hook should be used for redeem transactions during\n/// this ruleset.\n/// @custom:member dataHook The data hook to use during this ruleset.\n/// @custom:member metadata Metadata of the metadata, up to uint16 in size though only the first 14 bits can be used.\nstruct JBRulesetMetadata {\n uint16 reservedPercent;\n uint16 redemptionRate;\n uint32 baseCurrency;\n bool pausePay;\n bool pauseCreditTransfers;\n bool allowOwnerMinting;\n bool allowSetCustomToken;\n bool allowTerminalMigration;\n bool allowSetTerminals;\n bool allowSetController;\n bool allowAddAccountingContext;\n bool allowAddPriceFeed;\n bool ownerMustSendPayouts;\n bool holdFees;\n bool useTotalSurplusForRedemptions;\n bool useDataHookForPay;\n bool useDataHookForRedeem;\n address dataHook;\n uint16 metadata;\n}\n" + }, + "node_modules/@bananapus/core/src/structs/JBRulesetWithMetadata.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {JBRuleset} from \"./JBRuleset.sol\";\nimport {JBRulesetMetadata} from \"./JBRulesetMetadata.sol\";\n\n/// @custom:member ruleset The ruleset.\n/// @custom:member metadata The ruleset's metadata.\nstruct JBRulesetWithMetadata {\n JBRuleset ruleset;\n JBRulesetMetadata metadata;\n}\n" + }, + "node_modules/@bananapus/core/src/structs/JBSplit.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IJBSplitHook} from \"./../interfaces/IJBSplitHook.sol\";\n\n/// @notice Splits are used to send a percentage of a total token amount to a specific contract, project, or address.\n/// Splits are used to send payouts and reserved tokens.\n/// @dev 1. If a non-zero split hook contract is specified, this split's tokens are sent there along with this split's\n/// properties.\n/// @dev 2. Otherwise, if a non-zero project ID is specified, this split's tokens are used to `pay` it through its\n/// terminal if possible, or sent to the project's owner if not. If this payment yields tokens, those go to the split's\n/// `beneficiary`.\n/// @dev 3. Otherwise, this split's tokens are sent directly to the `beneficiary`.\n/// @dev To summarize, this split's tokens are sent according to the following priority: `split hook` > `projectId` >\n/// `beneficiary`.\n/// @custom:member preferAddToBalance If this split were to `pay` a project through its terminal, this flag indicates\n/// whether it should prefer using the terminal's `addToBalance` function instead.\n/// @custom:member percent The percent of the total token amount that this split sends. This number is out of\n/// `JBConstants.SPLITS_TOTAL_PERCENT`.\n/// @custom:member projectId The ID of a project to `pay`, if applicable. Resulting tokens will be routed to the\n/// `beneficiary`.\n/// @custom:member beneficiary Receives this split's tokens if the `hook` and `projectId` are zero. If the `projectId`\n/// is specified, the `beneficiary` receives any project tokens minted by this split.\n/// @custom:member lockedUntil The split cannot be changed until this timestamp. The `lockedUntil` timestamp can be\n/// increased while a split is locked. If `lockedUntil` is zero, this split can be changed at any time.\n/// @custom:member hook A contract which will receive this split's tokens and properties, and can define custom\n/// behavior.\nstruct JBSplit {\n bool preferAddToBalance;\n uint32 percent;\n uint56 projectId;\n address payable beneficiary;\n uint48 lockedUntil;\n IJBSplitHook hook;\n}\n" + }, + "node_modules/@bananapus/core/src/structs/JBSplitGroup.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {JBSplit} from \"./JBSplit.sol\";\n\n/// @custom:member groupId An identifier for the group. By convention, this ID is `uint256(uint160(tokenAddress))` for\n/// payouts and `1` for reserved tokens.\n/// @custom:member splits The splits in the group.\nstruct JBSplitGroup {\n uint256 groupId;\n JBSplit[] splits;\n}\n" + }, + "node_modules/@bananapus/core/src/structs/JBSplitHookContext.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {JBSplit} from \"./JBSplit.sol\";\n\n/// @custom:member token The token being sent to the split hook.\n/// @custom:member amount The amount being sent to the split hook, as a fixed point number.\n/// @custom:member decimals The number of decimals in the amount.\n/// @custom:member projectId The project the split belongs to.\n/// @custom:member groupId The group the split belongs to. By convention, this ID is `uint256(uint160(tokenAddress))`\n/// for payouts and `1` for reserved tokens.\n/// @custom:member split The split which specified the hook.\nstruct JBSplitHookContext {\n address token;\n uint256 amount;\n uint256 decimals;\n uint256 projectId;\n uint256 groupId;\n JBSplit split;\n}\n" + }, + "node_modules/@bananapus/core/src/structs/JBTerminalConfig.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IJBTerminal} from \"./../interfaces/IJBTerminal.sol\";\nimport {JBAccountingContext} from \"./JBAccountingContext.sol\";\n\n/// @custom:member terminal The terminal to configure.\n/// @custom:member accountingContextsToAccept The accounting contexts to accept from the terminal.\nstruct JBTerminalConfig {\n IJBTerminal terminal;\n JBAccountingContext[] accountingContextsToAccept;\n}\n" + }, + "node_modules/@bananapus/core/src/structs/JBTokenAmount.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @custom:member token The token the payment was made in.\n/// @custom:member decimals The number of decimals included in the value fixed point number.\n/// @custom:member currency The currency. By convention, this is `uint32(uint160(tokenAddress))` for tokens, or a\n/// constant ID from e.g. `JBCurrencyIds` for other currencies.\n/// @custom:member value The amount of tokens that was paid, as a fixed point number.\nstruct JBTokenAmount {\n address token;\n uint8 decimals;\n uint32 currency;\n uint256 value;\n}\n" + }, + "node_modules/@bananapus/permission-ids/src/JBPermissionIds.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @notice Permission IDs for `JBPermissions`, used throughout the Bananapus ecosystem. See\n/// [`JBPermissions`](https://github.com/Bananapus/nana-core/blob/main/src/JBPermissions.sol)\n/// @dev `JBPermissions` allows one address to grant another address permission to call functions in Juicebox contracts\n/// on their behalf. Each ID in `JBPermissionIds` grants access to a specific set of these functions.\nlibrary JBPermissionIds {\n uint8 internal constant ROOT = 1; // All permissions across every contract. Very dangerous. BE CAREFUL!\n\n /* Used by `nana-core`: https://github.com/Bananapus/nana-core */\n uint8 internal constant QUEUE_RULESETS = 2; // Permission to call `JBController.queueRulesetsOf` and\n // `JBController.launchRulesetsFor`.\n uint8 internal constant REDEEM_TOKENS = 3; // Permission to call `JBMultiTerminal.redeemTokensOf`.\n uint8 internal constant SEND_PAYOUTS = 4; // Permission to call `JBMultiTerminal.sendPayoutsOf`.\n uint8 internal constant MIGRATE_TERMINAL = 5; // Permission to call `JBMultiTerminal.migrateBalanceOf`.\n uint8 internal constant SET_PROJECT_URI = 6; // Permission to call `JBController.setUriOf`.\n uint8 internal constant DEPLOY_ERC20 = 7; // Permission to call `JBController.deployERC20For`.\n uint8 internal constant SET_TOKEN = 8; // Permission to call `JBController.setTokenFor`.\n uint8 internal constant MINT_TOKENS = 9; // Permission to call `JBController.mintTokensOf`.\n uint8 internal constant BURN_TOKENS = 10; // Permission to call `JBController.burnTokensOf`.\n uint8 internal constant CLAIM_TOKENS = 11; // Permission to call `JBController.claimTokensFor`.\n uint8 internal constant TRANSFER_CREDITS = 12; // Permission to call `JBController.transferCreditsFrom`.\n uint8 internal constant SET_CONTROLLER = 13; // Permission to call `JBDirectory.setControllerOf`.\n uint8 internal constant SET_TERMINALS = 14; // Permission to call `JBDirectory.setTerminalsOf`.\n // Be careful - `SET_TERMINALS` can be used to remove the primary terminal.\n uint8 internal constant SET_PRIMARY_TERMINAL = 15; // Permission to call `JBDirectory.setPrimaryTerminalOf`.\n uint8 internal constant USE_ALLOWANCE = 16; // Permission to call `JBMultiTerminal.useAllowanceOf`.\n uint8 internal constant SET_SPLIT_GROUPS = 17; // Permission to call `JBController.setSplitGroupsOf`.\n uint8 internal constant ADD_PRICE_FEED = 18; // Permission to call `JBPrices.addPriceFeedFor`.\n uint8 internal constant ADD_ACCOUNTING_CONTEXTS = 19; // Permission to call\n // `JBMultiTerminal.addAccountingContextsFor`.\n\n /* Used by `nana-721-hook`: https://github.com/Bananapus/nana-721-hook */\n uint8 internal constant ADJUST_721_TIERS = 20; // Permission to call `JB721TiersHook.adjustTiers`.\n uint8 internal constant SET_721_METADATA = 21; // Permission to call `JB721TiersHook.setMetadata`.\n uint8 internal constant MINT_721 = 22; // Permission to call `JB721TiersHook.mintFor`.\n\n /* Used by `nana-buyback-hook`: https://github.com/Bananapus/nana-buyback-hook */\n uint8 internal constant SET_BUYBACK_TWAP = 23; // Permission to call `JBBuybackHook.setTwapWindowOf` and\n // `JBBuybackHook.setTwapSlippageToleranceOf`.\n uint8 internal constant SET_BUYBACK_POOL = 24; // Permission to call `JBBuybackHook.setPoolFor`.\n\n /* Used by `nana-swap-terminal`: https://github.com/Bananapus/nana-swap-terminal */\n uint8 internal constant ADD_SWAP_TERMINAL_POOL = 25; // Permission to call `JBSwapTerminal.addDefaultPool`.\n uint8 internal constant ADD_SWAP_TERMINAL_TWAP_PARAMS = 26; // Permission to call\n // `JBSwapTerminal.addTwapParamsFor`.\n\n /* Used by `nana-suckers`: https://github.com/Bananapus/nana-suckers */\n uint8 internal constant MAP_SUCKER_TOKEN = 27; // Permission to call `BPSucker.mapToken`.\n uint8 internal constant DEPLOY_SUCKERS = 28; // Permission to call `BPSuckerRegistry.deploySuckersFor`.\n}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the value of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the value of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 value) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n * caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 value) external returns (bool);\n\n /**\n * @dev Moves a `value` amount of tokens from `from` to `to` using the\n * allowance mechanism. `value` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"../../utils/introspection/IERC165.sol\";\n\n/**\n * @dev Required interface of an ERC721 compliant contract.\n */\ninterface IERC721 is IERC165 {\n /**\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\n */\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\n */\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\n\n /**\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\n */\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\n\n /**\n * @dev Returns the number of tokens in ``owner``'s account.\n */\n function balanceOf(address owner) external view returns (uint256 balance);\n\n /**\n * @dev Returns the owner of the `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function ownerOf(uint256 tokenId) external view returns (address owner);\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\n * a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;\n\n /**\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must exist and be owned by `from`.\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or\n * {setApprovalForAll}.\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon\n * a safe transfer.\n *\n * Emits a {Transfer} event.\n */\n function safeTransferFrom(address from, address to, uint256 tokenId) external;\n\n /**\n * @dev Transfers `tokenId` token from `from` to `to`.\n *\n * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\n * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\n * understand this adds an external call which potentially creates a reentrancy vulnerability.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `tokenId` token must be owned by `from`.\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 tokenId) external;\n\n /**\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\n * The approval is cleared when the token is transferred.\n *\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\n *\n * Requirements:\n *\n * - The caller must own the token or be an approved operator.\n * - `tokenId` must exist.\n *\n * Emits an {Approval} event.\n */\n function approve(address to, uint256 tokenId) external;\n\n /**\n * @dev Approve or remove `operator` as an operator for the caller.\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\n *\n * Requirements:\n *\n * - The `operator` cannot be the address zero.\n *\n * Emits an {ApprovalForAll} event.\n */\n function setApprovalForAll(address operator, bool approved) external;\n\n /**\n * @dev Returns the account approved for `tokenId` token.\n *\n * Requirements:\n *\n * - `tokenId` must exist.\n */\n function getApproved(uint256 tokenId) external view returns (address operator);\n\n /**\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\n *\n * See {setApprovalForAll}\n */\n function isApprovedForAll(address owner, address operator) external view returns (bool);\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "node_modules/@prb/math/src/Common.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.19;\n\n// Common.sol\n//\n// Common mathematical functions used in both SD59x18 and UD60x18. Note that these global functions do not\n// always operate with SD59x18 and UD60x18 numbers.\n\n/*//////////////////////////////////////////////////////////////////////////\n CUSTOM ERRORS\n//////////////////////////////////////////////////////////////////////////*/\n\n/// @notice Thrown when the resultant value in {mulDiv} overflows uint256.\nerror PRBMath_MulDiv_Overflow(uint256 x, uint256 y, uint256 denominator);\n\n/// @notice Thrown when the resultant value in {mulDiv18} overflows uint256.\nerror PRBMath_MulDiv18_Overflow(uint256 x, uint256 y);\n\n/// @notice Thrown when one of the inputs passed to {mulDivSigned} is `type(int256).min`.\nerror PRBMath_MulDivSigned_InputTooSmall();\n\n/// @notice Thrown when the resultant value in {mulDivSigned} overflows int256.\nerror PRBMath_MulDivSigned_Overflow(int256 x, int256 y);\n\n/*//////////////////////////////////////////////////////////////////////////\n CONSTANTS\n//////////////////////////////////////////////////////////////////////////*/\n\n/// @dev The maximum value a uint128 number can have.\nuint128 constant MAX_UINT128 = type(uint128).max;\n\n/// @dev The maximum value a uint40 number can have.\nuint40 constant MAX_UINT40 = type(uint40).max;\n\n/// @dev The unit number, which the decimal precision of the fixed-point types.\nuint256 constant UNIT = 1e18;\n\n/// @dev The unit number inverted mod 2^256.\nuint256 constant UNIT_INVERSE = 78156646155174841979727994598816262306175212592076161876661_508869554232690281;\n\n/// @dev The the largest power of two that divides the decimal value of `UNIT`. The logarithm of this value is the least significant\n/// bit in the binary representation of `UNIT`.\nuint256 constant UNIT_LPOTD = 262144;\n\n/*//////////////////////////////////////////////////////////////////////////\n FUNCTIONS\n//////////////////////////////////////////////////////////////////////////*/\n\n/// @notice Calculates the binary exponent of x using the binary fraction method.\n/// @dev Has to use 192.64-bit fixed-point numbers. See https://ethereum.stackexchange.com/a/96594/24693.\n/// @param x The exponent as an unsigned 192.64-bit fixed-point number.\n/// @return result The result as an unsigned 60.18-decimal fixed-point number.\n/// @custom:smtchecker abstract-function-nondet\nfunction exp2(uint256 x) pure returns (uint256 result) {\n unchecked {\n // Start from 0.5 in the 192.64-bit fixed-point format.\n result = 0x800000000000000000000000000000000000000000000000;\n\n // The following logic multiplies the result by $\\sqrt{2^{-i}}$ when the bit at position i is 1. Key points:\n //\n // 1. Intermediate results will not overflow, as the starting point is 2^191 and all magic factors are under 2^65.\n // 2. The rationale for organizing the if statements into groups of 8 is gas savings. If the result of performing\n // a bitwise AND operation between x and any value in the array [0x80; 0x40; 0x20; 0x10; 0x08; 0x04; 0x02; 0x01] is 1,\n // we know that `x & 0xFF` is also 1.\n if (x & 0xFF00000000000000 > 0) {\n if (x & 0x8000000000000000 > 0) {\n result = (result * 0x16A09E667F3BCC909) >> 64;\n }\n if (x & 0x4000000000000000 > 0) {\n result = (result * 0x1306FE0A31B7152DF) >> 64;\n }\n if (x & 0x2000000000000000 > 0) {\n result = (result * 0x1172B83C7D517ADCE) >> 64;\n }\n if (x & 0x1000000000000000 > 0) {\n result = (result * 0x10B5586CF9890F62A) >> 64;\n }\n if (x & 0x800000000000000 > 0) {\n result = (result * 0x1059B0D31585743AE) >> 64;\n }\n if (x & 0x400000000000000 > 0) {\n result = (result * 0x102C9A3E778060EE7) >> 64;\n }\n if (x & 0x200000000000000 > 0) {\n result = (result * 0x10163DA9FB33356D8) >> 64;\n }\n if (x & 0x100000000000000 > 0) {\n result = (result * 0x100B1AFA5ABCBED61) >> 64;\n }\n }\n\n if (x & 0xFF000000000000 > 0) {\n if (x & 0x80000000000000 > 0) {\n result = (result * 0x10058C86DA1C09EA2) >> 64;\n }\n if (x & 0x40000000000000 > 0) {\n result = (result * 0x1002C605E2E8CEC50) >> 64;\n }\n if (x & 0x20000000000000 > 0) {\n result = (result * 0x100162F3904051FA1) >> 64;\n }\n if (x & 0x10000000000000 > 0) {\n result = (result * 0x1000B175EFFDC76BA) >> 64;\n }\n if (x & 0x8000000000000 > 0) {\n result = (result * 0x100058BA01FB9F96D) >> 64;\n }\n if (x & 0x4000000000000 > 0) {\n result = (result * 0x10002C5CC37DA9492) >> 64;\n }\n if (x & 0x2000000000000 > 0) {\n result = (result * 0x1000162E525EE0547) >> 64;\n }\n if (x & 0x1000000000000 > 0) {\n result = (result * 0x10000B17255775C04) >> 64;\n }\n }\n\n if (x & 0xFF0000000000 > 0) {\n if (x & 0x800000000000 > 0) {\n result = (result * 0x1000058B91B5BC9AE) >> 64;\n }\n if (x & 0x400000000000 > 0) {\n result = (result * 0x100002C5C89D5EC6D) >> 64;\n }\n if (x & 0x200000000000 > 0) {\n result = (result * 0x10000162E43F4F831) >> 64;\n }\n if (x & 0x100000000000 > 0) {\n result = (result * 0x100000B1721BCFC9A) >> 64;\n }\n if (x & 0x80000000000 > 0) {\n result = (result * 0x10000058B90CF1E6E) >> 64;\n }\n if (x & 0x40000000000 > 0) {\n result = (result * 0x1000002C5C863B73F) >> 64;\n }\n if (x & 0x20000000000 > 0) {\n result = (result * 0x100000162E430E5A2) >> 64;\n }\n if (x & 0x10000000000 > 0) {\n result = (result * 0x1000000B172183551) >> 64;\n }\n }\n\n if (x & 0xFF00000000 > 0) {\n if (x & 0x8000000000 > 0) {\n result = (result * 0x100000058B90C0B49) >> 64;\n }\n if (x & 0x4000000000 > 0) {\n result = (result * 0x10000002C5C8601CC) >> 64;\n }\n if (x & 0x2000000000 > 0) {\n result = (result * 0x1000000162E42FFF0) >> 64;\n }\n if (x & 0x1000000000 > 0) {\n result = (result * 0x10000000B17217FBB) >> 64;\n }\n if (x & 0x800000000 > 0) {\n result = (result * 0x1000000058B90BFCE) >> 64;\n }\n if (x & 0x400000000 > 0) {\n result = (result * 0x100000002C5C85FE3) >> 64;\n }\n if (x & 0x200000000 > 0) {\n result = (result * 0x10000000162E42FF1) >> 64;\n }\n if (x & 0x100000000 > 0) {\n result = (result * 0x100000000B17217F8) >> 64;\n }\n }\n\n if (x & 0xFF000000 > 0) {\n if (x & 0x80000000 > 0) {\n result = (result * 0x10000000058B90BFC) >> 64;\n }\n if (x & 0x40000000 > 0) {\n result = (result * 0x1000000002C5C85FE) >> 64;\n }\n if (x & 0x20000000 > 0) {\n result = (result * 0x100000000162E42FF) >> 64;\n }\n if (x & 0x10000000 > 0) {\n result = (result * 0x1000000000B17217F) >> 64;\n }\n if (x & 0x8000000 > 0) {\n result = (result * 0x100000000058B90C0) >> 64;\n }\n if (x & 0x4000000 > 0) {\n result = (result * 0x10000000002C5C860) >> 64;\n }\n if (x & 0x2000000 > 0) {\n result = (result * 0x1000000000162E430) >> 64;\n }\n if (x & 0x1000000 > 0) {\n result = (result * 0x10000000000B17218) >> 64;\n }\n }\n\n if (x & 0xFF0000 > 0) {\n if (x & 0x800000 > 0) {\n result = (result * 0x1000000000058B90C) >> 64;\n }\n if (x & 0x400000 > 0) {\n result = (result * 0x100000000002C5C86) >> 64;\n }\n if (x & 0x200000 > 0) {\n result = (result * 0x10000000000162E43) >> 64;\n }\n if (x & 0x100000 > 0) {\n result = (result * 0x100000000000B1721) >> 64;\n }\n if (x & 0x80000 > 0) {\n result = (result * 0x10000000000058B91) >> 64;\n }\n if (x & 0x40000 > 0) {\n result = (result * 0x1000000000002C5C8) >> 64;\n }\n if (x & 0x20000 > 0) {\n result = (result * 0x100000000000162E4) >> 64;\n }\n if (x & 0x10000 > 0) {\n result = (result * 0x1000000000000B172) >> 64;\n }\n }\n\n if (x & 0xFF00 > 0) {\n if (x & 0x8000 > 0) {\n result = (result * 0x100000000000058B9) >> 64;\n }\n if (x & 0x4000 > 0) {\n result = (result * 0x10000000000002C5D) >> 64;\n }\n if (x & 0x2000 > 0) {\n result = (result * 0x1000000000000162E) >> 64;\n }\n if (x & 0x1000 > 0) {\n result = (result * 0x10000000000000B17) >> 64;\n }\n if (x & 0x800 > 0) {\n result = (result * 0x1000000000000058C) >> 64;\n }\n if (x & 0x400 > 0) {\n result = (result * 0x100000000000002C6) >> 64;\n }\n if (x & 0x200 > 0) {\n result = (result * 0x10000000000000163) >> 64;\n }\n if (x & 0x100 > 0) {\n result = (result * 0x100000000000000B1) >> 64;\n }\n }\n\n if (x & 0xFF > 0) {\n if (x & 0x80 > 0) {\n result = (result * 0x10000000000000059) >> 64;\n }\n if (x & 0x40 > 0) {\n result = (result * 0x1000000000000002C) >> 64;\n }\n if (x & 0x20 > 0) {\n result = (result * 0x10000000000000016) >> 64;\n }\n if (x & 0x10 > 0) {\n result = (result * 0x1000000000000000B) >> 64;\n }\n if (x & 0x8 > 0) {\n result = (result * 0x10000000000000006) >> 64;\n }\n if (x & 0x4 > 0) {\n result = (result * 0x10000000000000003) >> 64;\n }\n if (x & 0x2 > 0) {\n result = (result * 0x10000000000000001) >> 64;\n }\n if (x & 0x1 > 0) {\n result = (result * 0x10000000000000001) >> 64;\n }\n }\n\n // In the code snippet below, two operations are executed simultaneously:\n //\n // 1. The result is multiplied by $(2^n + 1)$, where $2^n$ represents the integer part, and the additional 1\n // accounts for the initial guess of 0.5. This is achieved by subtracting from 191 instead of 192.\n // 2. The result is then converted to an unsigned 60.18-decimal fixed-point format.\n //\n // The underlying logic is based on the relationship $2^{191-ip} = 2^{ip} / 2^{191}$, where $ip$ denotes the,\n // integer part, $2^n$.\n result *= UNIT;\n result >>= (191 - (x >> 64));\n }\n}\n\n/// @notice Finds the zero-based index of the first 1 in the binary representation of x.\n///\n/// @dev See the note on \"msb\" in this Wikipedia article: https://en.wikipedia.org/wiki/Find_first_set\n///\n/// Each step in this implementation is equivalent to this high-level code:\n///\n/// ```solidity\n/// if (x >= 2 ** 128) {\n/// x >>= 128;\n/// result += 128;\n/// }\n/// ```\n///\n/// Where 128 is replaced with each respective power of two factor. See the full high-level implementation here:\n/// https://gist.github.com/PaulRBerg/f932f8693f2733e30c4d479e8e980948\n///\n/// The Yul instructions used below are:\n///\n/// - \"gt\" is \"greater than\"\n/// - \"or\" is the OR bitwise operator\n/// - \"shl\" is \"shift left\"\n/// - \"shr\" is \"shift right\"\n///\n/// @param x The uint256 number for which to find the index of the most significant bit.\n/// @return result The index of the most significant bit as a uint256.\n/// @custom:smtchecker abstract-function-nondet\nfunction msb(uint256 x) pure returns (uint256 result) {\n // 2^128\n assembly (\"memory-safe\") {\n let factor := shl(7, gt(x, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF))\n x := shr(factor, x)\n result := or(result, factor)\n }\n // 2^64\n assembly (\"memory-safe\") {\n let factor := shl(6, gt(x, 0xFFFFFFFFFFFFFFFF))\n x := shr(factor, x)\n result := or(result, factor)\n }\n // 2^32\n assembly (\"memory-safe\") {\n let factor := shl(5, gt(x, 0xFFFFFFFF))\n x := shr(factor, x)\n result := or(result, factor)\n }\n // 2^16\n assembly (\"memory-safe\") {\n let factor := shl(4, gt(x, 0xFFFF))\n x := shr(factor, x)\n result := or(result, factor)\n }\n // 2^8\n assembly (\"memory-safe\") {\n let factor := shl(3, gt(x, 0xFF))\n x := shr(factor, x)\n result := or(result, factor)\n }\n // 2^4\n assembly (\"memory-safe\") {\n let factor := shl(2, gt(x, 0xF))\n x := shr(factor, x)\n result := or(result, factor)\n }\n // 2^2\n assembly (\"memory-safe\") {\n let factor := shl(1, gt(x, 0x3))\n x := shr(factor, x)\n result := or(result, factor)\n }\n // 2^1\n // No need to shift x any more.\n assembly (\"memory-safe\") {\n let factor := gt(x, 0x1)\n result := or(result, factor)\n }\n}\n\n/// @notice Calculates x*y÷denominator with 512-bit precision.\n///\n/// @dev Credits to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv.\n///\n/// Notes:\n/// - The result is rounded toward zero.\n///\n/// Requirements:\n/// - The denominator must not be zero.\n/// - The result must fit in uint256.\n///\n/// @param x The multiplicand as a uint256.\n/// @param y The multiplier as a uint256.\n/// @param denominator The divisor as a uint256.\n/// @return result The result as a uint256.\n/// @custom:smtchecker abstract-function-nondet\nfunction mulDiv(uint256 x, uint256 y, uint256 denominator) pure returns (uint256 result) {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512-bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly (\"memory-safe\") {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n unchecked {\n return prod0 / denominator;\n }\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n if (prod1 >= denominator) {\n revert PRBMath_MulDiv_Overflow(x, y, denominator);\n }\n\n ////////////////////////////////////////////////////////////////////////////\n // 512 by 256 division\n ////////////////////////////////////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly (\"memory-safe\") {\n // Compute remainder using the mulmod Yul instruction.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512-bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n unchecked {\n // Calculate the largest power of two divisor of the denominator using the unary operator ~. This operation cannot overflow\n // because the denominator cannot be zero at this point in the function execution. The result is always >= 1.\n // For more detail, see https://cs.stackexchange.com/q/138556/92363.\n uint256 lpotdod = denominator & (~denominator + 1);\n uint256 flippedLpotdod;\n\n assembly (\"memory-safe\") {\n // Factor powers of two out of denominator.\n denominator := div(denominator, lpotdod)\n\n // Divide [prod1 prod0] by lpotdod.\n prod0 := div(prod0, lpotdod)\n\n // Get the flipped value `2^256 / lpotdod`. If the `lpotdod` is zero, the flipped value is one.\n // `sub(0, lpotdod)` produces the two's complement version of `lpotdod`, which is equivalent to flipping all the bits.\n // However, `div` interprets this value as an unsigned value: https://ethereum.stackexchange.com/q/147168/24693\n flippedLpotdod := add(div(sub(0, lpotdod), lpotdod), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * flippedLpotdod;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n }\n}\n\n/// @notice Calculates x*y÷1e18 with 512-bit precision.\n///\n/// @dev A variant of {mulDiv} with constant folding, i.e. in which the denominator is hard coded to 1e18.\n///\n/// Notes:\n/// - The body is purposely left uncommented; to understand how this works, see the documentation in {mulDiv}.\n/// - The result is rounded toward zero.\n/// - We take as an axiom that the result cannot be `MAX_UINT256` when x and y solve the following system of equations:\n///\n/// $$\n/// \\begin{cases}\n/// x * y = MAX\\_UINT256 * UNIT \\\\\n/// (x * y) \\% UNIT \\geq \\frac{UNIT}{2}\n/// \\end{cases}\n/// $$\n///\n/// Requirements:\n/// - Refer to the requirements in {mulDiv}.\n/// - The result must fit in uint256.\n///\n/// @param x The multiplicand as an unsigned 60.18-decimal fixed-point number.\n/// @param y The multiplier as an unsigned 60.18-decimal fixed-point number.\n/// @return result The result as an unsigned 60.18-decimal fixed-point number.\n/// @custom:smtchecker abstract-function-nondet\nfunction mulDiv18(uint256 x, uint256 y) pure returns (uint256 result) {\n uint256 prod0;\n uint256 prod1;\n assembly (\"memory-safe\") {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n if (prod1 == 0) {\n unchecked {\n return prod0 / UNIT;\n }\n }\n\n if (prod1 >= UNIT) {\n revert PRBMath_MulDiv18_Overflow(x, y);\n }\n\n uint256 remainder;\n assembly (\"memory-safe\") {\n remainder := mulmod(x, y, UNIT)\n result :=\n mul(\n or(\n div(sub(prod0, remainder), UNIT_LPOTD),\n mul(sub(prod1, gt(remainder, prod0)), add(div(sub(0, UNIT_LPOTD), UNIT_LPOTD), 1))\n ),\n UNIT_INVERSE\n )\n }\n}\n\n/// @notice Calculates x*y÷denominator with 512-bit precision.\n///\n/// @dev This is an extension of {mulDiv} for signed numbers, which works by computing the signs and the absolute values separately.\n///\n/// Notes:\n/// - The result is rounded toward zero.\n///\n/// Requirements:\n/// - Refer to the requirements in {mulDiv}.\n/// - None of the inputs can be `type(int256).min`.\n/// - The result must fit in int256.\n///\n/// @param x The multiplicand as an int256.\n/// @param y The multiplier as an int256.\n/// @param denominator The divisor as an int256.\n/// @return result The result as an int256.\n/// @custom:smtchecker abstract-function-nondet\nfunction mulDivSigned(int256 x, int256 y, int256 denominator) pure returns (int256 result) {\n if (x == type(int256).min || y == type(int256).min || denominator == type(int256).min) {\n revert PRBMath_MulDivSigned_InputTooSmall();\n }\n\n // Get hold of the absolute values of x, y and the denominator.\n uint256 xAbs;\n uint256 yAbs;\n uint256 dAbs;\n unchecked {\n xAbs = x < 0 ? uint256(-x) : uint256(x);\n yAbs = y < 0 ? uint256(-y) : uint256(y);\n dAbs = denominator < 0 ? uint256(-denominator) : uint256(denominator);\n }\n\n // Compute the absolute value of x*y÷denominator. The result must fit in int256.\n uint256 resultAbs = mulDiv(xAbs, yAbs, dAbs);\n if (resultAbs > uint256(type(int256).max)) {\n revert PRBMath_MulDivSigned_Overflow(x, y);\n }\n\n // Get the signs of x, y and the denominator.\n uint256 sx;\n uint256 sy;\n uint256 sd;\n assembly (\"memory-safe\") {\n // \"sgt\" is the \"signed greater than\" assembly instruction and \"sub(0,1)\" is -1 in two's complement.\n sx := sgt(x, sub(0, 1))\n sy := sgt(y, sub(0, 1))\n sd := sgt(denominator, sub(0, 1))\n }\n\n // XOR over sx, sy and sd. What this does is to check whether there are 1 or 3 negative signs in the inputs.\n // If there are, the result should be negative. Otherwise, it should be positive.\n unchecked {\n result = sx ^ sy ^ sd == 0 ? -int256(resultAbs) : int256(resultAbs);\n }\n}\n\n/// @notice Calculates the square root of x using the Babylonian method.\n///\n/// @dev See https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method.\n///\n/// Notes:\n/// - If x is not a perfect square, the result is rounded down.\n/// - Credits to OpenZeppelin for the explanations in comments below.\n///\n/// @param x The uint256 number for which to calculate the square root.\n/// @return result The result as a uint256.\n/// @custom:smtchecker abstract-function-nondet\nfunction sqrt(uint256 x) pure returns (uint256 result) {\n if (x == 0) {\n return 0;\n }\n\n // For our first guess, we calculate the biggest power of 2 which is smaller than the square root of x.\n //\n // We know that the \"msb\" (most significant bit) of x is a power of 2 such that we have:\n //\n // $$\n // msb(x) <= x <= 2*msb(x)$\n // $$\n //\n // We write $msb(x)$ as $2^k$, and we get:\n //\n // $$\n // k = log_2(x)\n // $$\n //\n // Thus, we can write the initial inequality as:\n //\n // $$\n // 2^{log_2(x)} <= x <= 2*2^{log_2(x)+1} \\\\\n // sqrt(2^k) <= sqrt(x) < sqrt(2^{k+1}) \\\\\n // 2^{k/2} <= sqrt(x) < 2^{(k+1)/2} <= 2^{(k/2)+1}\n // $$\n //\n // Consequently, $2^{log_2(x) /2} is a good first approximation of sqrt(x) with at least one correct bit.\n uint256 xAux = uint256(x);\n result = 1;\n if (xAux >= 2 ** 128) {\n xAux >>= 128;\n result <<= 64;\n }\n if (xAux >= 2 ** 64) {\n xAux >>= 64;\n result <<= 32;\n }\n if (xAux >= 2 ** 32) {\n xAux >>= 32;\n result <<= 16;\n }\n if (xAux >= 2 ** 16) {\n xAux >>= 16;\n result <<= 8;\n }\n if (xAux >= 2 ** 8) {\n xAux >>= 8;\n result <<= 4;\n }\n if (xAux >= 2 ** 4) {\n xAux >>= 4;\n result <<= 2;\n }\n if (xAux >= 2 ** 2) {\n result <<= 1;\n }\n\n // At this point, `result` is an estimation with at least one bit of precision. We know the true value has at\n // most 128 bits, since it is the square root of a uint256. Newton's method converges quadratically (precision\n // doubles at every iteration). We thus need at most 7 iteration to turn our partial result with one bit of\n // precision into the expected uint128 result.\n unchecked {\n result = (result + x / result) >> 1;\n result = (result + x / result) >> 1;\n result = (result + x / result) >> 1;\n result = (result + x / result) >> 1;\n result = (result + x / result) >> 1;\n result = (result + x / result) >> 1;\n result = (result + x / result) >> 1;\n\n // If x is not a perfect square, round the result toward zero.\n uint256 roundedResult = x / result;\n if (result >= roundedResult) {\n result = roundedResult;\n }\n }\n}\n" + }, + "node_modules/@uniswap/permit2/src/interfaces/IAllowanceTransfer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IEIP712} from \"./IEIP712.sol\";\n\n/// @title AllowanceTransfer\n/// @notice Handles ERC20 token permissions through signature based allowance setting and ERC20 token transfers by checking allowed amounts\n/// @dev Requires user's token approval on the Permit2 contract\ninterface IAllowanceTransfer is IEIP712 {\n /// @notice Thrown when an allowance on a token has expired.\n /// @param deadline The timestamp at which the allowed amount is no longer valid\n error AllowanceExpired(uint256 deadline);\n\n /// @notice Thrown when an allowance on a token has been depleted.\n /// @param amount The maximum amount allowed\n error InsufficientAllowance(uint256 amount);\n\n /// @notice Thrown when too many nonces are invalidated.\n error ExcessiveInvalidation();\n\n /// @notice Emits an event when the owner successfully invalidates an ordered nonce.\n event NonceInvalidation(\n address indexed owner, address indexed token, address indexed spender, uint48 newNonce, uint48 oldNonce\n );\n\n /// @notice Emits an event when the owner successfully sets permissions on a token for the spender.\n event Approval(\n address indexed owner, address indexed token, address indexed spender, uint160 amount, uint48 expiration\n );\n\n /// @notice Emits an event when the owner successfully sets permissions using a permit signature on a token for the spender.\n event Permit(\n address indexed owner,\n address indexed token,\n address indexed spender,\n uint160 amount,\n uint48 expiration,\n uint48 nonce\n );\n\n /// @notice Emits an event when the owner sets the allowance back to 0 with the lockdown function.\n event Lockdown(address indexed owner, address token, address spender);\n\n /// @notice The permit data for a token\n struct PermitDetails {\n // ERC20 token address\n address token;\n // the maximum amount allowed to spend\n uint160 amount;\n // timestamp at which a spender's token allowances become invalid\n uint48 expiration;\n // an incrementing value indexed per owner,token,and spender for each signature\n uint48 nonce;\n }\n\n /// @notice The permit message signed for a single token allowance\n struct PermitSingle {\n // the permit data for a single token alownce\n PermitDetails details;\n // address permissioned on the allowed tokens\n address spender;\n // deadline on the permit signature\n uint256 sigDeadline;\n }\n\n /// @notice The permit message signed for multiple token allowances\n struct PermitBatch {\n // the permit data for multiple token allowances\n PermitDetails[] details;\n // address permissioned on the allowed tokens\n address spender;\n // deadline on the permit signature\n uint256 sigDeadline;\n }\n\n /// @notice The saved permissions\n /// @dev This info is saved per owner, per token, per spender and all signed over in the permit message\n /// @dev Setting amount to type(uint160).max sets an unlimited approval\n struct PackedAllowance {\n // amount allowed\n uint160 amount;\n // permission expiry\n uint48 expiration;\n // an incrementing value indexed per owner,token,and spender for each signature\n uint48 nonce;\n }\n\n /// @notice A token spender pair.\n struct TokenSpenderPair {\n // the token the spender is approved\n address token;\n // the spender address\n address spender;\n }\n\n /// @notice Details for a token transfer.\n struct AllowanceTransferDetails {\n // the owner of the token\n address from;\n // the recipient of the token\n address to;\n // the amount of the token\n uint160 amount;\n // the token to be transferred\n address token;\n }\n\n /// @notice A mapping from owner address to token address to spender address to PackedAllowance struct, which contains details and conditions of the approval.\n /// @notice The mapping is indexed in the above order see: allowance[ownerAddress][tokenAddress][spenderAddress]\n /// @dev The packed slot holds the allowed amount, expiration at which the allowed amount is no longer valid, and current nonce thats updated on any signature based approvals.\n function allowance(address user, address token, address spender)\n external\n view\n returns (uint160 amount, uint48 expiration, uint48 nonce);\n\n /// @notice Approves the spender to use up to amount of the specified token up until the expiration\n /// @param token The token to approve\n /// @param spender The spender address to approve\n /// @param amount The approved amount of the token\n /// @param expiration The timestamp at which the approval is no longer valid\n /// @dev The packed allowance also holds a nonce, which will stay unchanged in approve\n /// @dev Setting amount to type(uint160).max sets an unlimited approval\n function approve(address token, address spender, uint160 amount, uint48 expiration) external;\n\n /// @notice Permit a spender to a given amount of the owners token via the owner's EIP-712 signature\n /// @dev May fail if the owner's nonce was invalidated in-flight by invalidateNonce\n /// @param owner The owner of the tokens being approved\n /// @param permitSingle Data signed over by the owner specifying the terms of approval\n /// @param signature The owner's signature over the permit data\n function permit(address owner, PermitSingle memory permitSingle, bytes calldata signature) external;\n\n /// @notice Permit a spender to the signed amounts of the owners tokens via the owner's EIP-712 signature\n /// @dev May fail if the owner's nonce was invalidated in-flight by invalidateNonce\n /// @param owner The owner of the tokens being approved\n /// @param permitBatch Data signed over by the owner specifying the terms of approval\n /// @param signature The owner's signature over the permit data\n function permit(address owner, PermitBatch memory permitBatch, bytes calldata signature) external;\n\n /// @notice Transfer approved tokens from one address to another\n /// @param from The address to transfer from\n /// @param to The address of the recipient\n /// @param amount The amount of the token to transfer\n /// @param token The token address to transfer\n /// @dev Requires the from address to have approved at least the desired amount\n /// of tokens to msg.sender.\n function transferFrom(address from, address to, uint160 amount, address token) external;\n\n /// @notice Transfer approved tokens in a batch\n /// @param transferDetails Array of owners, recipients, amounts, and tokens for the transfers\n /// @dev Requires the from addresses to have approved at least the desired amount\n /// of tokens to msg.sender.\n function transferFrom(AllowanceTransferDetails[] calldata transferDetails) external;\n\n /// @notice Enables performing a \"lockdown\" of the sender's Permit2 identity\n /// by batch revoking approvals\n /// @param approvals Array of approvals to revoke.\n function lockdown(TokenSpenderPair[] calldata approvals) external;\n\n /// @notice Invalidate nonces for a given (token, spender) pair\n /// @param token The token to invalidate nonces for\n /// @param spender The spender to invalidate nonces for\n /// @param newNonce The new nonce to set. Invalidates all nonces less than it.\n /// @dev Can't invalidate more than 2**16 nonces per transaction.\n function invalidateNonces(address token, address spender, uint48 newNonce) external;\n}\n" + }, + "node_modules/@uniswap/permit2/src/interfaces/IEIP712.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IEIP712 {\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" + }, + "node_modules/@uniswap/permit2/src/interfaces/IPermit2.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {ISignatureTransfer} from \"./ISignatureTransfer.sol\";\nimport {IAllowanceTransfer} from \"./IAllowanceTransfer.sol\";\n\n/// @notice Permit2 handles signature-based transfers in SignatureTransfer and allowance-based transfers in AllowanceTransfer.\n/// @dev Users must approve Permit2 before calling any of the transfer functions.\ninterface IPermit2 is ISignatureTransfer, IAllowanceTransfer {\n// IPermit2 unifies the two interfaces so users have maximal flexibility with their approval.\n}\n" + }, + "node_modules/@uniswap/permit2/src/interfaces/ISignatureTransfer.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IEIP712} from \"./IEIP712.sol\";\n\n/// @title SignatureTransfer\n/// @notice Handles ERC20 token transfers through signature based actions\n/// @dev Requires user's token approval on the Permit2 contract\ninterface ISignatureTransfer is IEIP712 {\n /// @notice Thrown when the requested amount for a transfer is larger than the permissioned amount\n /// @param maxAmount The maximum amount a spender can request to transfer\n error InvalidAmount(uint256 maxAmount);\n\n /// @notice Thrown when the number of tokens permissioned to a spender does not match the number of tokens being transferred\n /// @dev If the spender does not need to transfer the number of tokens permitted, the spender can request amount 0 to be transferred\n error LengthMismatch();\n\n /// @notice Emits an event when the owner successfully invalidates an unordered nonce.\n event UnorderedNonceInvalidation(address indexed owner, uint256 word, uint256 mask);\n\n /// @notice The token and amount details for a transfer signed in the permit transfer signature\n struct TokenPermissions {\n // ERC20 token address\n address token;\n // the maximum amount that can be spent\n uint256 amount;\n }\n\n /// @notice The signed permit message for a single token transfer\n struct PermitTransferFrom {\n TokenPermissions permitted;\n // a unique value for every token owner's signature to prevent signature replays\n uint256 nonce;\n // deadline on the permit signature\n uint256 deadline;\n }\n\n /// @notice Specifies the recipient address and amount for batched transfers.\n /// @dev Recipients and amounts correspond to the index of the signed token permissions array.\n /// @dev Reverts if the requested amount is greater than the permitted signed amount.\n struct SignatureTransferDetails {\n // recipient address\n address to;\n // spender requested amount\n uint256 requestedAmount;\n }\n\n /// @notice Used to reconstruct the signed permit message for multiple token transfers\n /// @dev Do not need to pass in spender address as it is required that it is msg.sender\n /// @dev Note that a user still signs over a spender address\n struct PermitBatchTransferFrom {\n // the tokens and corresponding amounts permitted for a transfer\n TokenPermissions[] permitted;\n // a unique value for every token owner's signature to prevent signature replays\n uint256 nonce;\n // deadline on the permit signature\n uint256 deadline;\n }\n\n /// @notice A map from token owner address and a caller specified word index to a bitmap. Used to set bits in the bitmap to prevent against signature replay protection\n /// @dev Uses unordered nonces so that permit messages do not need to be spent in a certain order\n /// @dev The mapping is indexed first by the token owner, then by an index specified in the nonce\n /// @dev It returns a uint256 bitmap\n /// @dev The index, or wordPosition is capped at type(uint248).max\n function nonceBitmap(address, uint256) external view returns (uint256);\n\n /// @notice Transfers a token using a signed permit message\n /// @dev Reverts if the requested amount is greater than the permitted signed amount\n /// @param permit The permit data signed over by the owner\n /// @param owner The owner of the tokens to transfer\n /// @param transferDetails The spender's requested transfer details for the permitted token\n /// @param signature The signature to verify\n function permitTransferFrom(\n PermitTransferFrom memory permit,\n SignatureTransferDetails calldata transferDetails,\n address owner,\n bytes calldata signature\n ) external;\n\n /// @notice Transfers a token using a signed permit message\n /// @notice Includes extra data provided by the caller to verify signature over\n /// @dev The witness type string must follow EIP712 ordering of nested structs and must include the TokenPermissions type definition\n /// @dev Reverts if the requested amount is greater than the permitted signed amount\n /// @param permit The permit data signed over by the owner\n /// @param owner The owner of the tokens to transfer\n /// @param transferDetails The spender's requested transfer details for the permitted token\n /// @param witness Extra data to include when checking the user signature\n /// @param witnessTypeString The EIP-712 type definition for remaining string stub of the typehash\n /// @param signature The signature to verify\n function permitWitnessTransferFrom(\n PermitTransferFrom memory permit,\n SignatureTransferDetails calldata transferDetails,\n address owner,\n bytes32 witness,\n string calldata witnessTypeString,\n bytes calldata signature\n ) external;\n\n /// @notice Transfers multiple tokens using a signed permit message\n /// @param permit The permit data signed over by the owner\n /// @param owner The owner of the tokens to transfer\n /// @param transferDetails Specifies the recipient and requested amount for the token transfer\n /// @param signature The signature to verify\n function permitTransferFrom(\n PermitBatchTransferFrom memory permit,\n SignatureTransferDetails[] calldata transferDetails,\n address owner,\n bytes calldata signature\n ) external;\n\n /// @notice Transfers multiple tokens using a signed permit message\n /// @dev The witness type string must follow EIP712 ordering of nested structs and must include the TokenPermissions type definition\n /// @notice Includes extra data provided by the caller to verify signature over\n /// @param permit The permit data signed over by the owner\n /// @param owner The owner of the tokens to transfer\n /// @param transferDetails Specifies the recipient and requested amount for the token transfer\n /// @param witness Extra data to include when checking the user signature\n /// @param witnessTypeString The EIP-712 type definition for remaining string stub of the typehash\n /// @param signature The signature to verify\n function permitWitnessTransferFrom(\n PermitBatchTransferFrom memory permit,\n SignatureTransferDetails[] calldata transferDetails,\n address owner,\n bytes32 witness,\n string calldata witnessTypeString,\n bytes calldata signature\n ) external;\n\n /// @notice Invalidates the bits specified in mask for the bitmap at the word position\n /// @dev The wordPos is maxed at type(uint248).max\n /// @param wordPos A number to index the nonceBitmap at\n /// @param mask A bitmap masked against msg.sender's current bitmap at the word position\n function invalidateUnorderedNonces(uint256 wordPos, uint256 mask) external;\n}\n" + }, + "node_modules/@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\nimport {IUniswapV3PoolImmutables} from './pool/IUniswapV3PoolImmutables.sol';\nimport {IUniswapV3PoolState} from './pool/IUniswapV3PoolState.sol';\nimport {IUniswapV3PoolDerivedState} from './pool/IUniswapV3PoolDerivedState.sol';\nimport {IUniswapV3PoolActions} from './pool/IUniswapV3PoolActions.sol';\nimport {IUniswapV3PoolOwnerActions} from './pool/IUniswapV3PoolOwnerActions.sol';\nimport {IUniswapV3PoolErrors} from './pool/IUniswapV3PoolErrors.sol';\nimport {IUniswapV3PoolEvents} from './pool/IUniswapV3PoolEvents.sol';\n\n/// @title The interface for a Uniswap V3 Pool\n/// @notice A Uniswap pool facilitates swapping and automated market making between any two assets that strictly conform\n/// to the ERC20 specification\n/// @dev The pool interface is broken up into many smaller pieces\ninterface IUniswapV3Pool is\n IUniswapV3PoolImmutables,\n IUniswapV3PoolState,\n IUniswapV3PoolDerivedState,\n IUniswapV3PoolActions,\n IUniswapV3PoolOwnerActions,\n IUniswapV3PoolErrors,\n IUniswapV3PoolEvents\n{\n\n}\n" + }, + "node_modules/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Callback for IUniswapV3PoolActions#swap\n/// @notice Any contract that calls IUniswapV3PoolActions#swap must implement this interface\ninterface IUniswapV3SwapCallback {\n /// @notice Called to `msg.sender` after executing a swap via IUniswapV3Pool#swap.\n /// @dev In the implementation you must pay the pool tokens owed for the swap.\n /// The caller of this method must be checked to be a UniswapV3Pool deployed by the canonical UniswapV3Factory.\n /// amount0Delta and amount1Delta can both be 0 if no tokens were swapped.\n /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by\n /// the end of the swap. If positive, the callback must send that amount of token0 to the pool.\n /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by\n /// the end of the swap. If positive, the callback must send that amount of token1 to the pool.\n /// @param data Any data passed through by the caller via the IUniswapV3PoolActions#swap call\n function uniswapV3SwapCallback(\n int256 amount0Delta,\n int256 amount1Delta,\n bytes calldata data\n ) external;\n}\n" + }, + "node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Permissionless pool actions\n/// @notice Contains pool methods that can be called by anyone\ninterface IUniswapV3PoolActions {\n /// @notice Sets the initial price for the pool\n /// @dev Price is represented as a sqrt(amountToken1/amountToken0) Q64.96 value\n /// @param sqrtPriceX96 the initial sqrt price of the pool as a Q64.96\n function initialize(uint160 sqrtPriceX96) external;\n\n /// @notice Adds liquidity for the given recipient/tickLower/tickUpper position\n /// @dev The caller of this method receives a callback in the form of IUniswapV3MintCallback#uniswapV3MintCallback\n /// in which they must pay any token0 or token1 owed for the liquidity. The amount of token0/token1 due depends\n /// on tickLower, tickUpper, the amount of liquidity, and the current price.\n /// @param recipient The address for which the liquidity will be created\n /// @param tickLower The lower tick of the position in which to add liquidity\n /// @param tickUpper The upper tick of the position in which to add liquidity\n /// @param amount The amount of liquidity to mint\n /// @param data Any data that should be passed through to the callback\n /// @return amount0 The amount of token0 that was paid to mint the given amount of liquidity. Matches the value in the callback\n /// @return amount1 The amount of token1 that was paid to mint the given amount of liquidity. Matches the value in the callback\n function mint(\n address recipient,\n int24 tickLower,\n int24 tickUpper,\n uint128 amount,\n bytes calldata data\n ) external returns (uint256 amount0, uint256 amount1);\n\n /// @notice Collects tokens owed to a position\n /// @dev Does not recompute fees earned, which must be done either via mint or burn of any amount of liquidity.\n /// Collect must be called by the position owner. To withdraw only token0 or only token1, amount0Requested or\n /// amount1Requested may be set to zero. To withdraw all tokens owed, caller may pass any value greater than the\n /// actual tokens owed, e.g. type(uint128).max. Tokens owed may be from accumulated swap fees or burned liquidity.\n /// @param recipient The address which should receive the fees collected\n /// @param tickLower The lower tick of the position for which to collect fees\n /// @param tickUpper The upper tick of the position for which to collect fees\n /// @param amount0Requested How much token0 should be withdrawn from the fees owed\n /// @param amount1Requested How much token1 should be withdrawn from the fees owed\n /// @return amount0 The amount of fees collected in token0\n /// @return amount1 The amount of fees collected in token1\n function collect(\n address recipient,\n int24 tickLower,\n int24 tickUpper,\n uint128 amount0Requested,\n uint128 amount1Requested\n ) external returns (uint128 amount0, uint128 amount1);\n\n /// @notice Burn liquidity from the sender and account tokens owed for the liquidity to the position\n /// @dev Can be used to trigger a recalculation of fees owed to a position by calling with an amount of 0\n /// @dev Fees must be collected separately via a call to #collect\n /// @param tickLower The lower tick of the position for which to burn liquidity\n /// @param tickUpper The upper tick of the position for which to burn liquidity\n /// @param amount How much liquidity to burn\n /// @return amount0 The amount of token0 sent to the recipient\n /// @return amount1 The amount of token1 sent to the recipient\n function burn(\n int24 tickLower,\n int24 tickUpper,\n uint128 amount\n ) external returns (uint256 amount0, uint256 amount1);\n\n /// @notice Swap token0 for token1, or token1 for token0\n /// @dev The caller of this method receives a callback in the form of IUniswapV3SwapCallback#uniswapV3SwapCallback\n /// @param recipient The address to receive the output of the swap\n /// @param zeroForOne The direction of the swap, true for token0 to token1, false for token1 to token0\n /// @param amountSpecified The amount of the swap, which implicitly configures the swap as exact input (positive), or exact output (negative)\n /// @param sqrtPriceLimitX96 The Q64.96 sqrt price limit. If zero for one, the price cannot be less than this\n /// value after the swap. If one for zero, the price cannot be greater than this value after the swap\n /// @param data Any data to be passed through to the callback\n /// @return amount0 The delta of the balance of token0 of the pool, exact when negative, minimum when positive\n /// @return amount1 The delta of the balance of token1 of the pool, exact when negative, minimum when positive\n function swap(\n address recipient,\n bool zeroForOne,\n int256 amountSpecified,\n uint160 sqrtPriceLimitX96,\n bytes calldata data\n ) external returns (int256 amount0, int256 amount1);\n\n /// @notice Receive token0 and/or token1 and pay it back, plus a fee, in the callback\n /// @dev The caller of this method receives a callback in the form of IUniswapV3FlashCallback#uniswapV3FlashCallback\n /// @dev Can be used to donate underlying tokens pro-rata to currently in-range liquidity providers by calling\n /// with 0 amount{0,1} and sending the donation amount(s) from the callback\n /// @param recipient The address which will receive the token0 and token1 amounts\n /// @param amount0 The amount of token0 to send\n /// @param amount1 The amount of token1 to send\n /// @param data Any data to be passed through to the callback\n function flash(\n address recipient,\n uint256 amount0,\n uint256 amount1,\n bytes calldata data\n ) external;\n\n /// @notice Increase the maximum number of price and liquidity observations that this pool will store\n /// @dev This method is no-op if the pool already has an observationCardinalityNext greater than or equal to\n /// the input observationCardinalityNext.\n /// @param observationCardinalityNext The desired minimum number of observations for the pool to store\n function increaseObservationCardinalityNext(uint16 observationCardinalityNext) external;\n}\n" + }, + "node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Pool state that is not stored\n/// @notice Contains view functions to provide information about the pool that is computed rather than stored on the\n/// blockchain. The functions here may have variable gas costs.\ninterface IUniswapV3PoolDerivedState {\n /// @notice Returns the cumulative tick and liquidity as of each timestamp `secondsAgo` from the current block timestamp\n /// @dev To get a time weighted average tick or liquidity-in-range, you must call this with two values, one representing\n /// the beginning of the period and another for the end of the period. E.g., to get the last hour time-weighted average tick,\n /// you must call it with secondsAgos = [3600, 0].\n /// @dev The time weighted average tick represents the geometric time weighted average price of the pool, in\n /// log base sqrt(1.0001) of token1 / token0. The TickMath library can be used to go from a tick value to a ratio.\n /// @param secondsAgos From how long ago each cumulative tick and liquidity value should be returned\n /// @return tickCumulatives Cumulative tick values as of each `secondsAgos` from the current block timestamp\n /// @return secondsPerLiquidityCumulativeX128s Cumulative seconds per liquidity-in-range value as of each `secondsAgos` from the current block\n /// timestamp\n function observe(uint32[] calldata secondsAgos)\n external\n view\n returns (int56[] memory tickCumulatives, uint160[] memory secondsPerLiquidityCumulativeX128s);\n\n /// @notice Returns a snapshot of the tick cumulative, seconds per liquidity and seconds inside a tick range\n /// @dev Snapshots must only be compared to other snapshots, taken over a period for which a position existed.\n /// I.e., snapshots cannot be compared if a position is not held for the entire period between when the first\n /// snapshot is taken and the second snapshot is taken.\n /// @param tickLower The lower tick of the range\n /// @param tickUpper The upper tick of the range\n /// @return tickCumulativeInside The snapshot of the tick accumulator for the range\n /// @return secondsPerLiquidityInsideX128 The snapshot of seconds per liquidity for the range\n /// @return secondsInside The snapshot of seconds per liquidity for the range\n function snapshotCumulativesInside(int24 tickLower, int24 tickUpper)\n external\n view\n returns (\n int56 tickCumulativeInside,\n uint160 secondsPerLiquidityInsideX128,\n uint32 secondsInside\n );\n}\n" + }, + "node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolErrors.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Errors emitted by a pool\n/// @notice Contains all events emitted by the pool\ninterface IUniswapV3PoolErrors {\n error LOK();\n error TLU();\n error TLM();\n error TUM();\n error AI();\n error M0();\n error M1();\n error AS();\n error IIA();\n error L();\n error F0();\n error F1();\n}\n" + }, + "node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Events emitted by a pool\n/// @notice Contains all events emitted by the pool\ninterface IUniswapV3PoolEvents {\n /// @notice Emitted exactly once by a pool when #initialize is first called on the pool\n /// @dev Mint/Burn/Swap cannot be emitted by the pool before Initialize\n /// @param sqrtPriceX96 The initial sqrt price of the pool, as a Q64.96\n /// @param tick The initial tick of the pool, i.e. log base 1.0001 of the starting price of the pool\n event Initialize(uint160 sqrtPriceX96, int24 tick);\n\n /// @notice Emitted when liquidity is minted for a given position\n /// @param sender The address that minted the liquidity\n /// @param owner The owner of the position and recipient of any minted liquidity\n /// @param tickLower The lower tick of the position\n /// @param tickUpper The upper tick of the position\n /// @param amount The amount of liquidity minted to the position range\n /// @param amount0 How much token0 was required for the minted liquidity\n /// @param amount1 How much token1 was required for the minted liquidity\n event Mint(\n address sender,\n address indexed owner,\n int24 indexed tickLower,\n int24 indexed tickUpper,\n uint128 amount,\n uint256 amount0,\n uint256 amount1\n );\n\n /// @notice Emitted when fees are collected by the owner of a position\n /// @dev Collect events may be emitted with zero amount0 and amount1 when the caller chooses not to collect fees\n /// @param owner The owner of the position for which fees are collected\n /// @param tickLower The lower tick of the position\n /// @param tickUpper The upper tick of the position\n /// @param amount0 The amount of token0 fees collected\n /// @param amount1 The amount of token1 fees collected\n event Collect(\n address indexed owner,\n address recipient,\n int24 indexed tickLower,\n int24 indexed tickUpper,\n uint128 amount0,\n uint128 amount1\n );\n\n /// @notice Emitted when a position's liquidity is removed\n /// @dev Does not withdraw any fees earned by the liquidity position, which must be withdrawn via #collect\n /// @param owner The owner of the position for which liquidity is removed\n /// @param tickLower The lower tick of the position\n /// @param tickUpper The upper tick of the position\n /// @param amount The amount of liquidity to remove\n /// @param amount0 The amount of token0 withdrawn\n /// @param amount1 The amount of token1 withdrawn\n event Burn(\n address indexed owner,\n int24 indexed tickLower,\n int24 indexed tickUpper,\n uint128 amount,\n uint256 amount0,\n uint256 amount1\n );\n\n /// @notice Emitted by the pool for any swaps between token0 and token1\n /// @param sender The address that initiated the swap call, and that received the callback\n /// @param recipient The address that received the output of the swap\n /// @param amount0 The delta of the token0 balance of the pool\n /// @param amount1 The delta of the token1 balance of the pool\n /// @param sqrtPriceX96 The sqrt(price) of the pool after the swap, as a Q64.96\n /// @param liquidity The liquidity of the pool after the swap\n /// @param tick The log base 1.0001 of price of the pool after the swap\n event Swap(\n address indexed sender,\n address indexed recipient,\n int256 amount0,\n int256 amount1,\n uint160 sqrtPriceX96,\n uint128 liquidity,\n int24 tick\n );\n\n /// @notice Emitted by the pool for any flashes of token0/token1\n /// @param sender The address that initiated the swap call, and that received the callback\n /// @param recipient The address that received the tokens from flash\n /// @param amount0 The amount of token0 that was flashed\n /// @param amount1 The amount of token1 that was flashed\n /// @param paid0 The amount of token0 paid for the flash, which can exceed the amount0 plus the fee\n /// @param paid1 The amount of token1 paid for the flash, which can exceed the amount1 plus the fee\n event Flash(\n address indexed sender,\n address indexed recipient,\n uint256 amount0,\n uint256 amount1,\n uint256 paid0,\n uint256 paid1\n );\n\n /// @notice Emitted by the pool for increases to the number of observations that can be stored\n /// @dev observationCardinalityNext is not the observation cardinality until an observation is written at the index\n /// just before a mint/swap/burn.\n /// @param observationCardinalityNextOld The previous value of the next observation cardinality\n /// @param observationCardinalityNextNew The updated value of the next observation cardinality\n event IncreaseObservationCardinalityNext(\n uint16 observationCardinalityNextOld,\n uint16 observationCardinalityNextNew\n );\n\n /// @notice Emitted when the protocol fee is changed by the pool\n /// @param feeProtocol0Old The previous value of the token0 protocol fee\n /// @param feeProtocol1Old The previous value of the token1 protocol fee\n /// @param feeProtocol0New The updated value of the token0 protocol fee\n /// @param feeProtocol1New The updated value of the token1 protocol fee\n event SetFeeProtocol(uint8 feeProtocol0Old, uint8 feeProtocol1Old, uint8 feeProtocol0New, uint8 feeProtocol1New);\n\n /// @notice Emitted when the collected protocol fees are withdrawn by the factory owner\n /// @param sender The address that collects the protocol fees\n /// @param recipient The address that receives the collected protocol fees\n /// @param amount0 The amount of token0 protocol fees that is withdrawn\n /// @param amount0 The amount of token1 protocol fees that is withdrawn\n event CollectProtocol(address indexed sender, address indexed recipient, uint128 amount0, uint128 amount1);\n}\n" + }, + "node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Pool state that never changes\n/// @notice These parameters are fixed for a pool forever, i.e., the methods will always return the same values\ninterface IUniswapV3PoolImmutables {\n /// @notice The contract that deployed the pool, which must adhere to the IUniswapV3Factory interface\n /// @return The contract address\n function factory() external view returns (address);\n\n /// @notice The first of the two tokens of the pool, sorted by address\n /// @return The token contract address\n function token0() external view returns (address);\n\n /// @notice The second of the two tokens of the pool, sorted by address\n /// @return The token contract address\n function token1() external view returns (address);\n\n /// @notice The pool's fee in hundredths of a bip, i.e. 1e-6\n /// @return The fee\n function fee() external view returns (uint24);\n\n /// @notice The pool tick spacing\n /// @dev Ticks can only be used at multiples of this value, minimum of 1 and always positive\n /// e.g.: a tickSpacing of 3 means ticks can be initialized every 3rd tick, i.e., ..., -6, -3, 0, 3, 6, ...\n /// This value is an int24 to avoid casting even though it is always positive.\n /// @return The tick spacing\n function tickSpacing() external view returns (int24);\n\n /// @notice The maximum amount of position liquidity that can use any tick in the range\n /// @dev This parameter is enforced per tick to prevent liquidity from overflowing a uint128 at any point, and\n /// also prevents out-of-range liquidity from being used to prevent adding in-range liquidity to a pool\n /// @return The max amount of liquidity per tick\n function maxLiquidityPerTick() external view returns (uint128);\n}\n" + }, + "node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Permissioned pool actions\n/// @notice Contains pool methods that may only be called by the factory owner\ninterface IUniswapV3PoolOwnerActions {\n /// @notice Set the denominator of the protocol's % share of the fees\n /// @param feeProtocol0 new protocol fee for token0 of the pool\n /// @param feeProtocol1 new protocol fee for token1 of the pool\n function setFeeProtocol(uint8 feeProtocol0, uint8 feeProtocol1) external;\n\n /// @notice Collect the protocol fee accrued to the pool\n /// @param recipient The address to which collected protocol fees should be sent\n /// @param amount0Requested The maximum amount of token0 to send, can be 0 to collect fees in only token1\n /// @param amount1Requested The maximum amount of token1 to send, can be 0 to collect fees in only token0\n /// @return amount0 The protocol fee collected in token0\n /// @return amount1 The protocol fee collected in token1\n function collectProtocol(\n address recipient,\n uint128 amount0Requested,\n uint128 amount1Requested\n ) external returns (uint128 amount0, uint128 amount1);\n}\n" + }, + "node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0;\n\n/// @title Pool state that can change\n/// @notice These methods compose the pool's state, and can change with any frequency including multiple times\n/// per transaction\ninterface IUniswapV3PoolState {\n /// @notice The 0th storage slot in the pool stores many values, and is exposed as a single method to save gas\n /// when accessed externally.\n /// @return sqrtPriceX96 The current price of the pool as a sqrt(token1/token0) Q64.96 value\n /// @return tick The current tick of the pool, i.e. according to the last tick transition that was run.\n /// This value may not always be equal to SqrtTickMath.getTickAtSqrtRatio(sqrtPriceX96) if the price is on a tick\n /// boundary.\n /// @return observationIndex The index of the last oracle observation that was written,\n /// @return observationCardinality The current maximum number of observations stored in the pool,\n /// @return observationCardinalityNext The next maximum number of observations, to be updated when the observation.\n /// @return feeProtocol The protocol fee for both tokens of the pool.\n /// Encoded as two 4 bit values, where the protocol fee of token1 is shifted 4 bits and the protocol fee of token0\n /// is the lower 4 bits. Used as the denominator of a fraction of the swap fee, e.g. 4 means 1/4th of the swap fee.\n /// unlocked Whether the pool is currently locked to reentrancy\n function slot0()\n external\n view\n returns (\n uint160 sqrtPriceX96,\n int24 tick,\n uint16 observationIndex,\n uint16 observationCardinality,\n uint16 observationCardinalityNext,\n uint8 feeProtocol,\n bool unlocked\n );\n\n /// @notice The fee growth as a Q128.128 fees of token0 collected per unit of liquidity for the entire life of the pool\n /// @dev This value can overflow the uint256\n function feeGrowthGlobal0X128() external view returns (uint256);\n\n /// @notice The fee growth as a Q128.128 fees of token1 collected per unit of liquidity for the entire life of the pool\n /// @dev This value can overflow the uint256\n function feeGrowthGlobal1X128() external view returns (uint256);\n\n /// @notice The amounts of token0 and token1 that are owed to the protocol\n /// @dev Protocol fees will never exceed uint128 max in either token\n function protocolFees() external view returns (uint128 token0, uint128 token1);\n\n /// @notice The currently in range liquidity available to the pool\n /// @dev This value has no relationship to the total liquidity across all ticks\n /// @return The liquidity at the current price of the pool\n function liquidity() external view returns (uint128);\n\n /// @notice Look up information about a specific tick in the pool\n /// @param tick The tick to look up\n /// @return liquidityGross the total amount of position liquidity that uses the pool either as tick lower or\n /// tick upper\n /// @return liquidityNet how much liquidity changes when the pool price crosses the tick,\n /// @return feeGrowthOutside0X128 the fee growth on the other side of the tick from the current tick in token0,\n /// @return feeGrowthOutside1X128 the fee growth on the other side of the tick from the current tick in token1,\n /// @return tickCumulativeOutside the cumulative tick value on the other side of the tick from the current tick\n /// @return secondsPerLiquidityOutsideX128 the seconds spent per liquidity on the other side of the tick from the current tick,\n /// @return secondsOutside the seconds spent on the other side of the tick from the current tick,\n /// @return initialized Set to true if the tick is initialized, i.e. liquidityGross is greater than 0, otherwise equal to false.\n /// Outside values can only be used if the tick is initialized, i.e. if liquidityGross is greater than 0.\n /// In addition, these values are only relative and must be used only in comparison to previous snapshots for\n /// a specific position.\n function ticks(int24 tick)\n external\n view\n returns (\n uint128 liquidityGross,\n int128 liquidityNet,\n uint256 feeGrowthOutside0X128,\n uint256 feeGrowthOutside1X128,\n int56 tickCumulativeOutside,\n uint160 secondsPerLiquidityOutsideX128,\n uint32 secondsOutside,\n bool initialized\n );\n\n /// @notice Returns 256 packed tick initialized boolean values. See TickBitmap for more information\n function tickBitmap(int16 wordPosition) external view returns (uint256);\n\n /// @notice Returns the information about a position by the position's key\n /// @param key The position's key is a hash of a preimage composed by the owner, tickLower and tickUpper\n /// @return liquidity The amount of liquidity in the position,\n /// @return feeGrowthInside0LastX128 fee growth of token0 inside the tick range as of the last mint/burn/poke,\n /// @return feeGrowthInside1LastX128 fee growth of token1 inside the tick range as of the last mint/burn/poke,\n /// @return tokensOwed0 the computed amount of token0 owed to the position as of the last mint/burn/poke,\n /// @return tokensOwed1 the computed amount of token1 owed to the position as of the last mint/burn/poke\n function positions(bytes32 key)\n external\n view\n returns (\n uint128 liquidity,\n uint256 feeGrowthInside0LastX128,\n uint256 feeGrowthInside1LastX128,\n uint128 tokensOwed0,\n uint128 tokensOwed1\n );\n\n /// @notice Returns data about a specific observation index\n /// @param index The element of the observations array to fetch\n /// @dev You most likely want to use #observe() instead of this method to get an observation as of some amount of time\n /// ago, rather than at a specific index in the array.\n /// @return blockTimestamp The timestamp of the observation,\n /// @return tickCumulative the tick multiplied by seconds elapsed for the life of the pool as of the observation timestamp,\n /// @return secondsPerLiquidityCumulativeX128 the seconds per in range liquidity for the life of the pool as of the observation timestamp,\n /// @return initialized whether the observation has been initialized and the values are safe to use\n function observations(uint256 index)\n external\n view\n returns (\n uint32 blockTimestamp,\n int56 tickCumulative,\n uint160 secondsPerLiquidityCumulativeX128,\n bool initialized\n );\n}\n" + }, + "node_modules/@uniswap/v3-core/contracts/libraries/FullMath.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title Contains 512-bit math functions\n/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision\n/// @dev Handles \"phantom overflow\" i.e., allows multiplication and division where an intermediate value overflows 256 bits\nlibrary FullMath {\n /// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n /// @param a The multiplicand\n /// @param b The multiplier\n /// @param denominator The divisor\n /// @return result The 256-bit result\n /// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv\n function mulDiv(\n uint256 a,\n uint256 b,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = a * b\n // Compute the product mod 2**256 and mod 2**256 - 1\n // then use the Chinese Remainder Theorem to reconstruct\n // the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2**256 + prod0\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(a, b, not(0))\n prod0 := mul(a, b)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division\n if (prod1 == 0) {\n require(denominator > 0);\n assembly {\n result := div(prod0, denominator)\n }\n return result;\n }\n\n // Make sure the result is less than 2**256.\n // Also prevents denominator == 0\n require(denominator > prod1);\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0]\n // Compute remainder using mulmod\n uint256 remainder;\n assembly {\n remainder := mulmod(a, b, denominator)\n }\n // Subtract 256 bit number from 512 bit number\n assembly {\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator\n // Compute largest power of two divisor of denominator.\n // Always >= 1.\n uint256 twos = (0 - denominator) & denominator;\n // Divide denominator by power of two\n assembly {\n denominator := div(denominator, twos)\n }\n\n // Divide [prod1 prod0] by the factors of two\n assembly {\n prod0 := div(prod0, twos)\n }\n // Shift in bits from prod1 into prod0. For this we need\n // to flip `twos` such that it is 2**256 / twos.\n // If twos is zero, then it becomes one\n assembly {\n twos := add(div(sub(0, twos), twos), 1)\n }\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2**256\n // Now that denominator is an odd number, it has an inverse\n // modulo 2**256 such that denominator * inv = 1 mod 2**256.\n // Compute the inverse by starting with a seed that is correct\n // correct for four bits. That is, denominator * inv = 1 mod 2**4\n uint256 inv = (3 * denominator) ^ 2;\n // Now use Newton-Raphson iteration to improve the precision.\n // Thanks to Hensel's lifting lemma, this also works in modular\n // arithmetic, doubling the correct bits in each step.\n inv *= 2 - denominator * inv; // inverse mod 2**8\n inv *= 2 - denominator * inv; // inverse mod 2**16\n inv *= 2 - denominator * inv; // inverse mod 2**32\n inv *= 2 - denominator * inv; // inverse mod 2**64\n inv *= 2 - denominator * inv; // inverse mod 2**128\n inv *= 2 - denominator * inv; // inverse mod 2**256\n\n // Because the division is now exact we can divide by multiplying\n // with the modular inverse of denominator. This will give us the\n // correct result modulo 2**256. Since the precoditions guarantee\n // that the outcome is less than 2**256, this is the final result.\n // We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inv;\n return result;\n }\n }\n\n /// @notice Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n /// @param a The multiplicand\n /// @param b The multiplier\n /// @param denominator The divisor\n /// @return result The 256-bit result\n function mulDivRoundingUp(\n uint256 a,\n uint256 b,\n uint256 denominator\n ) internal pure returns (uint256 result) {\n unchecked {\n result = mulDiv(a, b, denominator);\n if (mulmod(a, b, denominator) > 0) {\n require(result < type(uint256).max);\n result++;\n }\n }\n }\n}\n" + }, + "node_modules/@uniswap/v3-core/contracts/libraries/TickMath.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity ^0.8.0;\n\n/// @title Math library for computing sqrt prices from ticks and vice versa\n/// @notice Computes sqrt price for ticks of size 1.0001, i.e. sqrt(1.0001^tick) as fixed point Q64.96 numbers. Supports\n/// prices between 2**-128 and 2**128\nlibrary TickMath {\n error T();\n error R();\n\n /// @dev The minimum tick that may be passed to #getSqrtRatioAtTick computed from log base 1.0001 of 2**-128\n int24 internal constant MIN_TICK = -887272;\n /// @dev The maximum tick that may be passed to #getSqrtRatioAtTick computed from log base 1.0001 of 2**128\n int24 internal constant MAX_TICK = -MIN_TICK;\n\n /// @dev The minimum value that can be returned from #getSqrtRatioAtTick. Equivalent to getSqrtRatioAtTick(MIN_TICK)\n uint160 internal constant MIN_SQRT_RATIO = 4295128739;\n /// @dev The maximum value that can be returned from #getSqrtRatioAtTick. Equivalent to getSqrtRatioAtTick(MAX_TICK)\n uint160 internal constant MAX_SQRT_RATIO = 1461446703485210103287273052203988822378723970342;\n\n /// @notice Calculates sqrt(1.0001^tick) * 2^96\n /// @dev Throws if |tick| > max tick\n /// @param tick The input tick for the above formula\n /// @return sqrtPriceX96 A Fixed point Q64.96 number representing the sqrt of the ratio of the two assets (token1/token0)\n /// at the given tick\n function getSqrtRatioAtTick(int24 tick) internal pure returns (uint160 sqrtPriceX96) {\n unchecked {\n uint256 absTick = tick < 0 ? uint256(-int256(tick)) : uint256(int256(tick));\n if (absTick > uint256(int256(MAX_TICK))) revert T();\n\n uint256 ratio = absTick & 0x1 != 0\n ? 0xfffcb933bd6fad37aa2d162d1a594001\n : 0x100000000000000000000000000000000;\n if (absTick & 0x2 != 0) ratio = (ratio * 0xfff97272373d413259a46990580e213a) >> 128;\n if (absTick & 0x4 != 0) ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdcc) >> 128;\n if (absTick & 0x8 != 0) ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0) >> 128;\n if (absTick & 0x10 != 0) ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644) >> 128;\n if (absTick & 0x20 != 0) ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0) >> 128;\n if (absTick & 0x40 != 0) ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861) >> 128;\n if (absTick & 0x80 != 0) ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053) >> 128;\n if (absTick & 0x100 != 0) ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4) >> 128;\n if (absTick & 0x200 != 0) ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54) >> 128;\n if (absTick & 0x400 != 0) ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3) >> 128;\n if (absTick & 0x800 != 0) ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9) >> 128;\n if (absTick & 0x1000 != 0) ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825) >> 128;\n if (absTick & 0x2000 != 0) ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5) >> 128;\n if (absTick & 0x4000 != 0) ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7) >> 128;\n if (absTick & 0x8000 != 0) ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6) >> 128;\n if (absTick & 0x10000 != 0) ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9) >> 128;\n if (absTick & 0x20000 != 0) ratio = (ratio * 0x5d6af8dedb81196699c329225ee604) >> 128;\n if (absTick & 0x40000 != 0) ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98) >> 128;\n if (absTick & 0x80000 != 0) ratio = (ratio * 0x48a170391f7dc42444e8fa2) >> 128;\n\n if (tick > 0) ratio = type(uint256).max / ratio;\n\n // this divides by 1<<32 rounding up to go from a Q128.128 to a Q128.96.\n // we then downcast because we know the result always fits within 160 bits due to our tick input constraint\n // we round up in the division so getTickAtSqrtRatio of the output price is always consistent\n sqrtPriceX96 = uint160((ratio >> 32) + (ratio % (1 << 32) == 0 ? 0 : 1));\n }\n }\n\n /// @notice Calculates the greatest tick value such that getRatioAtTick(tick) <= ratio\n /// @dev Throws in case sqrtPriceX96 < MIN_SQRT_RATIO, as MIN_SQRT_RATIO is the lowest value getRatioAtTick may\n /// ever return.\n /// @param sqrtPriceX96 The sqrt ratio for which to compute the tick as a Q64.96\n /// @return tick The greatest tick for which the ratio is less than or equal to the input ratio\n function getTickAtSqrtRatio(uint160 sqrtPriceX96) internal pure returns (int24 tick) {\n unchecked {\n // second inequality must be < because the price can never reach the price at the max tick\n if (!(sqrtPriceX96 >= MIN_SQRT_RATIO && sqrtPriceX96 < MAX_SQRT_RATIO)) revert R();\n uint256 ratio = uint256(sqrtPriceX96) << 32;\n\n uint256 r = ratio;\n uint256 msb = 0;\n\n assembly {\n let f := shl(7, gt(r, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF))\n msb := or(msb, f)\n r := shr(f, r)\n }\n assembly {\n let f := shl(6, gt(r, 0xFFFFFFFFFFFFFFFF))\n msb := or(msb, f)\n r := shr(f, r)\n }\n assembly {\n let f := shl(5, gt(r, 0xFFFFFFFF))\n msb := or(msb, f)\n r := shr(f, r)\n }\n assembly {\n let f := shl(4, gt(r, 0xFFFF))\n msb := or(msb, f)\n r := shr(f, r)\n }\n assembly {\n let f := shl(3, gt(r, 0xFF))\n msb := or(msb, f)\n r := shr(f, r)\n }\n assembly {\n let f := shl(2, gt(r, 0xF))\n msb := or(msb, f)\n r := shr(f, r)\n }\n assembly {\n let f := shl(1, gt(r, 0x3))\n msb := or(msb, f)\n r := shr(f, r)\n }\n assembly {\n let f := gt(r, 0x1)\n msb := or(msb, f)\n }\n\n if (msb >= 128) r = ratio >> (msb - 127);\n else r = ratio << (127 - msb);\n\n int256 log_2 = (int256(msb) - 128) << 64;\n\n assembly {\n r := shr(127, mul(r, r))\n let f := shr(128, r)\n log_2 := or(log_2, shl(63, f))\n r := shr(f, r)\n }\n assembly {\n r := shr(127, mul(r, r))\n let f := shr(128, r)\n log_2 := or(log_2, shl(62, f))\n r := shr(f, r)\n }\n assembly {\n r := shr(127, mul(r, r))\n let f := shr(128, r)\n log_2 := or(log_2, shl(61, f))\n r := shr(f, r)\n }\n assembly {\n r := shr(127, mul(r, r))\n let f := shr(128, r)\n log_2 := or(log_2, shl(60, f))\n r := shr(f, r)\n }\n assembly {\n r := shr(127, mul(r, r))\n let f := shr(128, r)\n log_2 := or(log_2, shl(59, f))\n r := shr(f, r)\n }\n assembly {\n r := shr(127, mul(r, r))\n let f := shr(128, r)\n log_2 := or(log_2, shl(58, f))\n r := shr(f, r)\n }\n assembly {\n r := shr(127, mul(r, r))\n let f := shr(128, r)\n log_2 := or(log_2, shl(57, f))\n r := shr(f, r)\n }\n assembly {\n r := shr(127, mul(r, r))\n let f := shr(128, r)\n log_2 := or(log_2, shl(56, f))\n r := shr(f, r)\n }\n assembly {\n r := shr(127, mul(r, r))\n let f := shr(128, r)\n log_2 := or(log_2, shl(55, f))\n r := shr(f, r)\n }\n assembly {\n r := shr(127, mul(r, r))\n let f := shr(128, r)\n log_2 := or(log_2, shl(54, f))\n r := shr(f, r)\n }\n assembly {\n r := shr(127, mul(r, r))\n let f := shr(128, r)\n log_2 := or(log_2, shl(53, f))\n r := shr(f, r)\n }\n assembly {\n r := shr(127, mul(r, r))\n let f := shr(128, r)\n log_2 := or(log_2, shl(52, f))\n r := shr(f, r)\n }\n assembly {\n r := shr(127, mul(r, r))\n let f := shr(128, r)\n log_2 := or(log_2, shl(51, f))\n r := shr(f, r)\n }\n assembly {\n r := shr(127, mul(r, r))\n let f := shr(128, r)\n log_2 := or(log_2, shl(50, f))\n }\n\n int256 log_sqrt10001 = log_2 * 255738958999603826347141; // 128.128 number\n\n int24 tickLow = int24((log_sqrt10001 - 3402992956809132418596140100660247210) >> 128);\n int24 tickHi = int24((log_sqrt10001 + 291339464771989622907027621153398088495) >> 128);\n\n tick = tickLow == tickHi ? tickLow : getSqrtRatioAtTick(tickHi) <= sqrtPriceX96 ? tickHi : tickLow;\n }\n }\n}\n" + }, + "node_modules/@uniswap/v3-periphery/contracts/libraries/OracleLibrary.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity >=0.5.0 <0.9.0;\n\nimport '@uniswap/v3-core/contracts/libraries/FullMath.sol';\nimport '@uniswap/v3-core/contracts/libraries/TickMath.sol';\nimport '@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol';\n\n/// @title Oracle library\n/// @notice Provides functions to integrate with V3 pool oracle\nlibrary OracleLibrary {\n /// @notice Calculates time-weighted means of tick and liquidity for a given Uniswap V3 pool\n /// @param pool Address of the pool that we want to observe\n /// @param secondsAgo Number of seconds in the past from which to calculate the time-weighted means\n /// @return arithmeticMeanTick The arithmetic mean tick from (block.timestamp - secondsAgo) to block.timestamp\n /// @return harmonicMeanLiquidity The harmonic mean liquidity from (block.timestamp - secondsAgo) to block.timestamp\n function consult(address pool, uint32 secondsAgo)\n internal\n view\n returns (int24 arithmeticMeanTick, uint128 harmonicMeanLiquidity)\n {\n require(secondsAgo != 0, 'BP');\n\n uint32[] memory secondsAgos = new uint32[](2);\n secondsAgos[0] = secondsAgo;\n secondsAgos[1] = 0;\n\n (int56[] memory tickCumulatives, uint160[] memory secondsPerLiquidityCumulativeX128s) = IUniswapV3Pool(pool)\n .observe(secondsAgos);\n\n int56 tickCumulativesDelta = tickCumulatives[1] - tickCumulatives[0];\n uint160 secondsPerLiquidityCumulativesDelta = secondsPerLiquidityCumulativeX128s[1] -\n secondsPerLiquidityCumulativeX128s[0];\n\n arithmeticMeanTick = int24(tickCumulativesDelta / int56(uint56(secondsAgo)));\n // Always round to negative infinity\n if (tickCumulativesDelta < 0 && (tickCumulativesDelta % int56(uint56(secondsAgo)) != 0)) arithmeticMeanTick--;\n\n // We are multiplying here instead of shifting to ensure that harmonicMeanLiquidity doesn't overflow uint128\n uint192 secondsAgoX160 = uint192(secondsAgo) * type(uint160).max;\n harmonicMeanLiquidity = uint128(secondsAgoX160 / (uint192(secondsPerLiquidityCumulativesDelta) << 32));\n }\n\n /// @notice Given a tick and a token amount, calculates the amount of token received in exchange\n /// @param tick Tick value used to calculate the quote\n /// @param baseAmount Amount of token to be converted\n /// @param baseToken Address of an ERC20 token contract used as the baseAmount denomination\n /// @param quoteToken Address of an ERC20 token contract used as the quoteAmount denomination\n /// @return quoteAmount Amount of quoteToken received for baseAmount of baseToken\n function getQuoteAtTick(\n int24 tick,\n uint128 baseAmount,\n address baseToken,\n address quoteToken\n ) internal pure returns (uint256 quoteAmount) {\n uint160 sqrtRatioX96 = TickMath.getSqrtRatioAtTick(tick);\n\n // Calculate quoteAmount with better precision if it doesn't overflow when multiplied by itself\n if (sqrtRatioX96 <= type(uint128).max) {\n uint256 ratioX192 = uint256(sqrtRatioX96) * sqrtRatioX96;\n quoteAmount = baseToken < quoteToken\n ? FullMath.mulDiv(ratioX192, baseAmount, 1 << 192)\n : FullMath.mulDiv(1 << 192, baseAmount, ratioX192);\n } else {\n uint256 ratioX128 = FullMath.mulDiv(sqrtRatioX96, sqrtRatioX96, 1 << 64);\n quoteAmount = baseToken < quoteToken\n ? FullMath.mulDiv(ratioX128, baseAmount, 1 << 128)\n : FullMath.mulDiv(1 << 128, baseAmount, ratioX128);\n }\n }\n\n /// @notice Given a pool, it returns the number of seconds ago of the oldest stored observation\n /// @param pool Address of Uniswap V3 pool that we want to observe\n /// @return secondsAgo The number of seconds ago of the oldest observation stored for the pool\n function getOldestObservationSecondsAgo(address pool) internal view returns (uint32 secondsAgo) {\n (, , uint16 observationIndex, uint16 observationCardinality, , , ) = IUniswapV3Pool(pool).slot0();\n require(observationCardinality > 0, 'NI');\n\n (uint32 observationTimestamp, , , bool initialized) = IUniswapV3Pool(pool).observations(\n (observationIndex + 1) % observationCardinality\n );\n\n // The next index might not be initialized if the cardinality is in the process of increasing\n // In this case the oldest observation is always in index 0\n if (!initialized) {\n (observationTimestamp, , , ) = IUniswapV3Pool(pool).observations(0);\n }\n\n unchecked {\n secondsAgo = uint32(block.timestamp) - observationTimestamp;\n }\n }\n\n /// @notice Given a pool, it returns the tick value as of the start of the current block\n /// @param pool Address of Uniswap V3 pool\n /// @return The tick that the pool was in at the start of the current block\n function getBlockStartingTickAndLiquidity(address pool) internal view returns (int24, uint128) {\n (, int24 tick, uint16 observationIndex, uint16 observationCardinality, , , ) = IUniswapV3Pool(pool).slot0();\n\n // 2 observations are needed to reliably calculate the block starting tick\n require(observationCardinality > 1, 'NEO');\n\n // If the latest observation occurred in the past, then no tick-changing trades have happened in this block\n // therefore the tick in `slot0` is the same as at the beginning of the current block.\n // We don't need to check if this observation is initialized - it is guaranteed to be.\n (\n uint32 observationTimestamp,\n int56 tickCumulative,\n uint160 secondsPerLiquidityCumulativeX128,\n\n ) = IUniswapV3Pool(pool).observations(observationIndex);\n if (observationTimestamp != uint32(block.timestamp)) {\n return (tick, IUniswapV3Pool(pool).liquidity());\n }\n\n uint256 prevIndex = (uint256(observationIndex) + observationCardinality - 1) % observationCardinality;\n (\n uint32 prevObservationTimestamp,\n int56 prevTickCumulative,\n uint160 prevSecondsPerLiquidityCumulativeX128,\n bool prevInitialized\n ) = IUniswapV3Pool(pool).observations(prevIndex);\n\n require(prevInitialized, 'ONI');\n\n uint32 delta = observationTimestamp - prevObservationTimestamp;\n tick = int24((tickCumulative - int56(uint56(prevTickCumulative))) / int56(uint56(delta)));\n uint128 liquidity = uint128(\n (uint192(delta) * type(uint160).max) /\n (uint192(secondsPerLiquidityCumulativeX128 - prevSecondsPerLiquidityCumulativeX128) << 32)\n );\n return (tick, liquidity);\n }\n\n /// @notice Information for calculating a weighted arithmetic mean tick\n struct WeightedTickData {\n int24 tick;\n uint128 weight;\n }\n\n /// @notice Given an array of ticks and weights, calculates the weighted arithmetic mean tick\n /// @param weightedTickData An array of ticks and weights\n /// @return weightedArithmeticMeanTick The weighted arithmetic mean tick\n /// @dev Each entry of `weightedTickData` should represents ticks from pools with the same underlying pool tokens. If they do not,\n /// extreme care must be taken to ensure that ticks are comparable (including decimal differences).\n /// @dev Note that the weighted arithmetic mean tick corresponds to the weighted geometric mean price.\n function getWeightedArithmeticMeanTick(WeightedTickData[] memory weightedTickData)\n internal\n pure\n returns (int24 weightedArithmeticMeanTick)\n {\n // Accumulates the sum of products between each tick and its weight\n int256 numerator;\n\n // Accumulates the sum of the weights\n uint256 denominator;\n\n // Products fit in 152 bits, so it would take an array of length ~2**104 to overflow this logic\n for (uint256 i; i < weightedTickData.length; i++) {\n numerator += weightedTickData[i].tick * int256(uint256(weightedTickData[i].weight));\n denominator += weightedTickData[i].weight;\n }\n\n weightedArithmeticMeanTick = int24(numerator / int256(denominator));\n // Always round to negative infinity\n if (numerator < 0 && (numerator % int256(denominator) != 0)) weightedArithmeticMeanTick--;\n }\n\n /// @notice Returns the \"synthetic\" tick which represents the price of the first entry in `tokens` in terms of the last\n /// @dev Useful for calculating relative prices along routes.\n /// @dev There must be one tick for each pairwise set of tokens.\n /// @param tokens The token contract addresses\n /// @param ticks The ticks, representing the price of each token pair in `tokens`\n /// @return syntheticTick The synthetic tick, representing the relative price of the outermost tokens in `tokens`\n function getChainedPrice(address[] memory tokens, int24[] memory ticks)\n internal\n pure\n returns (int256 syntheticTick)\n {\n require(tokens.length - 1 == ticks.length, 'DL');\n for (uint256 i = 1; i <= ticks.length; i++) {\n // check the tokens for address sort order, then accumulate the\n // ticks into the running synthetic tick, ensuring that intermediate tokens \"cancel out\"\n tokens[i - 1] < tokens[i] ? syntheticTick += ticks[i - 1] : syntheticTick -= ticks[i - 1];\n }\n }\n}\n" + }, + "src/JBBuybackHook.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.23;\n\nimport {IERC20} from \"@openzeppelin/contracts/interfaces/IERC20.sol\";\nimport {IERC165} from \"@openzeppelin/contracts/utils/introspection/ERC165.sol\";\nimport {mulDiv} from \"@prb/math/src/Common.sol\";\nimport {TickMath} from \"@uniswap/v3-core/contracts/libraries/TickMath.sol\";\nimport {OracleLibrary} from \"@uniswap/v3-periphery/contracts/libraries/OracleLibrary.sol\";\nimport {IUniswapV3Pool} from \"@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol\";\nimport {IJBTerminal} from \"@bananapus/core/src/interfaces/IJBTerminal.sol\";\nimport {IJBMultiTerminal} from \"@bananapus/core/src/interfaces/IJBMultiTerminal.sol\";\nimport {JBAfterPayRecordedContext} from \"@bananapus/core/src/structs/JBAfterPayRecordedContext.sol\";\nimport {JBPermissioned} from \"@bananapus/core/src/abstract/JBPermissioned.sol\";\nimport {IJBDirectory} from \"@bananapus/core/src/interfaces/IJBDirectory.sol\";\nimport {IJBController} from \"@bananapus/core/src/interfaces/IJBController.sol\";\nimport {IJBProjects} from \"@bananapus/core/src/interfaces/IJBController.sol\";\nimport {IJBPermissioned} from \"@bananapus/core/src/interfaces/IJBPermissioned.sol\";\nimport {IJBRulesetDataHook} from \"@bananapus/core/src/interfaces/IJBRulesetDataHook.sol\";\nimport {IJBPayHook} from \"@bananapus/core/src/interfaces/IJBPayHook.sol\";\nimport {JBPayHookSpecification} from \"@bananapus/core/src/structs/JBPayHookSpecification.sol\";\nimport {JBBeforePayRecordedContext} from \"@bananapus/core/src/structs/JBBeforePayRecordedContext.sol\";\nimport {JBBeforeRedeemRecordedContext} from \"@bananapus/core/src/structs/JBBeforeRedeemRecordedContext.sol\";\nimport {JBRedeemHookSpecification} from \"@bananapus/core/src/structs/JBRedeemHookSpecification.sol\";\nimport {JBConstants} from \"@bananapus/core/src/libraries/JBConstants.sol\";\nimport {JBMetadataResolver} from \"@bananapus/core/src/libraries/JBMetadataResolver.sol\";\nimport {JBPermissionIds} from \"@bananapus/permission-ids/src/JBPermissionIds.sol\";\nimport {IJBBuybackHook} from \"./interfaces/IJBBuybackHook.sol\";\nimport {IWETH9} from \"./interfaces/external/IWETH9.sol\";\n\n/// @custom:benediction DEVS BENEDICAT ET PROTEGAT CONTRACTVS MEAM\n/// @notice The buyback hook allows beneficiaries of a payment to a project to either:\n/// - Get tokens by paying the project through its terminal OR\n/// - Buy tokens from the configured Uniswap v3 pool.\n/// Depending on which route would yield more tokens for the beneficiary. The project's reserved rate applies to either\n/// route.\n/// @dev Compatible with any `JBTerminal` and any project token that can be pooled on Uniswap v3.\ncontract JBBuybackHook is JBPermissioned, IJBBuybackHook {\n //*********************************************************************//\n // --------------------------- custom errors ------------------------- //\n //*********************************************************************//\n\n error SpecifiedSlippageExceeded();\n error InsufficientPayAmount();\n error NoProjectToken();\n error PoolAlreadySet();\n error InvalidTwapSlippageTolerance();\n error InvalidTwapWindow();\n error Unauthorized();\n\n //*********************************************************************//\n // --------------------- internal stored properties ------------------ //\n //*********************************************************************//\n\n /// @notice The TWAP parameters used for the given project when the payer does not specify a quote.\n /// See the README for further information.\n /// @dev This includes the TWAP slippage tolerance and TWAP window, packed into a `uint256`.\n /// @custom:param projectId The ID of the project to get the twap parameters for.\n mapping(uint256 projectId => uint256) internal twapParamsOf;\n\n //*********************************************************************//\n // --------------------- public constant properties ------------------ //\n //*********************************************************************//\n\n /// @notice The denominator used when calculating TWAP slippage percent values.\n uint256 public constant TWAP_SLIPPAGE_DENOMINATOR = 10_000;\n\n /// @notice Projects cannot specify a TWAP slippage tolerance smaller than this constant (out of `MAX_SLIPPAGE`).\n /// @dev This prevents TWAP slippage tolerances so low that the swap always reverts to default behavior unless a\n /// quote is specified in the payment metadata.\n uint256 public constant MIN_TWAP_SLIPPAGE_TOLERANCE = 100;\n\n /// @notice Projects cannot specify a TWAP slippage tolerance larger than this constant (out of `MAX_SLIPPAGE`).\n /// @dev This prevents TWAP slippage tolerances so high that they would result in highly unfavorable trade\n /// conditions for the payer unless a quote was specified in the payment metadata.\n uint256 public constant MAX_TWAP_SLIPPAGE_TOLERANCE = 9000;\n\n /// @notice Projects cannot specify a TWAP window shorter than this constant.\n /// @dev This serves to avoid extremely short TWAP windows that could be manipulated or subject to high volatility.\n uint256 public constant MIN_TWAP_WINDOW = 2 minutes;\n\n /// @notice Projects cannot specify a TWAP window longer than this constant.\n /// @dev This serves to avoid excessively long TWAP windows that could lead to outdated pricing information and\n /// higher gas costs due to increased computational requirements.\n uint256 public constant MAX_TWAP_WINDOW = 2 days;\n\n //*********************************************************************//\n // -------------------- public immutable properties ------------------ //\n //*********************************************************************//\n\n /// @notice The address of the Uniswap v3 factory. Used to calculate pool addresses.\n address public immutable UNISWAP_V3_FACTORY;\n\n /// @notice The directory of terminals and controllers.\n IJBDirectory public immutable DIRECTORY;\n\n /// @notice The controller used to mint and burn tokens.\n IJBController public immutable CONTROLLER;\n\n /// @notice The project registry.\n IJBProjects public immutable PROJECTS;\n\n /// @notice The wETH contract.\n IWETH9 public immutable WETH;\n\n //*********************************************************************//\n // --------------------- public stored properties -------------------- //\n //*********************************************************************//\n\n /// @notice The Uniswap pool where a given project's token and terminal token pair are traded.\n /// @custom:param projectId The ID of the project whose token is traded in the pool.\n /// @custom:param terminalToken The address of the terminal token that the project accepts for payments (and is\n /// traded in the pool).\n mapping(uint256 projectId => mapping(address terminalToken => IUniswapV3Pool)) public poolOf;\n\n /// @notice The address of each project's token.\n /// @custom:param projectId The ID of the project the token belongs to.\n mapping(uint256 projectId => address) public projectTokenOf;\n\n //*********************************************************************//\n // ------------------------- external views -------------------------- //\n //*********************************************************************//\n\n /// @notice Required by the `IJBRulesetDataHook` interfaces. Return false to not leak any permissions.\n function hasMintPermissionFor(uint256, address) external pure returns (bool) {\n return false;\n }\n\n /// @notice The `IJBRulesetDataHook` implementation which determines whether tokens should be minted from the\n /// project or bought from the pool.\n /// @param context Payment context passed to the data hook by `terminalStore.recordPaymentFrom(...)`.\n /// `context.metadata` can specify a Uniswap quote and specify how much of the payment should be used to swap.\n /// If `context.metadata` does not specify a quote, one will be calculated based on the TWAP.\n /// If `context.metadata` does not specify how much of the payment should be used, the hook uses the full amount\n /// paid in.\n /// @return weight The weight to use. If tokens are being minted from the project, this is the original weight.\n /// If tokens are being bought from the pool, the weight is 0.\n /// If tokens are being minted AND bought from the pool, this weight is adjusted to take both into account.\n /// @return hookSpecifications Specifications containing pay hooks, as well as the amount and metadata to send to\n /// them. Fulfilled by the terminal.\n /// If tokens are only being minted, `hookSpecifications` will be empty.\n function beforePayRecordedWith(JBBeforePayRecordedContext calldata context)\n external\n view\n override\n returns (uint256 weight, JBPayHookSpecification[] memory hookSpecifications)\n {\n // Keep a reference to the amount paid in.\n uint256 totalPaid = context.amount.value;\n\n // Keep a reference to the weight.\n weight = context.weight;\n\n // Keep a reference to the minimum number of tokens expected from the swap.\n uint256 minimumSwapAmountOut;\n\n // Keep a reference to the amount to be used to swap (out of `totalPaid`).\n uint256 amountToSwapWith;\n\n // Scoped section to prevent stack too deep.\n {\n // The metadata ID is the first 4 bytes of this contract's address.\n bytes4 metadataId = JBMetadataResolver.getId(\"quote\");\n\n // Unpack the quote specified by the payer/client (typically from the pool).\n (bool quoteExists, bytes memory metadata) = JBMetadataResolver.getDataFor(metadataId, context.metadata);\n if (quoteExists) (amountToSwapWith, minimumSwapAmountOut) = abi.decode(metadata, (uint256, uint256));\n }\n\n // If the amount to swap with is greater than the actual amount paid in, revert.\n if (amountToSwapWith > totalPaid) revert InsufficientPayAmount();\n\n // If the payer/client did not specify an amount to use towards the swap, use the `totalPaid`.\n if (amountToSwapWith == 0) amountToSwapWith = totalPaid;\n\n // Calculate how many tokens would be minted by a direct payment to the project.\n // `tokenCountWithoutHook` is a fixed point number with 18 decimals.\n uint256 tokenCountWithoutHook = mulDiv(amountToSwapWith, weight, 10 ** context.amount.decimals);\n\n // Keep a reference to the project's token.\n address projectToken = projectTokenOf[context.projectId];\n\n // Keep a reference to the token being used by the terminal that is calling this hook. Default to wETH if the\n // terminal uses the native token.\n address terminalToken = context.amount.token == JBConstants.NATIVE_TOKEN ? address(WETH) : context.amount.token;\n\n // If a minimum amount of tokens to swap for wasn't specified by the player/client, calculate a minimum based on\n // the TWAP.\n if (minimumSwapAmountOut == 0) {\n minimumSwapAmountOut = _getQuote(context.projectId, projectToken, amountToSwapWith, terminalToken);\n }\n\n // If the minimum amount of tokens from the swap exceeds the amount that paying the project directly would\n // yield, swap.\n if (tokenCountWithoutHook < minimumSwapAmountOut) {\n // Keep a reference to a flag indicating whether the Uniswap pool will reference the project token first in\n // the pair.\n bool projectTokenIs0 = address(projectToken) < terminalToken;\n\n // Specify this hook as the one to use, the amount to swap with, and metadata which allows the swap to be\n // executed.\n hookSpecifications = new JBPayHookSpecification[](1);\n hookSpecifications[0] = JBPayHookSpecification({\n hook: IJBPayHook(this),\n amount: amountToSwapWith,\n metadata: abi.encode(\n projectTokenIs0, totalPaid == amountToSwapWith ? 0 : totalPaid - amountToSwapWith, minimumSwapAmountOut\n )\n });\n\n // All the minting will be done in `afterPayRecordedWith`. Return a weight of 0 to any additional minting\n // from the terminal.\n return (0, hookSpecifications);\n }\n }\n\n /// @notice Get the TWAP window for a given project ID.\n /// @dev The \"TWAP window\" is the period over which the TWAP is computed.\n /// @param projectId The ID of the project which the TWAP window applies to.\n /// @return secondsAgo The TWAP window in seconds.\n function twapWindowOf(uint256 projectId) external view returns (uint32) {\n return uint32(twapParamsOf[projectId]);\n }\n\n /// @notice Get the TWAP slippage tolerance for a given project ID.\n /// @dev The \"TWAP slippage tolerance\" is the maximum negative spread between the TWAP and the expected return from\n /// a swap.\n /// If the expected return unfavourably exceeds the TWAP slippage tolerance, the swap will revert.\n /// @param projectId The ID of the project which the TWAP slippage tolerance applies to.\n /// @return tolerance The maximum slippage allowed relative to the TWAP, as a percent out of\n /// `TWAP_SLIPPAGE_DENOMINATOR`.\n function twapSlippageToleranceOf(uint256 projectId) external view returns (uint256) {\n return twapParamsOf[projectId] >> 128;\n }\n\n /// @notice To fulfill the `IJBRulesetDataHook` interface.\n /// @dev Pass redeem context back to the terminal without changes.\n /// @param context The redeem context passed in by the terminal.\n function beforeRedeemRecordedWith(JBBeforeRedeemRecordedContext calldata context)\n external\n pure\n override\n returns (uint256, uint256, uint256, JBRedeemHookSpecification[] memory hookSpecifications)\n {\n return (context.redemptionRate, context.redeemCount, context.totalSupply, hookSpecifications);\n }\n\n //*********************************************************************//\n // -------------------------- public views --------------------------- //\n //*********************************************************************//\n\n function supportsInterface(bytes4 interfaceId) public pure override returns (bool) {\n return interfaceId == type(IJBRulesetDataHook).interfaceId || interfaceId == type(IJBPayHook).interfaceId\n || interfaceId == type(IJBBuybackHook).interfaceId || interfaceId == type(IERC165).interfaceId;\n }\n\n //*********************************************************************//\n // ---------------------------- constructor -------------------------- //\n //*********************************************************************//\n\n /// @param weth The WETH contract.\n /// @param factory The address of the Uniswap v3 factory. Used to calculate pool addresses.\n /// @param directory The directory of terminals and controllers.\n /// @param controller The controller used to mint and burn tokens.\n constructor(\n IWETH9 weth,\n address factory,\n IJBDirectory directory,\n IJBController controller\n )\n JBPermissioned(IJBPermissioned(address(controller)).PERMISSIONS())\n {\n WETH = weth;\n DIRECTORY = directory;\n CONTROLLER = controller;\n UNISWAP_V3_FACTORY = factory;\n PROJECTS = controller.PROJECTS();\n }\n\n //*********************************************************************//\n // ---------------------- external transactions ---------------------- //\n //*********************************************************************//\n\n /// @notice Swap the specified amount of terminal tokens for project tokens, using any leftover terminal tokens to\n /// mint from the project.\n /// @dev This function is only called if the minimum return from the swap exceeds the return from minting by paying\n /// the project.\n /// If the swap reverts (due to slippage, insufficient liquidity, or something else),\n /// then the hook mints the number of tokens which a payment to the project would have minted.\n /// @param context The pay context passed in by the terminal.\n function afterPayRecordedWith(JBAfterPayRecordedContext calldata context) external payable override {\n // Make sure only the project's payment terminals can access this function.\n if (!DIRECTORY.isTerminalOf(context.projectId, IJBTerminal(msg.sender))) {\n revert Unauthorized();\n }\n\n // Parse the metadata forwarded from the data hook.\n (bool projectTokenIs0, uint256 amountToMintWith, uint256 minimumSwapAmountOut) =\n abi.decode(context.hookMetadata, (bool, uint256, uint256));\n\n // If the token paid in isn't the native token, pull the amount to swap from the terminal.\n if (context.forwardedAmount.token != JBConstants.NATIVE_TOKEN) {\n IERC20(context.forwardedAmount.token).transferFrom(msg.sender, address(this), context.forwardedAmount.value);\n }\n\n // Get a reference to the number of project tokens that was swapped for.\n uint256 exactSwapAmountOut = _swap(context, projectTokenIs0);\n\n // Ensure swap satisfies payer/client minimum amount or calculated TWAP if payer/client did not specify.\n if (exactSwapAmountOut < minimumSwapAmountOut) revert SpecifiedSlippageExceeded();\n\n // Get a reference to any terminal tokens which were paid in and are still held by this contract.\n uint256 terminalTokensInThisContract = context.forwardedAmount.token == JBConstants.NATIVE_TOKEN\n ? address(this).balance\n : IERC20(context.forwardedAmount.token).balanceOf(address(this));\n\n // Mint a corresponding number of project tokens using any terminal tokens left over.\n // Keep a reference to the number of tokens being minted.\n uint256 partialMintTokenCount;\n if (terminalTokensInThisContract != 0) {\n partialMintTokenCount = mulDiv(terminalTokensInThisContract, context.weight, 10 ** context.amount.decimals);\n\n // If the token paid in wasn't the native token, grant the terminal permission to pull them back into its\n // balance.\n if (context.forwardedAmount.token != JBConstants.NATIVE_TOKEN) {\n IERC20(context.forwardedAmount.token).approve(msg.sender, terminalTokensInThisContract);\n }\n\n // Keep a reference to the amount being paid as `msg.value`.\n uint256 payValue =\n context.forwardedAmount.token == JBConstants.NATIVE_TOKEN ? terminalTokensInThisContract : 0;\n\n // Add the paid amount back to the project's balance in the terminal.\n IJBMultiTerminal(msg.sender).addToBalanceOf{value: payValue}({\n projectId: context.projectId,\n token: context.forwardedAmount.token,\n amount: terminalTokensInThisContract,\n shouldReturnHeldFees: false,\n memo: \"\",\n metadata: bytes(\"\")\n });\n\n emit Mint(context.projectId, terminalTokensInThisContract, partialMintTokenCount, msg.sender);\n }\n\n // Add the amount to mint to the leftover mint amount (avoiding stack too deep here).\n partialMintTokenCount += mulDiv(amountToMintWith, context.weight, 10 ** context.amount.decimals);\n\n // Mint the calculated amount of tokens for the beneficiary, including any leftover amount.\n // This takes the reserved rate into account.\n CONTROLLER.mintTokensOf({\n projectId: context.projectId,\n tokenCount: exactSwapAmountOut + partialMintTokenCount,\n beneficiary: address(context.beneficiary),\n memo: \"\",\n useReservedPercent: true\n });\n }\n\n /// @notice The Uniswap v3 pool callback where the token transfer is expected to happen.\n /// @param amount0Delta The amount of token 0 being used for the swap.\n /// @param amount1Delta The amount of token 1 being used for the swap.\n /// @param data Data passed in by the swap operation.\n function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes calldata data) external override {\n // Unpack the data passed in through the swap hook.\n (uint256 projectId, address terminalToken) = abi.decode(data, (uint256, address));\n\n // Get the terminal token, using wETH if the token paid in is the native token.\n address terminalTokenWithWETH = terminalToken == JBConstants.NATIVE_TOKEN ? address(WETH) : terminalToken;\n\n // Make sure this call is being made from the right pool.\n if (msg.sender != address(poolOf[projectId][terminalTokenWithWETH])) revert Unauthorized();\n\n // Keep a reference to the number of tokens that should be sent to fulfill the swap (the positive delta).\n uint256 amountToSendToPool = amount0Delta < 0 ? uint256(amount1Delta) : uint256(amount0Delta);\n\n // Wrap native tokens as needed.\n if (terminalToken == JBConstants.NATIVE_TOKEN) WETH.deposit{value: amountToSendToPool}();\n\n // Transfer the token to the pool.\n IERC20(terminalTokenWithWETH).transfer(msg.sender, amountToSendToPool);\n }\n\n /// @notice Set the pool to use for a given project and terminal token (the default for the project's token <->\n /// terminal token pair).\n /// @dev Uses create2 for callback auth and to allow adding pools which haven't been deployed yet.\n /// This can be called by the project's owner or an address which has the `JBPermissionIds.SET_BUYBACK_POOL`\n /// permission from the owner.\n /// @param projectId The ID of the project to set the pool for.\n /// @param fee The fee used in the pool being set, as a fixed-point number of basis points with 2 decimals. A 0.01%\n /// fee is `100`, a 0.05% fee is `500`, a 0.3% fee is `3000`, and a 1% fee is `10000`.\n /// @param twapWindow The period of time over which the TWAP is computed.\n /// @param twapSlippageTolerance The maximum spread allowed between the amount received and the TWAP.\n /// @param terminalToken The address of the terminal token that payments to the project are made in.\n /// @return newPool The pool that was set for the project and terminal token.\n function setPoolFor(\n uint256 projectId,\n uint24 fee,\n uint32 twapWindow,\n uint256 twapSlippageTolerance,\n address terminalToken\n )\n external\n returns (IUniswapV3Pool newPool)\n {\n // Enforce permissions.\n _requirePermissionFrom({\n account: PROJECTS.ownerOf(projectId),\n projectId: projectId,\n permissionId: JBPermissionIds.SET_BUYBACK_POOL\n });\n\n // Make sure the provided TWAP slippage tolerance is within reasonable bounds.\n if (twapSlippageTolerance < MIN_TWAP_SLIPPAGE_TOLERANCE || twapSlippageTolerance > MAX_TWAP_SLIPPAGE_TOLERANCE)\n {\n revert InvalidTwapSlippageTolerance();\n }\n\n // Make sure the provided TWAP window is within reasonable bounds.\n if (twapWindow < MIN_TWAP_WINDOW || twapWindow > MAX_TWAP_WINDOW) revert InvalidTwapWindow();\n\n // Keep a reference to the project's token.\n address projectToken = address(CONTROLLER.TOKENS().tokenOf(projectId));\n\n // Make sure the project has issued a token.\n if (projectToken == address(0)) revert NoProjectToken();\n\n // If the specified terminal token is the native token, use wETH instead.\n if (terminalToken == JBConstants.NATIVE_TOKEN) terminalToken = address(WETH);\n\n // Keep a reference to a flag indicating whether the pool will reference the project token first in the pair.\n bool projectTokenIs0 = address(projectToken) < terminalToken;\n\n // Compute the pool's address, which is a function of the factory, both tokens, and the fee.\n newPool = IUniswapV3Pool(\n address(\n uint160(\n uint256(\n keccak256(\n abi.encodePacked(\n hex\"ff\",\n UNISWAP_V3_FACTORY,\n keccak256(\n abi.encode(\n projectTokenIs0 ? projectToken : terminalToken,\n projectTokenIs0 ? terminalToken : projectToken,\n fee\n )\n ),\n // POOL_INIT_CODE_HASH from\n // https://github.com/Uniswap/v3-periphery/blob/main/contracts/libraries/PoolAddress.sol\n bytes32(0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54)\n )\n )\n )\n )\n )\n );\n\n // Make sure this pool hasn't already been set in this hook.\n if (poolOf[projectId][terminalToken] != IUniswapV3Pool(address(0))) revert PoolAlreadySet();\n\n // Store the pool.\n poolOf[projectId][terminalToken] = newPool;\n\n // Pack and store the TWAP window and the TWAP slippage tolerance in `twapParamsOf`.\n twapParamsOf[projectId] = twapSlippageTolerance << 128 | twapWindow;\n projectTokenOf[projectId] = address(projectToken);\n\n emit TwapWindowChanged(projectId, 0, twapWindow, msg.sender);\n emit TwapSlippageToleranceChanged(projectId, 0, twapSlippageTolerance, msg.sender);\n emit PoolAdded(projectId, terminalToken, address(newPool), msg.sender);\n }\n\n /// @notice Change the TWAP window for a project.\n /// The TWAP window is the period of time over which the TWAP is computed.\n /// @dev This can be called by the project's owner or an address with `JBPermissionIds.SET_BUYBACK_TWAP`\n /// permission from the owner.\n /// @param projectId The ID of the project to set the TWAP window of.\n /// @param newWindow The new TWAP window.\n function setTwapWindowOf(uint256 projectId, uint32 newWindow) external {\n // Enforce permissions.\n _requirePermissionFrom({\n account: PROJECTS.ownerOf(projectId),\n projectId: projectId,\n permissionId: JBPermissionIds.SET_BUYBACK_TWAP\n });\n\n // Make sure the specified window is within reasonable bounds.\n if (newWindow < MIN_TWAP_WINDOW || newWindow > MAX_TWAP_WINDOW) {\n revert InvalidTwapWindow();\n }\n\n // Keep a reference to the stored TWAP params.\n uint256 twapParams = twapParamsOf[projectId];\n\n // Keep a reference to the old window value.\n uint256 oldWindow = uint128(twapParams);\n\n // Store the new packed value of the TWAP params (with the updated window).\n twapParamsOf[projectId] = uint256(newWindow) | ((twapParams >> 128) << 128);\n\n emit TwapWindowChanged(projectId, oldWindow, newWindow, msg.sender);\n }\n\n /// @notice Set the TWAP slippage tolerance for a project.\n /// The TWAP slippage tolerance is the maximum spread allowed between the amount received and the TWAP.\n /// @dev This can be called by the project's owner or an address with `JBPermissionIds.SET_BUYBACK_TWAP`\n /// permission from the owner.\n /// @param projectId The ID of the project to set the TWAP slippage tolerance of.\n /// @param newSlippageTolerance The new TWAP slippage tolerance, out of `TWAP_SLIPPAGE_DENOMINATOR`.\n function setTwapSlippageToleranceOf(uint256 projectId, uint256 newSlippageTolerance) external {\n // Enforce permissions.\n _requirePermissionFrom({\n account: PROJECTS.ownerOf(projectId),\n projectId: projectId,\n permissionId: JBPermissionIds.SET_BUYBACK_TWAP\n });\n\n // Make sure the provided TWAP slippage tolerance is within reasonable bounds.\n if (newSlippageTolerance < MIN_TWAP_SLIPPAGE_TOLERANCE || newSlippageTolerance > MAX_TWAP_SLIPPAGE_TOLERANCE) {\n revert InvalidTwapSlippageTolerance();\n }\n\n // Keep a reference to the currently stored TWAP params.\n uint256 twapParams = twapParamsOf[projectId];\n\n // Keep a reference to the old TWAP slippage tolerance.\n uint256 oldSlippageTolerance = twapParams >> 128;\n\n // Store the new packed value of the TWAP params (with the updated tolerance).\n twapParamsOf[projectId] = newSlippageTolerance << 128 | ((twapParams << 128) >> 128);\n\n emit TwapSlippageToleranceChanged(projectId, oldSlippageTolerance, newSlippageTolerance, msg.sender);\n }\n\n //*********************************************************************//\n // ---------------------- internal functions ------------------------- //\n //*********************************************************************//\n\n /// @notice Get a quote based on the TWAP, using the TWAP window and slippage tolerance for the specified project.\n /// @param projectId The ID of the project which the swap is associated with.\n /// @param projectToken The project token being swapped for.\n /// @param amountIn The number of terminal tokens being used to swap.\n /// @param terminalToken The terminal token being paid in and used to swap.\n /// @return amountOut The minimum number of tokens to receive based on the TWAP and its params.\n function _getQuote(\n uint256 projectId,\n address projectToken,\n uint256 amountIn,\n address terminalToken\n )\n internal\n view\n returns (uint256 amountOut)\n {\n // Get a reference to the pool that'll be used to make the swap.\n IUniswapV3Pool pool = poolOf[projectId][address(terminalToken)];\n\n // Make sure the pool exists, if not, return an empty quote.\n if (address(pool).code.length == 0) return 0;\n\n // If there is a contract at the address, try to get the pool's slot 0.\n try pool.slot0() returns (uint160, int24, uint16, uint16, uint16, uint8, bool unlocked) {\n // If the pool hasn't been initialized, return an empty quote.\n if (!unlocked) return 0;\n } catch {\n // If the address is invalid, return an empty quote.\n return 0;\n }\n\n // Unpack the TWAP params and get a reference to the period and slippage.\n uint256 twapParams = twapParamsOf[projectId];\n uint32 twapWindow = uint32(twapParams);\n uint256 twapSlippageTolerance = twapParams >> 128;\n\n // Keep a reference to the TWAP tick.\n (int24 arithmeticMeanTick,) = OracleLibrary.consult(address(pool), twapWindow);\n\n // Get a quote based on this TWAP tick.\n amountOut = OracleLibrary.getQuoteAtTick({\n tick: arithmeticMeanTick,\n baseAmount: uint128(amountIn),\n baseToken: terminalToken,\n quoteToken: address(projectToken)\n });\n\n // Return the lowest acceptable return based on the TWAP and its parameters.\n amountOut -= (amountOut * twapSlippageTolerance) / TWAP_SLIPPAGE_DENOMINATOR;\n }\n\n /// @notice Swap the terminal token to receive project tokens.\n /// @param context The `afterPayRecordedContext` passed in by the terminal.\n /// @param projectTokenIs0 A flag indicating whether the pool references the project token as the first in the pair.\n /// @return amountReceived The amount of project tokens received from the swap.\n function _swap(\n JBAfterPayRecordedContext calldata context,\n bool projectTokenIs0\n )\n internal\n returns (uint256 amountReceived)\n {\n // The number of terminal tokens being used for the swap.\n uint256 amountToSwapWith = context.forwardedAmount.value;\n\n // Get the terminal token. Use wETH if the terminal token is the native token.\n address terminalTokenWithWETH =\n context.forwardedAmount.token == JBConstants.NATIVE_TOKEN ? address(WETH) : context.forwardedAmount.token;\n\n // Get a reference to the pool that'll be used to make the swap.\n IUniswapV3Pool pool = poolOf[context.projectId][terminalTokenWithWETH];\n\n // Try swapping.\n try pool.swap({\n recipient: address(this),\n zeroForOne: !projectTokenIs0,\n amountSpecified: int256(amountToSwapWith),\n sqrtPriceLimitX96: projectTokenIs0 ? TickMath.MAX_SQRT_RATIO - 1 : TickMath.MIN_SQRT_RATIO + 1,\n data: abi.encode(context.projectId, context.forwardedAmount.token)\n }) returns (int256 amount0, int256 amount1) {\n // If the swap succeded, take note of the amount of tokens received.\n // This will be returned as a negative value, which Uniswap uses to represent the outputs of exact input\n // swaps.\n amountReceived = uint256(-(projectTokenIs0 ? amount0 : amount1));\n } catch {\n // If the swap failed, return.\n return 0;\n }\n\n // Burn the whole amount received.\n if (amountReceived != 0) {\n CONTROLLER.burnTokensOf({\n holder: address(this),\n projectId: context.projectId,\n tokenCount: amountReceived,\n memo: \"\"\n });\n }\n\n // Return the amount we received/burned, which we will mint to the beneficiary later.\n emit Swap(context.projectId, amountToSwapWith, pool, amountReceived, msg.sender);\n }\n}\n" + }, + "src/interfaces/IJBBuybackHook.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {IJBPayHook} from \"@bananapus/core/src/interfaces/IJBPayHook.sol\";\nimport {IJBRulesetDataHook} from \"@bananapus/core/src/interfaces/IJBRulesetDataHook.sol\";\nimport {IJBDirectory} from \"@bananapus/core/src/interfaces/IJBDirectory.sol\";\nimport {IJBController} from \"@bananapus/core/src/interfaces/IJBController.sol\";\nimport {IJBProjects} from \"@bananapus/core/src/interfaces/IJBProjects.sol\";\nimport {IUniswapV3Pool} from \"@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol\";\nimport {IUniswapV3SwapCallback} from \"@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol\";\nimport {IWETH9} from \"./external/IWETH9.sol\";\n\ninterface IJBBuybackHook is IJBPayHook, IJBRulesetDataHook, IUniswapV3SwapCallback {\n event Swap(uint256 indexed projectId, uint256 amountIn, IUniswapV3Pool pool, uint256 amountOut, address caller);\n event Mint(uint256 indexed projectId, uint256 amountIn, uint256 tokenCount, address caller);\n event TwapWindowChanged(uint256 indexed projectId, uint256 oldSecondsAgo, uint256 newSecondsAgo, address caller);\n event TwapSlippageToleranceChanged(\n uint256 indexed projectId, uint256 oldTwapTolerance, uint256 newTwapTolerance, address caller\n );\n event PoolAdded(uint256 indexed projectId, address indexed terminalToken, address newPool, address caller);\n\n function TWAP_SLIPPAGE_DENOMINATOR() external view returns (uint256);\n\n function MIN_TWAP_SLIPPAGE_TOLERANCE() external view returns (uint256);\n\n function MAX_TWAP_SLIPPAGE_TOLERANCE() external view returns (uint256);\n\n function MIN_TWAP_WINDOW() external view returns (uint256);\n\n function MAX_TWAP_WINDOW() external view returns (uint256);\n\n function UNISWAP_V3_FACTORY() external view returns (address);\n\n function DIRECTORY() external view returns (IJBDirectory);\n\n function CONTROLLER() external view returns (IJBController);\n\n function PROJECTS() external view returns (IJBProjects);\n\n function WETH() external view returns (IWETH9);\n\n function poolOf(uint256 projectId, address terminalToken) external view returns (IUniswapV3Pool pool);\n\n function twapWindowOf(uint256 projectId) external view returns (uint32 window);\n\n function twapSlippageToleranceOf(uint256 projectId) external view returns (uint256 slippageTolerance);\n\n function projectTokenOf(uint256 projectId) external view returns (address projectTokenOf);\n\n function setPoolFor(\n uint256 projectId,\n uint24 fee,\n uint32 twapWindow,\n uint256 twapSlippageTolerance,\n address terminalToken\n )\n external\n returns (IUniswapV3Pool newPool);\n\n function setTwapWindowOf(uint256 projectId, uint32 newWindow) external;\n\n function setTwapSlippageToleranceOf(uint256 projectId, uint256 newSlippageTolerance) external;\n}\n" + }, + "src/interfaces/external/IWETH9.sol": { + "content": "// SPDX-License-Identifier: GPL-2.0-or-later\npragma solidity ^0.8.0;\n\nimport \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\n\n/// @title Interface for WETH9\ninterface IWETH9 is IERC20 {\n /// @notice Deposit ether to get wrapped ether\n function deposit() external payable;\n\n /// @notice Withdraw wrapped ether to get ether\n function withdraw(uint256) external;\n}\n" + } + } + } +} \ No newline at end of file diff --git a/deployments/nana-buyback-hook-testnet/arbitrum_sepolia/JBBuybackHook.json b/deployments/nana-buyback-hook-testnet/arbitrum_sepolia/JBBuybackHook.json index 74352a2..d6f6de0 100644 --- a/deployments/nana-buyback-hook-testnet/arbitrum_sepolia/JBBuybackHook.json +++ b/deployments/nana-buyback-hook-testnet/arbitrum_sepolia/JBBuybackHook.json @@ -1,8 +1,8 @@ { "_format": "sphinx-sol-ct-artifact-1", - "merkleRoot": "0xdf51ca1fa6bf804fc5dfbf513fb7282e053f136c07f7c4f9b3a95012943e1a10", + "merkleRoot": "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1", "contractName": "JBBuybackHook", - "address": "0x8A39B31FA82C40A46C5df18A72094C6B3D4B9090", + "address": "0xdb3cF71D9A82E663358C59C8daC350897EA331D2", "abi": [ { "type": "constructor", @@ -349,7 +349,7 @@ "internalType": "uint256" }, { - "name": "reservedRate", + "name": "reservedPercent", "type": "uint256", "internalType": "uint256" }, @@ -967,86 +967,86 @@ "inputs": [] } ], - "solcInputHash": "347fff29e2440260967cc55cc0a76014", + "solcInputHash": "f096d2968ac6c775921975b16cb0c91e", "receipt": { - "blockHash": "0xeca9f44e5314287c979c10fd26bb5d08d5d6bd2cf1f36d61621927a3a5b8cd09", - "blockNumber": 65363757, + "blockHash": "0xce855bfc60fe7e0c3a0567336b6ddf331c4cec410200bac808d83a9b0aed80ce", + "blockNumber": 65598174, "contractAddress": null, - "cumulativeGasUsed": "3569292", + "cumulativeGasUsed": "3632385", "from": "0x0c1c9049564269275059032Fb484Aa2e7Ab779af", "gasPrice": "100000000", - "gasUsed": "3569292", - "hash": "0x105b80fb12bf48f2cb511959c57511fe423004fec39dde220f6a96581005c8bf", + "gasUsed": "3632385", + "hash": "0x5e5a0b728a83809ea2c88090d67c391e45989655b0e56bd7f6b27a31114a568d", "index": 1, "logs": [ { "address": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", - "blockHash": "0xeca9f44e5314287c979c10fd26bb5d08d5d6bd2cf1f36d61621927a3a5b8cd09", - "blockNumber": 65363757, + "blockHash": "0xce855bfc60fe7e0c3a0567336b6ddf331c4cec410200bac808d83a9b0aed80ce", + "blockNumber": 65598174, "data": "0x0000000000000000000000000000000000000000000000000000000000000000", "index": 0, "topics": [ "0x572f161235911da04685a68c06adf558fc7e4a36909dca394650e0adc19cc93d", "0x0000000000000000000000000c1c9049564269275059032fb484aa2e7ab779af", "0x000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4", - "0x322fef2ed67e686f3d4ab4347a232fdc2c784dca82a2bf95af4b49524c2f8488" + "0xcf7738e9fd703d1310f8326da03a891fe86fbb9e4249ed91e4f5b9b14364113b" ], - "transactionHash": "0x105b80fb12bf48f2cb511959c57511fe423004fec39dde220f6a96581005c8bf", + "transactionHash": "0x5e5a0b728a83809ea2c88090d67c391e45989655b0e56bd7f6b27a31114a568d", "transactionIndex": 1 }, { "address": "0x4bDf5A13e7a25F88dd5321a979e0E54c13DF83E8", - "blockHash": "0xeca9f44e5314287c979c10fd26bb5d08d5d6bd2cf1f36d61621927a3a5b8cd09", - "blockNumber": 65363757, + "blockHash": "0xce855bfc60fe7e0c3a0567336b6ddf331c4cec410200bac808d83a9b0aed80ce", + "blockNumber": 65598174, "data": "0x", "index": 1, "topics": [ "0x6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8", "0x000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4" ], - "transactionHash": "0x105b80fb12bf48f2cb511959c57511fe423004fec39dde220f6a96581005c8bf", + "transactionHash": "0x5e5a0b728a83809ea2c88090d67c391e45989655b0e56bd7f6b27a31114a568d", "transactionIndex": 1 }, { "address": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", - "blockHash": "0xeca9f44e5314287c979c10fd26bb5d08d5d6bd2cf1f36d61621927a3a5b8cd09", - "blockNumber": 65363757, + "blockHash": "0xce855bfc60fe7e0c3a0567336b6ddf331c4cec410200bac808d83a9b0aed80ce", + "blockNumber": 65598174, "data": "0x0000000000000000000000000000000000000000000000000000000000000001", "index": 2, "topics": [ "0xa65fb05c5808f5f389d72edeaf719ce38f4cc55c1f69ca3cbfb31c21501caa07", - "0xdf51ca1fa6bf804fc5dfbf513fb7282e053f136c07f7c4f9b3a95012943e1a10" + "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1" ], - "transactionHash": "0x105b80fb12bf48f2cb511959c57511fe423004fec39dde220f6a96581005c8bf", + "transactionHash": "0x5e5a0b728a83809ea2c88090d67c391e45989655b0e56bd7f6b27a31114a568d", "transactionIndex": 1 }, { "address": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", - "blockHash": "0xeca9f44e5314287c979c10fd26bb5d08d5d6bd2cf1f36d61621927a3a5b8cd09", - "blockNumber": 65363757, + "blockHash": "0xce855bfc60fe7e0c3a0567336b6ddf331c4cec410200bac808d83a9b0aed80ce", + "blockNumber": 65598174, "data": "0x", "index": 3, "topics": [ "0x4383d976757d67ca920616be0b6430a681ea9d3dcce8d6d61d4603ca4a9bff63", - "0xdf51ca1fa6bf804fc5dfbf513fb7282e053f136c07f7c4f9b3a95012943e1a10" + "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1" ], - "transactionHash": "0x105b80fb12bf48f2cb511959c57511fe423004fec39dde220f6a96581005c8bf", + "transactionHash": "0x5e5a0b728a83809ea2c88090d67c391e45989655b0e56bd7f6b27a31114a568d", "transactionIndex": 1 } ], - "logsBloom": "0x00000000000010000000000000090000000000000000010000000000004000000080000000000000000000000040020000000000000000000000000000000000000000000000200000000000000000000000000000000000800000000000000000000000000000000000000000000000004000000400000000100000000000000000000000000000000100000000000000000800000040000000000000000000004000800001000000000000000000002200000400000000100000000004000000000002000000000000000000000000000000000008000000000000000000000000000000000008000000000000000200000000800080100000000008000000", + "logsBloom": "0x00000000080010000000000000080000000000000000010000000000004000020080000000000000000000000040024000000000000000000000000000080000000000000000200000000000000000040000000000000000800000000000000000000000000000008000000000000000004000000400000000000000000000000000000000000000000100000000000000000800000000000000000000000000004000800001000000000000000000002200000000000000100000000004000000000002000000000000000000000000000000000008000000000000000000000000000000000008000000000000000200000000000080100000000008000000", "status": 1, "to": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463" }, - "metadata": "{\"compiler\":{\"version\":\"0.8.23+commit.f704f362\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IWETH9\",\"name\":\"weth\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"internalType\":\"contract IJBDirectory\",\"name\":\"directory\",\"type\":\"address\"},{\"internalType\":\"contract IJBController\",\"name\":\"controller\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InsufficientPayAmount\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InvalidTwapSlippageTolerance\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InvalidTwapWindow\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"NoProjectToken\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"denominator\",\"type\":\"uint256\"}],\"type\":\"error\",\"name\":\"PRBMath_MulDiv_Overflow\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"PoolAlreadySet\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"SpecifiedSlippageExceeded\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"T\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"UNAUTHORIZED\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"Unauthorized\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"tokenCount\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"Mint\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\",\"indexed\":true},{\"internalType\":\"address\",\"name\":\"newPool\",\"type\":\"address\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"PoolAdded\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"pool\",\"type\":\"address\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"amountOut\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"Swap\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"oldTwapTolerance\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"newTwapTolerance\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"TwapSlippageToleranceChanged\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"oldSecondsAgo\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"newSecondsAgo\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"TwapWindowChanged\",\"anonymous\":false},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"CONTROLLER\",\"outputs\":[{\"internalType\":\"contract IJBController\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"DIRECTORY\",\"outputs\":[{\"internalType\":\"contract IJBDirectory\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MAX_TWAP_SLIPPAGE_TOLERANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MAX_TWAP_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MIN_TWAP_SLIPPAGE_TOLERANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MIN_TWAP_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"PERMISSIONS\",\"outputs\":[{\"internalType\":\"contract IJBPermissions\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"PROJECTS\",\"outputs\":[{\"internalType\":\"contract IJBProjects\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"TWAP_SLIPPAGE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"UNISWAP_V3_FACTORY\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"WETH\",\"outputs\":[{\"internalType\":\"contract IWETH9\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"struct JBAfterPayRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"amount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"forwardedAmount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"projectTokenCount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"hookMetadata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"payerMetadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"payable\",\"type\":\"function\",\"name\":\"afterPayRecordedWith\"},{\"inputs\":[{\"internalType\":\"struct JBBeforePayRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"terminal\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"amount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reservedRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"beforePayRecordedWith\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"struct JBPayHookSpecification[]\",\"name\":\"hookSpecifications\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"contract IJBPayHook\",\"name\":\"hook\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}]},{\"inputs\":[{\"internalType\":\"struct JBBeforeRedeemRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"terminal\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"holder\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"redeemCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"surplus\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"bool\",\"name\":\"useTotalSurplus\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"redemptionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"beforeRedeemRecordedWith\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"struct JBRedeemHookSpecification[]\",\"name\":\"hookSpecifications\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"contract IJBRedeemHook\",\"name\":\"hook\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"hasMintPermissionFor\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"poolOf\",\"outputs\":[{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"projectTokenOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"uint32\",\"name\":\"twapWindow\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"twapSlippageTolerance\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setPoolFor\",\"outputs\":[{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"newPool\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newSlippageTolerance\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setTwapSlippageToleranceOf\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"newWindow\",\"type\":\"uint32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setTwapWindowOf\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"twapSlippageToleranceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"twapWindowOf\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}]},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"amount0Delta\",\"type\":\"int256\"},{\"internalType\":\"int256\",\"name\":\"amount1Delta\",\"type\":\"int256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"uniswapV3SwapCallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"afterPayRecordedWith((address,uint256,uint256,(address,uint8,uint32,uint256),(address,uint8,uint32,uint256),uint256,uint256,address,bytes,bytes))\":{\"details\":\"This function is only called if the minimum return from the swap exceeds the return from minting by paying the project. If the swap reverts (due to slippage, insufficient liquidity, or something else), then the hook mints the number of tokens which a payment to the project would have minted.\",\"params\":{\"context\":\"The pay context passed in by the terminal.\"}},\"beforePayRecordedWith((address,address,(address,uint8,uint32,uint256),uint256,uint256,address,uint256,uint256,bytes))\":{\"params\":{\"context\":\"Payment context passed to the data hook by `terminalStore.recordPaymentFrom(...)`. `context.metadata` can specify a Uniswap quote and specify how much of the payment should be used to swap. If `context.metadata` does not specify a quote, one will be calculated based on the TWAP. If `context.metadata` does not specify how much of the payment should be used, the hook uses the full amount paid in.\"},\"returns\":{\"hookSpecifications\":\"Specifications containing pay hooks, as well as the amount and metadata to send to them. Fulfilled by the terminal. If tokens are only being minted, `hookSpecifications` will be empty.\",\"weight\":\"The weight to use. If tokens are being minted from the project, this is the original weight. If tokens are being bought from the pool, the weight is 0. If tokens are being minted AND bought from the pool, this weight is adjusted to take both into account.\"}},\"beforeRedeemRecordedWith((address,address,uint256,uint256,uint256,uint256,(address,uint8,uint32,uint256),bool,uint256,bytes))\":{\"details\":\"Pass redeem context back to the terminal without changes.\",\"params\":{\"context\":\"The redeem context passed in by the terminal.\"}},\"constructor\":{\"params\":{\"controller\":\"The controller used to mint and burn tokens.\",\"directory\":\"The directory of terminals and controllers.\",\"factory\":\"The address of the Uniswap v3 factory. Used to calculate pool addresses.\",\"weth\":\"The WETH contract.\"}},\"setPoolFor(uint256,uint24,uint32,uint256,address)\":{\"details\":\"Uses create2 for callback auth and to allow adding pools which haven't been deployed yet. This can be called by the project's owner or an address which has the `JBPermissionIds.SET_BUYBACK_POOL` permission from the owner.\",\"params\":{\"fee\":\"The fee used in the pool being set, as a fixed-point number of basis points with 2 decimals. A 0.01% fee is `100`, a 0.05% fee is `500`, a 0.3% fee is `3000`, and a 1% fee is `10000`.\",\"projectId\":\"The ID of the project to set the pool for.\",\"terminalToken\":\"The address of the terminal token that payments to the project are made in.\",\"twapSlippageTolerance\":\"The maximum spread allowed between the amount received and the TWAP.\",\"twapWindow\":\"The period of time over which the TWAP is computed.\"},\"returns\":{\"newPool\":\"The pool that was set for the project and terminal token.\"}},\"setTwapSlippageToleranceOf(uint256,uint256)\":{\"details\":\"This can be called by the project's owner or an address with `JBPermissionIds.SET_BUYBACK_TWAP` permission from the owner.\",\"params\":{\"newSlippageTolerance\":\"The new TWAP slippage tolerance, out of `TWAP_SLIPPAGE_DENOMINATOR`.\",\"projectId\":\"The ID of the project to set the TWAP slippage tolerance of.\"}},\"setTwapWindowOf(uint256,uint32)\":{\"details\":\"This can be called by the project's owner or an address with `JBPermissionIds.SET_BUYBACK_TWAP` permission from the owner.\",\"params\":{\"newWindow\":\"The new TWAP window.\",\"projectId\":\"The ID of the project to set the TWAP window of.\"}},\"supportsInterface(bytes4)\":{\"details\":\"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.\"},\"twapSlippageToleranceOf(uint256)\":{\"details\":\"The \\\"TWAP slippage tolerance\\\" is the maximum negative spread between the TWAP and the expected return from a swap. If the expected return unfavourably exceeds the TWAP slippage tolerance, the swap will revert.\",\"params\":{\"projectId\":\"The ID of the project which the TWAP slippage tolerance applies to.\"},\"returns\":{\"_0\":\"tolerance The maximum slippage allowed relative to the TWAP, as a percent out of `TWAP_SLIPPAGE_DENOMINATOR`.\"}},\"twapWindowOf(uint256)\":{\"details\":\"The \\\"TWAP window\\\" is the period over which the TWAP is computed.\",\"params\":{\"projectId\":\"The ID of the project which the TWAP window applies to.\"},\"returns\":{\"_0\":\"secondsAgo The TWAP window in seconds.\"}},\"uniswapV3SwapCallback(int256,int256,bytes)\":{\"params\":{\"amount0Delta\":\"The amount of token 0 being used for the swap.\",\"amount1Delta\":\"The amount of token 1 being used for the swap.\",\"data\":\"Data passed in by the swap operation.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"CONTROLLER()\":{\"notice\":\"The controller used to mint and burn tokens.\"},\"DIRECTORY()\":{\"notice\":\"The directory of terminals and controllers.\"},\"MAX_TWAP_SLIPPAGE_TOLERANCE()\":{\"notice\":\"Projects cannot specify a TWAP slippage tolerance larger than this constant (out of `MAX_SLIPPAGE`).\"},\"MAX_TWAP_WINDOW()\":{\"notice\":\"Projects cannot specify a TWAP window longer than this constant.\"},\"MIN_TWAP_SLIPPAGE_TOLERANCE()\":{\"notice\":\"Projects cannot specify a TWAP slippage tolerance smaller than this constant (out of `MAX_SLIPPAGE`).\"},\"MIN_TWAP_WINDOW()\":{\"notice\":\"Projects cannot specify a TWAP window shorter than this constant.\"},\"PERMISSIONS()\":{\"notice\":\"A contract storing permissions.\"},\"PROJECTS()\":{\"notice\":\"The project registry.\"},\"TWAP_SLIPPAGE_DENOMINATOR()\":{\"notice\":\"The denominator used when calculating TWAP slippage percent values.\"},\"UNISWAP_V3_FACTORY()\":{\"notice\":\"The address of the Uniswap v3 factory. Used to calculate pool addresses.\"},\"WETH()\":{\"notice\":\"The wETH contract.\"},\"afterPayRecordedWith((address,uint256,uint256,(address,uint8,uint32,uint256),(address,uint8,uint32,uint256),uint256,uint256,address,bytes,bytes))\":{\"notice\":\"Swap the specified amount of terminal tokens for project tokens, using any leftover terminal tokens to mint from the project.\"},\"beforePayRecordedWith((address,address,(address,uint8,uint32,uint256),uint256,uint256,address,uint256,uint256,bytes))\":{\"notice\":\"The `IJBRulesetDataHook` implementation which determines whether tokens should be minted from the project or bought from the pool.\"},\"beforeRedeemRecordedWith((address,address,uint256,uint256,uint256,uint256,(address,uint8,uint32,uint256),bool,uint256,bytes))\":{\"notice\":\"To fulfill the `IJBRulesetDataHook` interface.\"},\"hasMintPermissionFor(uint256,address)\":{\"notice\":\"Required by the `IJBRulesetDataHook` interfaces. Return false to not leak any permissions.\"},\"poolOf(uint256,address)\":{\"notice\":\"The Uniswap pool where a given project's token and terminal token pair are traded.\"},\"projectTokenOf(uint256)\":{\"notice\":\"The address of each project's token.\"},\"setPoolFor(uint256,uint24,uint32,uint256,address)\":{\"notice\":\"Set the pool to use for a given project and terminal token (the default for the project's token <-> terminal token pair).\"},\"setTwapSlippageToleranceOf(uint256,uint256)\":{\"notice\":\"Set the TWAP slippage tolerance for a project. The TWAP slippage tolerance is the maximum spread allowed between the amount received and the TWAP.\"},\"setTwapWindowOf(uint256,uint32)\":{\"notice\":\"Change the TWAP window for a project. The TWAP window is the period of time over which the TWAP is computed.\"},\"twapSlippageToleranceOf(uint256)\":{\"notice\":\"Get the TWAP slippage tolerance for a given project ID.\"},\"twapWindowOf(uint256)\":{\"notice\":\"Get the TWAP window for a given project ID.\"},\"uniswapV3SwapCallback(int256,int256,bytes)\":{\"notice\":\"The Uniswap v3 pool callback where the token transfer is expected to happen.\"}},\"version\":1}},\"settings\":{\"remappings\":[\"@bananapus/=node_modules/@bananapus/\",\"@chainlink/=node_modules/@chainlink/\",\"@eth-optimism/=node_modules/@eth-optimism/\",\"@exhausted-pigeon/=node_modules/@exhausted-pigeon/\",\"@openzeppelin/=node_modules/@openzeppelin/\",\"@prb/=node_modules/@prb/\",\"@scroll-tech/=node_modules/@scroll-tech/\",\"@sphinx-labs/contracts/=node_modules/@sphinx-labs/contracts/contracts/foundry/\",\"@uniswap/=node_modules/@uniswap/\",\"base64-sol/=node_modules/base64-sol/\",\"ds-test/=lib/forge-std/lib/ds-test/src/\",\"forge-std/=lib/forge-std/src/\",\"hardhat/=node_modules/hardhat/\",\"solmate/=node_modules/solmate/\",\"sphinx/=lib/sphinx/packages/contracts/contracts/forge-std/src/\"],\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"compilationTarget\":{\"src/JBBuybackHook.sol\":\"JBBuybackHook\"},\"evmVersion\":\"paris\",\"libraries\":{}},\"sources\":{\"node_modules/@bananapus/core/src/abstract/JBPermissioned.sol\":{\"keccak256\":\"0x6486c11bff6384bfa938feb7aaacc977f457abff25b17b9aa094077d3fef71f8\",\"urls\":[\"bzz-raw://8b5190202326b6499391d5128cdb2d9ff44e91cd9ba6d8a5fe01e6f21259270d\",\"dweb:/ipfs/QmR2ufPwHtCAZYkJoyWyyag6BfdaWpaLk7VhuDc6BRLqVe\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/enums/JBApprovalStatus.sol\":{\"keccak256\":\"0x61c69b6bac7d24b566d87cda23a77e4ca9cdb87200b106aba8534cb9a0973e33\",\"urls\":[\"bzz-raw://6a9ca7249de76f77a8252eefe6bd1b63d47952f25a2acfa2c8db967cdff4470c\",\"dweb:/ipfs/QmaxSxptRQNj8bNy96EreENmrnRWdKmhyihBcxyWzBX5BN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBController.sol\":{\"keccak256\":\"0xc29d388bc66931c8f236d9e27f0414120323584258c3557f7d93be053f24bafd\",\"urls\":[\"bzz-raw://628aab4035065cd043cff54436cd21db92f7551899ff42f4ee60a4fec6839276\",\"dweb:/ipfs/QmbdSuUYQL9RYkR97hDVLZw82R7o6p2vEBpPamgqUpHiE4\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBDirectory.sol\":{\"keccak256\":\"0x9cc380844aef60078ee47a61861e55a29c4a8c947efd556ebd36e6909f7b9d62\",\"urls\":[\"bzz-raw://9f5190ec8b6683d9781ee6e9eedcc91294753242748875d4a06349077e4cbaaf\",\"dweb:/ipfs/QmTQrPuXT9TCA4txwrperMeXSGvGxP8iokUK47f62F388i\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBDirectoryAccessControl.sol\":{\"keccak256\":\"0x1e67f56849320a46f834aaa9bd62b170ff8ada7b224b4a81136193740fa0be4d\",\"urls\":[\"bzz-raw://ea8fbcec44abfe49d137bcae129b67e5479d6b17879301f88534c8a7fab00be4\",\"dweb:/ipfs/QmT6wrtYX4GRpffHUzupNwYebJ1dqkkKZLEewWsoyunsqw\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFeeTerminal.sol\":{\"keccak256\":\"0xdb6f3349cbe2078faa8421dec892136693748d8a60b70a1dee3bce2cfc5274fc\",\"urls\":[\"bzz-raw://ccc6a67fc72726c6180c41523cc2a43562864347770a86ff54532fb6ca09e7c3\",\"dweb:/ipfs/QmZinV1LoRsmTq713YGvNShaPtGaxLqwJ6u2EwwGKEKCgu\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFeelessAddresses.sol\":{\"keccak256\":\"0xe5df42cfa71c5fa41b905c122de5825df13c2aab2f9cc4cf4bafa331dd69c27e\",\"urls\":[\"bzz-raw://3773bf3b42cc57d1e4086147e52135ff1dbff4309c45ca0398f821dfaa071563\",\"dweb:/ipfs/QmXUEJssHaxYKfV33tMZGf81JTR5a5yxEVshzNus84xLuT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFundAccessLimits.sol\":{\"keccak256\":\"0xf5fd6bdd723b60d490ccbe22cdf1cfe43663d23e6ee48badcd1b71e3282cb16b\",\"urls\":[\"bzz-raw://fe692f0b843ea5fccdfcb68f4ec16e1c0add945bb74b303c9866342be0e31fbf\",\"dweb:/ipfs/QmSRmzpgp3DhNEhNDiLsSu7yEiTeywbzEFbwyGyDazjgKt\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBMultiTerminal.sol\":{\"keccak256\":\"0xc7b4f5043ec5733f5b303688f3dbf475ef5f6fe12364847a538c8b48a2137fb7\",\"urls\":[\"bzz-raw://fcd1b41a2acfd035e285e6f20f983b9b00a4e00c688a3072062dfb7f5c9c5afe\",\"dweb:/ipfs/QmYCfjakBGxWWTvb5Pk9UAeguwiWrnsNviQWMsaYz7Xq5N\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPayHook.sol\":{\"keccak256\":\"0x9438866782c652c2942f4d114e35f393cd3c8b0334abce8387eed90bca35e8b2\",\"urls\":[\"bzz-raw://cfd99daf57213f92325aad7d7d16e98476d38e870470e95ba01e3ae3cdecc95d\",\"dweb:/ipfs/QmUKKAVGf7ki8BHksr99tFcRW8APveeB5tNH63ctTbbCW8\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPayoutTerminal.sol\":{\"keccak256\":\"0xd0f9374470591c4afb2525c9c7b1bdad577765857c404b22ee5d8d2997a18fad\",\"urls\":[\"bzz-raw://4529c066b2014ee64b8fb16981a9fd5badf64dea7ac6c07dd1b1e7ab5cdc1d8a\",\"dweb:/ipfs/QmYxTdPjRAZ8iThUoNmJuivEaRaB3xXpyHdhCU7my1UHZy\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermissioned.sol\":{\"keccak256\":\"0x5b038d4dee116584e88b230920e56d48e135053e3f7e5642eaea14a775c1dad7\",\"urls\":[\"bzz-raw://19e43102f349fd4a1da1c0943ffb8f2950007fe4bb4bb7e8f74fc142575d091b\",\"dweb:/ipfs/QmXHAt4KzDTdDZgDDefEXH2WKi7NcfkJb9R7nxW5uDqsNp\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermissions.sol\":{\"keccak256\":\"0x49d2b91a866004af098a6770b28040071885b048b4b50744b12a1e5b212c5e5e\",\"urls\":[\"bzz-raw://089b4dda50be91412ffe1fbe333f78cc894f073c1a7afe469f10a2cee12fbf9e\",\"dweb:/ipfs/QmYPPBZ6HwBa1RNkNGqGcR2xgj4fnWBzrPHHoJG3kZA6AN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermitTerminal.sol\":{\"keccak256\":\"0xd6bd30842273f5b794f82219fefdd4953f5343328d2cfdb684b7d826cc0c769c\",\"urls\":[\"bzz-raw://ca1195fd5572060b36fc7e45f46d59f974e3a908248edcfadeb8cb06247075f0\",\"dweb:/ipfs/QmYTpDXKTXqi8GQFsNqB8LiGFTZjSPY3PA8vKqZBraVdqD\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPriceFeed.sol\":{\"keccak256\":\"0x4bd84c0f1a5d4729ed709bcddd43f4c50ec4a165ece79780af8dce482ed07d4a\",\"urls\":[\"bzz-raw://62bac4bfb6982fb002f620c77e5c445e62d50241a5aa64a07e51d929f5a42180\",\"dweb:/ipfs/QmWgJUDreVY2BuMX38a1iUUR5kNbMwGnKG3VvurB7oZtuM\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPrices.sol\":{\"keccak256\":\"0xa4988a8984774e9f9d355236e3c4ab67868503964747684d989ceb54a4176361\",\"urls\":[\"bzz-raw://7496393b49f8a594e6bc3393ffab118e4dc95f69233c77046cd552b1c52a533a\",\"dweb:/ipfs/QmavDESpty7XFmLgWKMHb3venZVPGwwKevWmYStM2mxcPH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBProjectUriRegistry.sol\":{\"keccak256\":\"0x2799475228987e4f8334ac33d3935f759c9b8133db7383b4f622dde7a5dc0502\",\"urls\":[\"bzz-raw://d751731740f45df74eea48c9667e847ee2cddb2980ab4939c86bd17e6c6ed89b\",\"dweb:/ipfs/QmXW8SLTuhdUpfn7pRpdsYdcyuim8RTyagU37ULcj5UZhT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBProjects.sol\":{\"keccak256\":\"0x735c2fb8f1fa827f054ee77f7a0ae4b312656217acb75b624d2c8fd9dc40151b\",\"urls\":[\"bzz-raw://ee7fc92299a8633a80693ae63ab494dcd125f1789487a54a39dc0e5696e5996f\",\"dweb:/ipfs/QmX7YJD4pS2XhgQb7p3JbBAXynT7YGPXcZe92BiWWRrsCL\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRedeemHook.sol\":{\"keccak256\":\"0x8ab46fcd7d0e739661eb76056ad93ff99106f38420ef0b4eb97fa9f4bb71a68a\",\"urls\":[\"bzz-raw://0ef96fcb7ad26281d444d8e0c677b25114fdd63b1c172d477e030dce8ba53b62\",\"dweb:/ipfs/Qmcx1jRQuwU4pZFuLxsSsx4oMbRaDfktHrPnXextgbWc5m\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRedeemTerminal.sol\":{\"keccak256\":\"0xd1b4aa38154e08f1474745ea6bc8f8823fe8aa68c124d596742597f2296ea16d\",\"urls\":[\"bzz-raw://9bd254e833702dfe5e28db5fee76478947ab45b501c966501f719e73bbf0397a\",\"dweb:/ipfs/QmZ3Ng7TmVxL6ozSUhx4kYdQdZhoYi4t43cYZVAMz7Fn5M\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesetApprovalHook.sol\":{\"keccak256\":\"0x592e95d159494421c6b1bcb362d0cee1df0132921697351304e9cd7af4fbd386\",\"urls\":[\"bzz-raw://5bebfd5fa67c1b6ea16fa2e76e9520e9dfe52a579f48dd94d0c2ec45f78ad178\",\"dweb:/ipfs/QmRUawEGtfYoYSHmHELGhvJoWuMsxLPKtqAXgsrb7fJboP\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesetDataHook.sol\":{\"keccak256\":\"0x13b4b9f4b847f62442da1c1a59b399f8f201b31a28edb96aa5a8a78ad57c24d0\",\"urls\":[\"bzz-raw://4fcd00b77d0f40cf6d5ee6590b6ef4ee1f606e89ae4c4faed3710fb462108f8e\",\"dweb:/ipfs/QmeoE54DQ3eGw9EDXfN7aTMmEjubAtirahmytDijo6GSeE\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesets.sol\":{\"keccak256\":\"0x011d86a1ea51aed45ee83ce7b289e7abd231074ce1a12e53faa194811d5334c0\",\"urls\":[\"bzz-raw://c7d03e746e28f6d381c4a81e1b7599f01b84fa52e97106105f7a402f689b6395\",\"dweb:/ipfs/QmT7nWeCGnPaBQuCKFpmoZNiXzkCWCVLZJJAf9i4D6xNJg\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBSplitHook.sol\":{\"keccak256\":\"0xeb8dfac7a4b81897a1c3b5d0d853a406bcff33720fb187d5ca5bb3dcc0ba3a12\",\"urls\":[\"bzz-raw://36aaeef6107cfe5b0127e063ea215aac7200f8af02e28a48e61111abd3254688\",\"dweb:/ipfs/QmQ8yQANXnhQCAWBGKsKCDsJ3A8hnTKNg5tyo79GfWXTcV\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBSplits.sol\":{\"keccak256\":\"0xd8894cfc55560d914f413e40c981165e1e9dc845b35cdf0ecd13fd118733a483\",\"urls\":[\"bzz-raw://e03b8e5e34c924a91884e3ef79ea039292f8927241698db84a09a463ced4cc52\",\"dweb:/ipfs/QmSqhVX2LSStR7xEcc96zAiQpTPDSsZBn8YvH33CtiU1FN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTerminal.sol\":{\"keccak256\":\"0x8981b96902125707c49c63867b718118fdfb04cb8fd42b038d93ef87ea56f85c\",\"urls\":[\"bzz-raw://7b172c6924a10431652eab136758953a51af8d709a55afff1533d13e687be60c\",\"dweb:/ipfs/QmWczAk48Jw8qNgrUn4EFRK25CrmCp7MmEaJsGtTXueaEb\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTerminalStore.sol\":{\"keccak256\":\"0x140159d66d729f6aeed0fe1f7c655619985146ec00e8c68cbd9b5d30d4dc7d23\",\"urls\":[\"bzz-raw://f972ecb52bcfcd2852c9e7264b1ecc504ce94bd6e12c034b93c1768cd372954e\",\"dweb:/ipfs/QmRu7in5iJSWHLTcFPbJmiK1rCHFbwNY7qzY4cG6kgfYcr\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBToken.sol\":{\"keccak256\":\"0x71b1f9c3a0edd41910f77396e0be2c65596571176d53eb87e887c3c0da56c0fb\",\"urls\":[\"bzz-raw://6e956f0582f4525e83d845ee9b4a89959abc4f821414f6accbbee5b38960482d\",\"dweb:/ipfs/QmbSvjgmCgnfVmcCTGu8XwrV1Rufsf3M8hB8unFq6fTMdH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTokenUriResolver.sol\":{\"keccak256\":\"0xfa5cb00dcd6085d1ef912d071fe73c63f9478a2cd0f9d8bddaf659b6af2d0967\",\"urls\":[\"bzz-raw://282e4e7c342d65f77cde0e9a08fcaf20ef5cf379c7a48b639842c0ffd0b2afb8\",\"dweb:/ipfs/QmbnN3PEQeZaXdPLT75V1J79kMg7KqSMru37RHrL3z8Yf2\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTokens.sol\":{\"keccak256\":\"0x6fd67af915dd541d9547c8297aa9ae269690e4ee23531db43f021bcacec6076f\",\"urls\":[\"bzz-raw://2e5e11954e9ab2319fffccb6563f3db400b8f7760d4ffe2165048a02c9c37fa6\",\"dweb:/ipfs/QmbDXtV83dK8EfiTjsTRf55R2XqPZzDKcjtYbW8sxQ5CFm\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/libraries/JBConstants.sol\":{\"keccak256\":\"0xf7994eb0ab6979633ad42bf274f7679dcfcc81e0a35fe931d35b663ba6cb808f\",\"urls\":[\"bzz-raw://b6caec5469c07153fc7b9d6f2e1370e3da4e6386829a1fe99e02526464754610\",\"dweb:/ipfs/QmRXsoUc1FzxFHLvNQvxjZMRaiovdeTskcA5XZz4AEVGdq\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/libraries/JBMetadataResolver.sol\":{\"keccak256\":\"0xdf32038c5e7f65725e2ef87d09fe04972d7da6a63b60c066d4616b2c2ada5149\",\"urls\":[\"bzz-raw://50582c41ee196ead31d13dcc5a468436d524891d7873743ba92d1d64a0b5783a\",\"dweb:/ipfs/QmPiJMbA1oQnVKQTjqYvUvtWaaiFCeKic8NJtu2crrAznW\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAccountingContext.sol\":{\"keccak256\":\"0x9c47e048a719f784f601df69a583505432217b9868a0244876d277f84dd1ebdf\",\"urls\":[\"bzz-raw://8565f194b87914da9a02af2e760ae2ed2a9d185c6f11229f7035140776d2fec9\",\"dweb:/ipfs/QmPs2fic8W3F5e5zNRwmGmJFjb3JWGPWJ3YUe5o82nQgEn\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAfterPayRecordedContext.sol\":{\"keccak256\":\"0xd26c3a774ff38be79064085970454fe2603a23a638c76270d5b1b3829206c3e8\",\"urls\":[\"bzz-raw://3b55dbe3bf1ef625b7ca04efab3de35406e6041d5b3d82c7265469c500e2b702\",\"dweb:/ipfs/QmUdBDo4Lt3mcsFcsXT2mqq3czFwZjQJFPLM89YA2VtD7k\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAfterRedeemRecordedContext.sol\":{\"keccak256\":\"0x521f5d23a36f0da72362cd84890cc867bd83baa8dc836ba6c5066d51dba2f163\",\"urls\":[\"bzz-raw://6cc461313286dde62d045d6288e87bae5032e035796326f5b1ed6218e58aa9da\",\"dweb:/ipfs/QmQS2AkQwf2ANQieDuaUnpJEdXChoLv4CCbZqHkfywYPSR\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBBeforePayRecordedContext.sol\":{\"keccak256\":\"0x5b04e814da83c7e83ff892ab07eaad6abce6f7b85a75f8da9380e9fc3470bc81\",\"urls\":[\"bzz-raw://11c889aab993fce3e3cc2dedc15fc30dd367e7fef9b7b1bfd6a6a9f248781731\",\"dweb:/ipfs/QmVVtydCD1azeWhGLxA1hthxfLyKzMHZ1eVzCz3a3R5dLy\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBBeforeRedeemRecordedContext.sol\":{\"keccak256\":\"0x73eadaf6827e82f6ccbe3a1e2b2b7fc6c59cef471f73335041b30ddcc000989d\",\"urls\":[\"bzz-raw://2f3ee84662eed565dbdaed406ef836fffaf55cccd417575578152e5085d0b1f2\",\"dweb:/ipfs/QmaJGFS7hxJsiUdKvbv5BKhSwceDEzKBnt7t5YeNWvYgMK\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBCurrencyAmount.sol\":{\"keccak256\":\"0x7f321bbcbd13abfbc8f0d08a5adaaf8ef312db5bb899012fcffb6170fbb962a9\",\"urls\":[\"bzz-raw://bf9301ef1dbb3abda7b492585377617508ba048c6170f21a5e7d2b3c034eb384\",\"dweb:/ipfs/QmcetEFxSYLLNSZzPBpNn3Fc8sFcrFE8A8h12ZSj2tLgxD\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBFee.sol\":{\"keccak256\":\"0xffacd6dcce11a5cdd54aba7a5d8f9b28b9b36b87771dea746a117b616519bbd0\",\"urls\":[\"bzz-raw://c278d6efa1dd694c8aceba43b2cb3f2b49a52d9b15fc23089def526e4ba23778\",\"dweb:/ipfs/QmVHEGGAfsUVE791aGeYZBiymU6aJ278PoGmH9SRLY1U4N\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBFundAccessLimitGroup.sol\":{\"keccak256\":\"0x9fdaa8d017b72da25f583700a444a86849df053f7fb8eac874ec5139bcf651e5\",\"urls\":[\"bzz-raw://c8e44c49ee444a98424a0dbeb6897a76a0bf00d88a613f62ac2012afdac754ee\",\"dweb:/ipfs/QmdYkAiRi5bXM1YYNkc7BiqimHSFodMGn1cjHR5hcpm4xH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBPayHookSpecification.sol\":{\"keccak256\":\"0x955f0bfca97300b9e5927dc181753830ee362f83fa9ca32a90daade32aa0cfd5\",\"urls\":[\"bzz-raw://f517af1597c7c40f8d3da53f7a6684a3e162950a16559d6bf6ea3b727bb11546\",\"dweb:/ipfs/QmRWo2ZTYXmVZTzNJDYhsJNsEaHphjpUfx9eNz2cciyz86\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBPermissionsData.sol\":{\"keccak256\":\"0xd5a5fe65b1deb40b5cd9c8e05bc1352d0e95f3a18b4986fab7abdc621beb19c7\",\"urls\":[\"bzz-raw://a6141eaa414d3d61de671ae3584b87e98044bf6392cb94d2acd1bb5cc7c19db4\",\"dweb:/ipfs/QmbtvALmburKLRC5fHXscoeZii1N2qQrJAdqarfvSKaKEk\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRedeemHookSpecification.sol\":{\"keccak256\":\"0x673d16ee1a91bf8de3b37e57284e60451b70a9c2d748c9cdc7a151f5624af18f\",\"urls\":[\"bzz-raw://ceeb5e81effa0f076c5630c756dfcf1548d09f822b255a0a6ee01e54de8c8ae2\",\"dweb:/ipfs/QmSMoMNPRhPMnuJNvWa6S59XRfycGz9o2ApNp63bUW6TdX\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRuleset.sol\":{\"keccak256\":\"0xa40e937554418f9cc5949200ee64a434ece55b8e67f35d3c4c47a3dfbadaebbf\",\"urls\":[\"bzz-raw://87e1fb1b1c9ed2fe1948251ba5f839a33bb50ff5a1a6ef292aae6bbbeeb5f619\",\"dweb:/ipfs/QmUWTJPxqeHfciYT2kobif55CJLQaMHYtZFGju6LyWbv9D\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetConfig.sol\":{\"keccak256\":\"0x3d14de125bd1e4fa9dc3e20937fcc2aa666e0b9cfb63ff520189c5d27fea594a\",\"urls\":[\"bzz-raw://2c4a164ce0f4fce85e1c1d62be3497cd5d411c763d9582aad19901e9fb3c6c44\",\"dweb:/ipfs/QmXiCaWQD7NVMxE7JjuoXAEaFwKDSZtbf2beSh8mDiE1PN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetMetadata.sol\":{\"keccak256\":\"0xa19eb9f4c543da1d204589355040f68528dac2e021571a887b8a46397290786c\",\"urls\":[\"bzz-raw://edf57813fb0325d908a3cf67e6ddc3c894186591a4c13c496421928366bb359c\",\"dweb:/ipfs/QmP27aqG3ofA9Mzmk9JUp9gnSfuVfZfBWDv69jJWqeZm3F\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetWithMetadata.sol\":{\"keccak256\":\"0x1bcfadf20488f6df65227f8d4d0fbf9b7539456a2389567f7fe3900d23289bc3\",\"urls\":[\"bzz-raw://0a15c399a71e5373f8c0484c6d6b83521eda31e063a2c53e4c5cec4e74550343\",\"dweb:/ipfs/QmQwi8zkjoTVXbK89NeETYimWCacTrNsesJdpLSvGdqMPX\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplit.sol\":{\"keccak256\":\"0x0e1351e80cf9967caee90094712a4fc884a83f07df23a844d8cb33ebcd00721e\",\"urls\":[\"bzz-raw://19d5793c08834f2ec1d6942bd43d05042b0ecc351a57235d748a8f2ff74b6638\",\"dweb:/ipfs/QmUWjyNg7x62KsvMwAzNdpmwqCo5qK5ip9pLdshj9B2Kbf\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplitGroup.sol\":{\"keccak256\":\"0x8dc98fa9e730bee8bcc0a8acf1bc4db1c9b0edf307d969c9c9caa4d6b8d856d9\",\"urls\":[\"bzz-raw://66f4306e0e69c82033927952564fd617e7c4b29aa8b165d5b53a0ebe3109ea12\",\"dweb:/ipfs/QmQqN1u7FHAdEtEZNRcKvZwYtXEQVQnLd6FMzHESP7wDtx\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplitHookContext.sol\":{\"keccak256\":\"0x1cef82bf434f91d518092ea7e57db4a72ce7654f48a7db9bf44882900b6b6623\",\"urls\":[\"bzz-raw://cc5012008ab7e74cf766fe1c202a23e3a73365356bcf1e0b04ec01baf21b204b\",\"dweb:/ipfs/QmSwJvd6Yrg9XZMhjquBcak5sfUswbR5nPEuJBfpjM54VT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBTerminalConfig.sol\":{\"keccak256\":\"0x2da40b8ae2b6a6038da0ac17d3ccf083a8fb54ea12684242342e53811cca997c\",\"urls\":[\"bzz-raw://9ddb66e9f90ce3005bb1fedd06ec66e6d3e99c52afaf729cee0a23ae01b21fab\",\"dweb:/ipfs/QmPTD9ciAZqj5WWuE5W4Ufs1kBvVokntrfSdUcV6Egh7eQ\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBTokenAmount.sol\":{\"keccak256\":\"0xc61593d33d5ec30e695d382948a1b944d01e29a8f2bfd29f75ecebcdbc7816de\",\"urls\":[\"bzz-raw://8992c1e5fca0c2342ecc0e734dfba6a2a752e4c29184784931d0971e44305051\",\"dweb:/ipfs/QmYNcaW3qeCkgAExUaFTq238fgfJuoYCTwjCn7jm94U4dJ\"],\"license\":\"MIT\"},\"node_modules/@bananapus/permission-ids/src/JBPermissionIds.sol\":{\"keccak256\":\"0x1bd511f9cc46d134ab4743dba50ee25b1c67b5b5e30a27cbfebb1c3fcfedc876\",\"urls\":[\"bzz-raw://6d81d52f481c89832c9c61fa4ea513196c6c8182878d1fbef2038ca39a909192\",\"dweb:/ipfs/QmbaRR5ZXF9PRJwEGbwoAydQiYUoQLYiej7CVmHHbFG29z\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0xce41876e78d1badc0512229b4d14e4daf83bc1003d7f83978d18e0e56f965b9c\",\"urls\":[\"bzz-raw://a2608291cb038b388d80b79a06b6118a42f7894ff67b7da10ec0dbbf5b2973ba\",\"dweb:/ipfs/QmWohqcBLbcxmA4eGPhZDXe5RYMMEEpFq22nfkaUMvTfw1\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"urls\":[\"bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c\",\"dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"],\"license\":\"MIT\"},\"node_modules/@prb/math/src/Common.sol\":{\"keccak256\":\"0xaa374e2c26cc93e8c22a6953804ee05f811597ef5fa82f76824378b22944778b\",\"urls\":[\"bzz-raw://279c732e161d623cf4d8a9519ca4c42c0c2db99842d0eb2a20c10fde3fa722c9\",\"dweb:/ipfs/QmVViuUXbinQGqtG5M21SgVzKihiCbFUChd4tDhtvwRmxH\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IAllowanceTransfer.sol\":{\"keccak256\":\"0x37f0ac203b6ef605c9533e1a739477e8e9dcea90710b40e645a367f8a21ace29\",\"urls\":[\"bzz-raw://e0104d72aeaec1cd66cc232e7de7b7ead08608efcc179491b8a66387614670b0\",\"dweb:/ipfs/QmfAZDyuNC9FXXbnJUwqHNwmAK6uRrXxtWEytLsxjskPsN\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IEIP712.sol\":{\"keccak256\":\"0xfdccf2b9639070803cd0e4198427fb0df3cc452ca59bd3b8a0d957a9a4254138\",\"urls\":[\"bzz-raw://f7c936ac42ce89e827db905a1544397f8bdf46db34cdb6aa1b90dea42fdb4c72\",\"dweb:/ipfs/QmVgurxo1N31qZqkPBirw9Z7S9tLYmv6jSwQp8R8ur2cBk\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IPermit2.sol\":{\"keccak256\":\"0xaa631cc9f53e699301d94233007110a345e6779011def484e8dd97b8fe0af771\",\"urls\":[\"bzz-raw://fc0502cf19c9c18f320a3001201e89e350393b75837f6b7971de18b2de06f30d\",\"dweb:/ipfs/QmT9SfhdJ7VJNNrf94g4H5usyi7ShqWGx7Cqsz9jZTjX96\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/ISignatureTransfer.sol\":{\"keccak256\":\"0xe6df9966f8841dc3958ee86169c89de97e7f614c81c28b9dc947b12d732df64e\",\"urls\":[\"bzz-raw://3d4eafdee7f48c3be8350a94eb6edd0bfb2af2c105df65787a77174f356c0317\",\"dweb:/ipfs/QmY1j2adeeAhNpn6cUuthemxGCdLXHTfyMh9yTKsY4mZ2d\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol\":{\"keccak256\":\"0x4e64844c56061cd90e0a80de73534a9166704c43eed579eb83f90bc2780ce968\",\"urls\":[\"bzz-raw://cba4fab5cebdddf644b901994a7f0f52b98885d4c56012f4dc51d52c2bf9de0e\",\"dweb:/ipfs/QmVyyrRmqXrAiapewWunRVgiPVFJHpH2hKiE1py1svMSNV\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol\":{\"keccak256\":\"0x3f485fb1a44e8fbeadefb5da07d66edab3cfe809f0ac4074b1e54e3eb3c4cf69\",\"urls\":[\"bzz-raw://095ce0626b41318c772b3ebf19d548282607f6a8f3d6c41c13edfbd5370c8652\",\"dweb:/ipfs/QmVDZfJJ89UUCE1hMyzqpkZAtQ8jUsBgZNE5AMRG7RzRFS\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions.sol\":{\"keccak256\":\"0x9453dd0e7442188667d01d9b65de3f1e14e9511ff3e303179a15f6fc267f7634\",\"urls\":[\"bzz-raw://982f4328f956c3e60e67501e759eb292ac487f76460c774c50e9ae4fcc92aae5\",\"dweb:/ipfs/QmRnzEDsaqtd9PJEVcgQi7p5aV5pMSvRUoGZJAdwFUJxgZ\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState.sol\":{\"keccak256\":\"0xe603ac5b17ecdee73ba2b27efdf386c257a19c14206e87eee77e2017b742d9e5\",\"urls\":[\"bzz-raw://8febc9bdb399a4d94bb89f5377732652e2400e4a8dee808201ade6848f9004e7\",\"dweb:/ipfs/QmaKDqYYFU4d2W2iN77aDHptfbFmYZRrMYXHeGpJmM8C1c\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolErrors.sol\":{\"keccak256\":\"0xf80abf13fb1fafc127ba4e792f240dd8ea7c8c893978cdfd8439c27fae9a037b\",\"urls\":[\"bzz-raw://b04fc72a656bbf3631e9c2e67b9870a2d9d235185e833fe050e9606e6816a9aa\",\"dweb:/ipfs/QmUcz4bkEkJ9pwzFu1C3n97hBQ3st9U6qTAqCdyFwddKco\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents.sol\":{\"keccak256\":\"0x8071514d0fe5d17d6fbd31c191cdfb703031c24e0ece3621d88ab10e871375cd\",\"urls\":[\"bzz-raw://d0b571930cc7488b1d546a7e9cea7c52d8b3c4e207da657ed0e0db7343b8cd03\",\"dweb:/ipfs/QmaGK6vVwB95QSTR1XMYvrh7ivYAYZxi3fD7v6VMA4jZ39\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables.sol\":{\"keccak256\":\"0xf6e5d2cd1139c4c276bdbc8e1d2b256e456c866a91f1b868da265c6d2685c3f7\",\"urls\":[\"bzz-raw://b99c8c9ae8e27ee6559e5866bea82cbc9ffc8247f8d15b7422a4deb287d4d047\",\"dweb:/ipfs/QmfL8gaqt3ffAnm6nVj5ksuNpLygXuL3xq5VBqrkwC2JJ3\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions.sol\":{\"keccak256\":\"0x759b78a2918af9e99e246dc3af084f654e48ef32bb4e4cb8a966aa3dcaece235\",\"urls\":[\"bzz-raw://64144fb96e1c7fdba87305acadb98a198d26a3d46c097cb3a666e567f6f29735\",\"dweb:/ipfs/QmUnWVwN9FKB9uV5Pr8YfLpWZnYM2DENnRMaadZ492JS9u\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.sol\":{\"keccak256\":\"0x44fa2ce1182f6c2f6bead3d1737804bf7e112252ae86e0f2e92f9b8249603f43\",\"urls\":[\"bzz-raw://54154e8665b98d65f5dc91b256551852cb47882180b501b260657122d207c0ea\",\"dweb:/ipfs/QmcfemK1A2PXYrWB5SBFGERpMCderbFRb8BtTzQDj1sUBp\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/libraries/FullMath.sol\":{\"keccak256\":\"0x7825565a4bb2a34a1dc96bbfead755785dfb0df8ef81bd934c43023689685645\",\"urls\":[\"bzz-raw://8f44f4614d31e3d4864c7eb13620555253b84f6a69180f8745b7c6e246a9d125\",\"dweb:/ipfs/QmfNQUcXj3KL8h9u5PqbtEC6yRtwDbKNb48uMPjdwxsKnd\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v3-core/contracts/libraries/TickMath.sol\":{\"keccak256\":\"0x5c57de03a91cc2ec8939865dbbcb0197bb6c353b711075eefd8e0fca5e102129\",\"urls\":[\"bzz-raw://1e994c24fd891ef8a3f5dbf5eba42b34feaf05e0376a29f91322faa18054449c\",\"dweb:/ipfs/QmNdUJGUQxd1dPkMbnA5f5UNqakxRkQE5r7bTZJAuHeapS\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-periphery/contracts/libraries/OracleLibrary.sol\":{\"keccak256\":\"0xe313f89c69c0f1c91f0722868313b4ceb14479b3e7a0abf52a1b9bbd9c18e81b\",\"urls\":[\"bzz-raw://8ad09b061f3f533c116618c20cf01510108eebebb7ff8847b0f245b8ba368d53\",\"dweb:/ipfs/QmU6vdi5JjJfjK2KqonWvRg9NeuQWarj4B1YFN22Dh9VJM\"],\"license\":\"GPL-2.0-or-later\"},\"src/JBBuybackHook.sol\":{\"keccak256\":\"0x853030183c6b3b1cde459af63eef64091af5807a0475a9ef8e1c1bd79db72da8\",\"urls\":[\"bzz-raw://8173a685a0ad9b79745c0af675c52432a61431655f271f68b2493a284b23826e\",\"dweb:/ipfs/QmSkiaYnV7hsiqXrew6WYxu3SwWKCv5wg6mCGsAk3ARrhP\"],\"license\":\"MIT\"},\"src/interfaces/IJBBuybackHook.sol\":{\"keccak256\":\"0xbe5d7f3bf2e18b569676ba9194e248e6b1ed50022f5247b4f1fa124c91bfd418\",\"urls\":[\"bzz-raw://eb221d1570e8aad409c419b6a2f84351e818c3527f3f44b806cd64c84d7a8c86\",\"dweb:/ipfs/QmUPZstaKjPN7VTywg3Mt6bF75E53mQbmXhf3TxCggJbRR\"],\"license\":\"MIT\"},\"src/interfaces/external/IWETH9.sol\":{\"keccak256\":\"0x50083bcaca6c1a8d12c79116fab4f6d8cd452a510cb3f00c4a8bc3a54678efb7\",\"urls\":[\"bzz-raw://726f187112d0953c14bff8099a8c9ce1ead47eb25e90839f77b100feaaf16127\",\"dweb:/ipfs/QmTEnMENpLjcTQLMwz4kEUiQHfiTkaZT3TL37nQ8JiRYh5\"],\"license\":\"GPL-2.0-or-later\"}},\"version\":1}", + "metadata": "{\"compiler\":{\"version\":\"0.8.23+commit.f704f362\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IWETH9\",\"name\":\"weth\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"internalType\":\"contract IJBDirectory\",\"name\":\"directory\",\"type\":\"address\"},{\"internalType\":\"contract IJBController\",\"name\":\"controller\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InsufficientPayAmount\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InvalidTwapSlippageTolerance\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InvalidTwapWindow\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"NoProjectToken\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"denominator\",\"type\":\"uint256\"}],\"type\":\"error\",\"name\":\"PRBMath_MulDiv_Overflow\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"PoolAlreadySet\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"SpecifiedSlippageExceeded\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"T\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"UNAUTHORIZED\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"Unauthorized\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"tokenCount\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"Mint\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\",\"indexed\":true},{\"internalType\":\"address\",\"name\":\"newPool\",\"type\":\"address\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"PoolAdded\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"pool\",\"type\":\"address\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"amountOut\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"Swap\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"oldTwapTolerance\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"newTwapTolerance\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"TwapSlippageToleranceChanged\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"oldSecondsAgo\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"newSecondsAgo\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"TwapWindowChanged\",\"anonymous\":false},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"CONTROLLER\",\"outputs\":[{\"internalType\":\"contract IJBController\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"DIRECTORY\",\"outputs\":[{\"internalType\":\"contract IJBDirectory\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MAX_TWAP_SLIPPAGE_TOLERANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MAX_TWAP_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MIN_TWAP_SLIPPAGE_TOLERANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MIN_TWAP_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"PERMISSIONS\",\"outputs\":[{\"internalType\":\"contract IJBPermissions\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"PROJECTS\",\"outputs\":[{\"internalType\":\"contract IJBProjects\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"TWAP_SLIPPAGE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"UNISWAP_V3_FACTORY\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"WETH\",\"outputs\":[{\"internalType\":\"contract IWETH9\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"struct JBAfterPayRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"amount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"forwardedAmount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"projectTokenCount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"hookMetadata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"payerMetadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"payable\",\"type\":\"function\",\"name\":\"afterPayRecordedWith\"},{\"inputs\":[{\"internalType\":\"struct JBBeforePayRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"terminal\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"amount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reservedPercent\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"beforePayRecordedWith\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"struct JBPayHookSpecification[]\",\"name\":\"hookSpecifications\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"contract IJBPayHook\",\"name\":\"hook\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}]},{\"inputs\":[{\"internalType\":\"struct JBBeforeRedeemRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"terminal\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"holder\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"redeemCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"surplus\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"bool\",\"name\":\"useTotalSurplus\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"redemptionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"beforeRedeemRecordedWith\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"struct JBRedeemHookSpecification[]\",\"name\":\"hookSpecifications\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"contract IJBRedeemHook\",\"name\":\"hook\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"hasMintPermissionFor\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"poolOf\",\"outputs\":[{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"projectTokenOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"uint32\",\"name\":\"twapWindow\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"twapSlippageTolerance\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setPoolFor\",\"outputs\":[{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"newPool\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newSlippageTolerance\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setTwapSlippageToleranceOf\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"newWindow\",\"type\":\"uint32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setTwapWindowOf\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"twapSlippageToleranceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"twapWindowOf\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}]},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"amount0Delta\",\"type\":\"int256\"},{\"internalType\":\"int256\",\"name\":\"amount1Delta\",\"type\":\"int256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"uniswapV3SwapCallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"afterPayRecordedWith((address,uint256,uint256,(address,uint8,uint32,uint256),(address,uint8,uint32,uint256),uint256,uint256,address,bytes,bytes))\":{\"details\":\"This function is only called if the minimum return from the swap exceeds the return from minting by paying the project. If the swap reverts (due to slippage, insufficient liquidity, or something else), then the hook mints the number of tokens which a payment to the project would have minted.\",\"params\":{\"context\":\"The pay context passed in by the terminal.\"}},\"beforePayRecordedWith((address,address,(address,uint8,uint32,uint256),uint256,uint256,address,uint256,uint256,bytes))\":{\"params\":{\"context\":\"Payment context passed to the data hook by `terminalStore.recordPaymentFrom(...)`. `context.metadata` can specify a Uniswap quote and specify how much of the payment should be used to swap. If `context.metadata` does not specify a quote, one will be calculated based on the TWAP. If `context.metadata` does not specify how much of the payment should be used, the hook uses the full amount paid in.\"},\"returns\":{\"hookSpecifications\":\"Specifications containing pay hooks, as well as the amount and metadata to send to them. Fulfilled by the terminal. If tokens are only being minted, `hookSpecifications` will be empty.\",\"weight\":\"The weight to use. If tokens are being minted from the project, this is the original weight. If tokens are being bought from the pool, the weight is 0. If tokens are being minted AND bought from the pool, this weight is adjusted to take both into account.\"}},\"beforeRedeemRecordedWith((address,address,uint256,uint256,uint256,uint256,(address,uint8,uint32,uint256),bool,uint256,bytes))\":{\"details\":\"Pass redeem context back to the terminal without changes.\",\"params\":{\"context\":\"The redeem context passed in by the terminal.\"}},\"constructor\":{\"params\":{\"controller\":\"The controller used to mint and burn tokens.\",\"directory\":\"The directory of terminals and controllers.\",\"factory\":\"The address of the Uniswap v3 factory. Used to calculate pool addresses.\",\"weth\":\"The WETH contract.\"}},\"setPoolFor(uint256,uint24,uint32,uint256,address)\":{\"details\":\"Uses create2 for callback auth and to allow adding pools which haven't been deployed yet. This can be called by the project's owner or an address which has the `JBPermissionIds.SET_BUYBACK_POOL` permission from the owner.\",\"params\":{\"fee\":\"The fee used in the pool being set, as a fixed-point number of basis points with 2 decimals. A 0.01% fee is `100`, a 0.05% fee is `500`, a 0.3% fee is `3000`, and a 1% fee is `10000`.\",\"projectId\":\"The ID of the project to set the pool for.\",\"terminalToken\":\"The address of the terminal token that payments to the project are made in.\",\"twapSlippageTolerance\":\"The maximum spread allowed between the amount received and the TWAP.\",\"twapWindow\":\"The period of time over which the TWAP is computed.\"},\"returns\":{\"newPool\":\"The pool that was set for the project and terminal token.\"}},\"setTwapSlippageToleranceOf(uint256,uint256)\":{\"details\":\"This can be called by the project's owner or an address with `JBPermissionIds.SET_BUYBACK_TWAP` permission from the owner.\",\"params\":{\"newSlippageTolerance\":\"The new TWAP slippage tolerance, out of `TWAP_SLIPPAGE_DENOMINATOR`.\",\"projectId\":\"The ID of the project to set the TWAP slippage tolerance of.\"}},\"setTwapWindowOf(uint256,uint32)\":{\"details\":\"This can be called by the project's owner or an address with `JBPermissionIds.SET_BUYBACK_TWAP` permission from the owner.\",\"params\":{\"newWindow\":\"The new TWAP window.\",\"projectId\":\"The ID of the project to set the TWAP window of.\"}},\"supportsInterface(bytes4)\":{\"details\":\"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.\"},\"twapSlippageToleranceOf(uint256)\":{\"details\":\"The \\\"TWAP slippage tolerance\\\" is the maximum negative spread between the TWAP and the expected return from a swap. If the expected return unfavourably exceeds the TWAP slippage tolerance, the swap will revert.\",\"params\":{\"projectId\":\"The ID of the project which the TWAP slippage tolerance applies to.\"},\"returns\":{\"_0\":\"tolerance The maximum slippage allowed relative to the TWAP, as a percent out of `TWAP_SLIPPAGE_DENOMINATOR`.\"}},\"twapWindowOf(uint256)\":{\"details\":\"The \\\"TWAP window\\\" is the period over which the TWAP is computed.\",\"params\":{\"projectId\":\"The ID of the project which the TWAP window applies to.\"},\"returns\":{\"_0\":\"secondsAgo The TWAP window in seconds.\"}},\"uniswapV3SwapCallback(int256,int256,bytes)\":{\"params\":{\"amount0Delta\":\"The amount of token 0 being used for the swap.\",\"amount1Delta\":\"The amount of token 1 being used for the swap.\",\"data\":\"Data passed in by the swap operation.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"CONTROLLER()\":{\"notice\":\"The controller used to mint and burn tokens.\"},\"DIRECTORY()\":{\"notice\":\"The directory of terminals and controllers.\"},\"MAX_TWAP_SLIPPAGE_TOLERANCE()\":{\"notice\":\"Projects cannot specify a TWAP slippage tolerance larger than this constant (out of `MAX_SLIPPAGE`).\"},\"MAX_TWAP_WINDOW()\":{\"notice\":\"Projects cannot specify a TWAP window longer than this constant.\"},\"MIN_TWAP_SLIPPAGE_TOLERANCE()\":{\"notice\":\"Projects cannot specify a TWAP slippage tolerance smaller than this constant (out of `MAX_SLIPPAGE`).\"},\"MIN_TWAP_WINDOW()\":{\"notice\":\"Projects cannot specify a TWAP window shorter than this constant.\"},\"PERMISSIONS()\":{\"notice\":\"A contract storing permissions.\"},\"PROJECTS()\":{\"notice\":\"The project registry.\"},\"TWAP_SLIPPAGE_DENOMINATOR()\":{\"notice\":\"The denominator used when calculating TWAP slippage percent values.\"},\"UNISWAP_V3_FACTORY()\":{\"notice\":\"The address of the Uniswap v3 factory. Used to calculate pool addresses.\"},\"WETH()\":{\"notice\":\"The wETH contract.\"},\"afterPayRecordedWith((address,uint256,uint256,(address,uint8,uint32,uint256),(address,uint8,uint32,uint256),uint256,uint256,address,bytes,bytes))\":{\"notice\":\"Swap the specified amount of terminal tokens for project tokens, using any leftover terminal tokens to mint from the project.\"},\"beforePayRecordedWith((address,address,(address,uint8,uint32,uint256),uint256,uint256,address,uint256,uint256,bytes))\":{\"notice\":\"The `IJBRulesetDataHook` implementation which determines whether tokens should be minted from the project or bought from the pool.\"},\"beforeRedeemRecordedWith((address,address,uint256,uint256,uint256,uint256,(address,uint8,uint32,uint256),bool,uint256,bytes))\":{\"notice\":\"To fulfill the `IJBRulesetDataHook` interface.\"},\"hasMintPermissionFor(uint256,address)\":{\"notice\":\"Required by the `IJBRulesetDataHook` interfaces. Return false to not leak any permissions.\"},\"poolOf(uint256,address)\":{\"notice\":\"The Uniswap pool where a given project's token and terminal token pair are traded.\"},\"projectTokenOf(uint256)\":{\"notice\":\"The address of each project's token.\"},\"setPoolFor(uint256,uint24,uint32,uint256,address)\":{\"notice\":\"Set the pool to use for a given project and terminal token (the default for the project's token <-> terminal token pair).\"},\"setTwapSlippageToleranceOf(uint256,uint256)\":{\"notice\":\"Set the TWAP slippage tolerance for a project. The TWAP slippage tolerance is the maximum spread allowed between the amount received and the TWAP.\"},\"setTwapWindowOf(uint256,uint32)\":{\"notice\":\"Change the TWAP window for a project. The TWAP window is the period of time over which the TWAP is computed.\"},\"twapSlippageToleranceOf(uint256)\":{\"notice\":\"Get the TWAP slippage tolerance for a given project ID.\"},\"twapWindowOf(uint256)\":{\"notice\":\"Get the TWAP window for a given project ID.\"},\"uniswapV3SwapCallback(int256,int256,bytes)\":{\"notice\":\"The Uniswap v3 pool callback where the token transfer is expected to happen.\"}},\"version\":1}},\"settings\":{\"remappings\":[\"@bananapus/=node_modules/@bananapus/\",\"@chainlink/=node_modules/@chainlink/\",\"@eth-optimism/=node_modules/@eth-optimism/\",\"@exhausted-pigeon/=node_modules/@exhausted-pigeon/\",\"@openzeppelin/=node_modules/@openzeppelin/\",\"@prb/=node_modules/@prb/\",\"@scroll-tech/=node_modules/@scroll-tech/\",\"@sphinx-labs/contracts/=node_modules/@sphinx-labs/contracts/contracts/foundry/\",\"@uniswap/=node_modules/@uniswap/\",\"base64-sol/=node_modules/base64-sol/\",\"ds-test/=lib/forge-std/lib/ds-test/src/\",\"forge-std/=lib/forge-std/src/\",\"hardhat/=node_modules/hardhat/\",\"solmate/=node_modules/solmate/\",\"sphinx/=lib/sphinx/packages/contracts/contracts/forge-std/src/\"],\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"compilationTarget\":{\"src/JBBuybackHook.sol\":\"JBBuybackHook\"},\"evmVersion\":\"paris\",\"libraries\":{}},\"sources\":{\"node_modules/@bananapus/core/src/abstract/JBPermissioned.sol\":{\"keccak256\":\"0x6486c11bff6384bfa938feb7aaacc977f457abff25b17b9aa094077d3fef71f8\",\"urls\":[\"bzz-raw://8b5190202326b6499391d5128cdb2d9ff44e91cd9ba6d8a5fe01e6f21259270d\",\"dweb:/ipfs/QmR2ufPwHtCAZYkJoyWyyag6BfdaWpaLk7VhuDc6BRLqVe\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/enums/JBApprovalStatus.sol\":{\"keccak256\":\"0x61c69b6bac7d24b566d87cda23a77e4ca9cdb87200b106aba8534cb9a0973e33\",\"urls\":[\"bzz-raw://6a9ca7249de76f77a8252eefe6bd1b63d47952f25a2acfa2c8db967cdff4470c\",\"dweb:/ipfs/QmaxSxptRQNj8bNy96EreENmrnRWdKmhyihBcxyWzBX5BN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBController.sol\":{\"keccak256\":\"0xfd338e99bf942083bbf2170a147786585a0f4bcf54815b78cc13ff68cc8d6ded\",\"urls\":[\"bzz-raw://cdcaf5d032173a02e75ba63b334e002347d7a7641f1ea208e6de91f416ac6780\",\"dweb:/ipfs/QmNqHwbBrpvYAGdbhhKvdpKn5nnZMRMUXX4N465Cj4TtAq\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBDirectory.sol\":{\"keccak256\":\"0x9cc380844aef60078ee47a61861e55a29c4a8c947efd556ebd36e6909f7b9d62\",\"urls\":[\"bzz-raw://9f5190ec8b6683d9781ee6e9eedcc91294753242748875d4a06349077e4cbaaf\",\"dweb:/ipfs/QmTQrPuXT9TCA4txwrperMeXSGvGxP8iokUK47f62F388i\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBDirectoryAccessControl.sol\":{\"keccak256\":\"0x1e67f56849320a46f834aaa9bd62b170ff8ada7b224b4a81136193740fa0be4d\",\"urls\":[\"bzz-raw://ea8fbcec44abfe49d137bcae129b67e5479d6b17879301f88534c8a7fab00be4\",\"dweb:/ipfs/QmT6wrtYX4GRpffHUzupNwYebJ1dqkkKZLEewWsoyunsqw\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFeeTerminal.sol\":{\"keccak256\":\"0xdb6f3349cbe2078faa8421dec892136693748d8a60b70a1dee3bce2cfc5274fc\",\"urls\":[\"bzz-raw://ccc6a67fc72726c6180c41523cc2a43562864347770a86ff54532fb6ca09e7c3\",\"dweb:/ipfs/QmZinV1LoRsmTq713YGvNShaPtGaxLqwJ6u2EwwGKEKCgu\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFeelessAddresses.sol\":{\"keccak256\":\"0xe5df42cfa71c5fa41b905c122de5825df13c2aab2f9cc4cf4bafa331dd69c27e\",\"urls\":[\"bzz-raw://3773bf3b42cc57d1e4086147e52135ff1dbff4309c45ca0398f821dfaa071563\",\"dweb:/ipfs/QmXUEJssHaxYKfV33tMZGf81JTR5a5yxEVshzNus84xLuT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFundAccessLimits.sol\":{\"keccak256\":\"0xf5fd6bdd723b60d490ccbe22cdf1cfe43663d23e6ee48badcd1b71e3282cb16b\",\"urls\":[\"bzz-raw://fe692f0b843ea5fccdfcb68f4ec16e1c0add945bb74b303c9866342be0e31fbf\",\"dweb:/ipfs/QmSRmzpgp3DhNEhNDiLsSu7yEiTeywbzEFbwyGyDazjgKt\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBMultiTerminal.sol\":{\"keccak256\":\"0xc7b4f5043ec5733f5b303688f3dbf475ef5f6fe12364847a538c8b48a2137fb7\",\"urls\":[\"bzz-raw://fcd1b41a2acfd035e285e6f20f983b9b00a4e00c688a3072062dfb7f5c9c5afe\",\"dweb:/ipfs/QmYCfjakBGxWWTvb5Pk9UAeguwiWrnsNviQWMsaYz7Xq5N\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPayHook.sol\":{\"keccak256\":\"0x9438866782c652c2942f4d114e35f393cd3c8b0334abce8387eed90bca35e8b2\",\"urls\":[\"bzz-raw://cfd99daf57213f92325aad7d7d16e98476d38e870470e95ba01e3ae3cdecc95d\",\"dweb:/ipfs/QmUKKAVGf7ki8BHksr99tFcRW8APveeB5tNH63ctTbbCW8\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPayoutTerminal.sol\":{\"keccak256\":\"0xd0f9374470591c4afb2525c9c7b1bdad577765857c404b22ee5d8d2997a18fad\",\"urls\":[\"bzz-raw://4529c066b2014ee64b8fb16981a9fd5badf64dea7ac6c07dd1b1e7ab5cdc1d8a\",\"dweb:/ipfs/QmYxTdPjRAZ8iThUoNmJuivEaRaB3xXpyHdhCU7my1UHZy\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermissioned.sol\":{\"keccak256\":\"0x5b038d4dee116584e88b230920e56d48e135053e3f7e5642eaea14a775c1dad7\",\"urls\":[\"bzz-raw://19e43102f349fd4a1da1c0943ffb8f2950007fe4bb4bb7e8f74fc142575d091b\",\"dweb:/ipfs/QmXHAt4KzDTdDZgDDefEXH2WKi7NcfkJb9R7nxW5uDqsNp\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermissions.sol\":{\"keccak256\":\"0x49d2b91a866004af098a6770b28040071885b048b4b50744b12a1e5b212c5e5e\",\"urls\":[\"bzz-raw://089b4dda50be91412ffe1fbe333f78cc894f073c1a7afe469f10a2cee12fbf9e\",\"dweb:/ipfs/QmYPPBZ6HwBa1RNkNGqGcR2xgj4fnWBzrPHHoJG3kZA6AN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermitTerminal.sol\":{\"keccak256\":\"0xd6bd30842273f5b794f82219fefdd4953f5343328d2cfdb684b7d826cc0c769c\",\"urls\":[\"bzz-raw://ca1195fd5572060b36fc7e45f46d59f974e3a908248edcfadeb8cb06247075f0\",\"dweb:/ipfs/QmYTpDXKTXqi8GQFsNqB8LiGFTZjSPY3PA8vKqZBraVdqD\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPriceFeed.sol\":{\"keccak256\":\"0x4bd84c0f1a5d4729ed709bcddd43f4c50ec4a165ece79780af8dce482ed07d4a\",\"urls\":[\"bzz-raw://62bac4bfb6982fb002f620c77e5c445e62d50241a5aa64a07e51d929f5a42180\",\"dweb:/ipfs/QmWgJUDreVY2BuMX38a1iUUR5kNbMwGnKG3VvurB7oZtuM\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPrices.sol\":{\"keccak256\":\"0xa4988a8984774e9f9d355236e3c4ab67868503964747684d989ceb54a4176361\",\"urls\":[\"bzz-raw://7496393b49f8a594e6bc3393ffab118e4dc95f69233c77046cd552b1c52a533a\",\"dweb:/ipfs/QmavDESpty7XFmLgWKMHb3venZVPGwwKevWmYStM2mxcPH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBProjectUriRegistry.sol\":{\"keccak256\":\"0x2799475228987e4f8334ac33d3935f759c9b8133db7383b4f622dde7a5dc0502\",\"urls\":[\"bzz-raw://d751731740f45df74eea48c9667e847ee2cddb2980ab4939c86bd17e6c6ed89b\",\"dweb:/ipfs/QmXW8SLTuhdUpfn7pRpdsYdcyuim8RTyagU37ULcj5UZhT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBProjects.sol\":{\"keccak256\":\"0x735c2fb8f1fa827f054ee77f7a0ae4b312656217acb75b624d2c8fd9dc40151b\",\"urls\":[\"bzz-raw://ee7fc92299a8633a80693ae63ab494dcd125f1789487a54a39dc0e5696e5996f\",\"dweb:/ipfs/QmX7YJD4pS2XhgQb7p3JbBAXynT7YGPXcZe92BiWWRrsCL\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRedeemHook.sol\":{\"keccak256\":\"0x8ab46fcd7d0e739661eb76056ad93ff99106f38420ef0b4eb97fa9f4bb71a68a\",\"urls\":[\"bzz-raw://0ef96fcb7ad26281d444d8e0c677b25114fdd63b1c172d477e030dce8ba53b62\",\"dweb:/ipfs/Qmcx1jRQuwU4pZFuLxsSsx4oMbRaDfktHrPnXextgbWc5m\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRedeemTerminal.sol\":{\"keccak256\":\"0xd1b4aa38154e08f1474745ea6bc8f8823fe8aa68c124d596742597f2296ea16d\",\"urls\":[\"bzz-raw://9bd254e833702dfe5e28db5fee76478947ab45b501c966501f719e73bbf0397a\",\"dweb:/ipfs/QmZ3Ng7TmVxL6ozSUhx4kYdQdZhoYi4t43cYZVAMz7Fn5M\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesetApprovalHook.sol\":{\"keccak256\":\"0x592e95d159494421c6b1bcb362d0cee1df0132921697351304e9cd7af4fbd386\",\"urls\":[\"bzz-raw://5bebfd5fa67c1b6ea16fa2e76e9520e9dfe52a579f48dd94d0c2ec45f78ad178\",\"dweb:/ipfs/QmRUawEGtfYoYSHmHELGhvJoWuMsxLPKtqAXgsrb7fJboP\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesetDataHook.sol\":{\"keccak256\":\"0x13b4b9f4b847f62442da1c1a59b399f8f201b31a28edb96aa5a8a78ad57c24d0\",\"urls\":[\"bzz-raw://4fcd00b77d0f40cf6d5ee6590b6ef4ee1f606e89ae4c4faed3710fb462108f8e\",\"dweb:/ipfs/QmeoE54DQ3eGw9EDXfN7aTMmEjubAtirahmytDijo6GSeE\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesets.sol\":{\"keccak256\":\"0x552a9bc990fa47026c89defa6dd112675ee4ef13a9e38f72577e3c0c222f2a8f\",\"urls\":[\"bzz-raw://4fc8638720bac7feb191b8b4ffb4fa08c56a951924fc058561663633973235e2\",\"dweb:/ipfs/QmawYWj5syRvZ2miLQ8WT42AXsuTCH5Fm9Gmq1Rege2mKF\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBSplitHook.sol\":{\"keccak256\":\"0xeb8dfac7a4b81897a1c3b5d0d853a406bcff33720fb187d5ca5bb3dcc0ba3a12\",\"urls\":[\"bzz-raw://36aaeef6107cfe5b0127e063ea215aac7200f8af02e28a48e61111abd3254688\",\"dweb:/ipfs/QmQ8yQANXnhQCAWBGKsKCDsJ3A8hnTKNg5tyo79GfWXTcV\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBSplits.sol\":{\"keccak256\":\"0xd8894cfc55560d914f413e40c981165e1e9dc845b35cdf0ecd13fd118733a483\",\"urls\":[\"bzz-raw://e03b8e5e34c924a91884e3ef79ea039292f8927241698db84a09a463ced4cc52\",\"dweb:/ipfs/QmSqhVX2LSStR7xEcc96zAiQpTPDSsZBn8YvH33CtiU1FN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTerminal.sol\":{\"keccak256\":\"0x8981b96902125707c49c63867b718118fdfb04cb8fd42b038d93ef87ea56f85c\",\"urls\":[\"bzz-raw://7b172c6924a10431652eab136758953a51af8d709a55afff1533d13e687be60c\",\"dweb:/ipfs/QmWczAk48Jw8qNgrUn4EFRK25CrmCp7MmEaJsGtTXueaEb\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTerminalStore.sol\":{\"keccak256\":\"0x140159d66d729f6aeed0fe1f7c655619985146ec00e8c68cbd9b5d30d4dc7d23\",\"urls\":[\"bzz-raw://f972ecb52bcfcd2852c9e7264b1ecc504ce94bd6e12c034b93c1768cd372954e\",\"dweb:/ipfs/QmRu7in5iJSWHLTcFPbJmiK1rCHFbwNY7qzY4cG6kgfYcr\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBToken.sol\":{\"keccak256\":\"0x71b1f9c3a0edd41910f77396e0be2c65596571176d53eb87e887c3c0da56c0fb\",\"urls\":[\"bzz-raw://6e956f0582f4525e83d845ee9b4a89959abc4f821414f6accbbee5b38960482d\",\"dweb:/ipfs/QmbSvjgmCgnfVmcCTGu8XwrV1Rufsf3M8hB8unFq6fTMdH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTokenUriResolver.sol\":{\"keccak256\":\"0xfa5cb00dcd6085d1ef912d071fe73c63f9478a2cd0f9d8bddaf659b6af2d0967\",\"urls\":[\"bzz-raw://282e4e7c342d65f77cde0e9a08fcaf20ef5cf379c7a48b639842c0ffd0b2afb8\",\"dweb:/ipfs/QmbnN3PEQeZaXdPLT75V1J79kMg7KqSMru37RHrL3z8Yf2\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTokens.sol\":{\"keccak256\":\"0x6fd67af915dd541d9547c8297aa9ae269690e4ee23531db43f021bcacec6076f\",\"urls\":[\"bzz-raw://2e5e11954e9ab2319fffccb6563f3db400b8f7760d4ffe2165048a02c9c37fa6\",\"dweb:/ipfs/QmbDXtV83dK8EfiTjsTRf55R2XqPZzDKcjtYbW8sxQ5CFm\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/libraries/JBConstants.sol\":{\"keccak256\":\"0x822bef715c9d5803208a2e02f8d14e0ffdb1fb2ea84698c30fd801103be4a3d2\",\"urls\":[\"bzz-raw://476c87d74e31cd43419cce01551158993c311ac47ba5fad5768e26054b3c8a91\",\"dweb:/ipfs/QmdpxoGU6suZAm9FS7R47AwSmHEFjwmf6v56WrfZM4QkJc\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/libraries/JBMetadataResolver.sol\":{\"keccak256\":\"0xdf32038c5e7f65725e2ef87d09fe04972d7da6a63b60c066d4616b2c2ada5149\",\"urls\":[\"bzz-raw://50582c41ee196ead31d13dcc5a468436d524891d7873743ba92d1d64a0b5783a\",\"dweb:/ipfs/QmPiJMbA1oQnVKQTjqYvUvtWaaiFCeKic8NJtu2crrAznW\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAccountingContext.sol\":{\"keccak256\":\"0x9c47e048a719f784f601df69a583505432217b9868a0244876d277f84dd1ebdf\",\"urls\":[\"bzz-raw://8565f194b87914da9a02af2e760ae2ed2a9d185c6f11229f7035140776d2fec9\",\"dweb:/ipfs/QmPs2fic8W3F5e5zNRwmGmJFjb3JWGPWJ3YUe5o82nQgEn\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAfterPayRecordedContext.sol\":{\"keccak256\":\"0xd26c3a774ff38be79064085970454fe2603a23a638c76270d5b1b3829206c3e8\",\"urls\":[\"bzz-raw://3b55dbe3bf1ef625b7ca04efab3de35406e6041d5b3d82c7265469c500e2b702\",\"dweb:/ipfs/QmUdBDo4Lt3mcsFcsXT2mqq3czFwZjQJFPLM89YA2VtD7k\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAfterRedeemRecordedContext.sol\":{\"keccak256\":\"0x521f5d23a36f0da72362cd84890cc867bd83baa8dc836ba6c5066d51dba2f163\",\"urls\":[\"bzz-raw://6cc461313286dde62d045d6288e87bae5032e035796326f5b1ed6218e58aa9da\",\"dweb:/ipfs/QmQS2AkQwf2ANQieDuaUnpJEdXChoLv4CCbZqHkfywYPSR\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBBeforePayRecordedContext.sol\":{\"keccak256\":\"0xbc98b968d84be2f0ddbb24240723c7179ec9c5e02e5fbd5843dd0e76623a3ea5\",\"urls\":[\"bzz-raw://1310e522696a9fc6f7f96b04c293fab3b4cf1e722bdbb7aa1eec7b3ecc25402f\",\"dweb:/ipfs/QmTYiijDJRuQcMhLrmpbHzHAQFPq6jurPP5HjyYtnzbpnK\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBBeforeRedeemRecordedContext.sol\":{\"keccak256\":\"0x73eadaf6827e82f6ccbe3a1e2b2b7fc6c59cef471f73335041b30ddcc000989d\",\"urls\":[\"bzz-raw://2f3ee84662eed565dbdaed406ef836fffaf55cccd417575578152e5085d0b1f2\",\"dweb:/ipfs/QmaJGFS7hxJsiUdKvbv5BKhSwceDEzKBnt7t5YeNWvYgMK\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBCurrencyAmount.sol\":{\"keccak256\":\"0x7f321bbcbd13abfbc8f0d08a5adaaf8ef312db5bb899012fcffb6170fbb962a9\",\"urls\":[\"bzz-raw://bf9301ef1dbb3abda7b492585377617508ba048c6170f21a5e7d2b3c034eb384\",\"dweb:/ipfs/QmcetEFxSYLLNSZzPBpNn3Fc8sFcrFE8A8h12ZSj2tLgxD\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBFee.sol\":{\"keccak256\":\"0xffacd6dcce11a5cdd54aba7a5d8f9b28b9b36b87771dea746a117b616519bbd0\",\"urls\":[\"bzz-raw://c278d6efa1dd694c8aceba43b2cb3f2b49a52d9b15fc23089def526e4ba23778\",\"dweb:/ipfs/QmVHEGGAfsUVE791aGeYZBiymU6aJ278PoGmH9SRLY1U4N\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBFundAccessLimitGroup.sol\":{\"keccak256\":\"0x9fdaa8d017b72da25f583700a444a86849df053f7fb8eac874ec5139bcf651e5\",\"urls\":[\"bzz-raw://c8e44c49ee444a98424a0dbeb6897a76a0bf00d88a613f62ac2012afdac754ee\",\"dweb:/ipfs/QmdYkAiRi5bXM1YYNkc7BiqimHSFodMGn1cjHR5hcpm4xH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBPayHookSpecification.sol\":{\"keccak256\":\"0x955f0bfca97300b9e5927dc181753830ee362f83fa9ca32a90daade32aa0cfd5\",\"urls\":[\"bzz-raw://f517af1597c7c40f8d3da53f7a6684a3e162950a16559d6bf6ea3b727bb11546\",\"dweb:/ipfs/QmRWo2ZTYXmVZTzNJDYhsJNsEaHphjpUfx9eNz2cciyz86\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBPermissionsData.sol\":{\"keccak256\":\"0xd5a5fe65b1deb40b5cd9c8e05bc1352d0e95f3a18b4986fab7abdc621beb19c7\",\"urls\":[\"bzz-raw://a6141eaa414d3d61de671ae3584b87e98044bf6392cb94d2acd1bb5cc7c19db4\",\"dweb:/ipfs/QmbtvALmburKLRC5fHXscoeZii1N2qQrJAdqarfvSKaKEk\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRedeemHookSpecification.sol\":{\"keccak256\":\"0x673d16ee1a91bf8de3b37e57284e60451b70a9c2d748c9cdc7a151f5624af18f\",\"urls\":[\"bzz-raw://ceeb5e81effa0f076c5630c756dfcf1548d09f822b255a0a6ee01e54de8c8ae2\",\"dweb:/ipfs/QmSMoMNPRhPMnuJNvWa6S59XRfycGz9o2ApNp63bUW6TdX\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRuleset.sol\":{\"keccak256\":\"0x03ad7bd257d4ac55ecc42b85156dce1c70eec8572dbf8feb093c033912f305e7\",\"urls\":[\"bzz-raw://9665b4c018cd469f94bec4471222cc9e5fd58ac421a0959f70e72618fe37d55b\",\"dweb:/ipfs/QmSUf6HQv2Ckcoy5tSH1UPdD8vDMerfK29G8kaxmxB3Kow\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetConfig.sol\":{\"keccak256\":\"0x7a57ed3d73bd9457d8e1fb40f5204c364df87cbfdbf42412d5bbc08beabb49c9\",\"urls\":[\"bzz-raw://8b9a83916ee67d32b5f434b35b171c6122bbc4efeaa4fabb8dec2ca4e9e32c6e\",\"dweb:/ipfs/QmNquzUQn6ZvE2wBcMCgru3resV9UNvBWPPetyDChoh8vM\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetMetadata.sol\":{\"keccak256\":\"0xfb3601c74af59891c7a22eb33110170bbd57e3958130961704ea20cede4202cc\",\"urls\":[\"bzz-raw://fbebf88cdf5fe93aa6eae665e5a5ea277dd3d5b703afbc732fb20e3d3a1d3f0a\",\"dweb:/ipfs/QmWMBjpmNVUePZZaBPKLUP7zX1f49re55ruhLCeFx1zx9A\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetWithMetadata.sol\":{\"keccak256\":\"0x1bcfadf20488f6df65227f8d4d0fbf9b7539456a2389567f7fe3900d23289bc3\",\"urls\":[\"bzz-raw://0a15c399a71e5373f8c0484c6d6b83521eda31e063a2c53e4c5cec4e74550343\",\"dweb:/ipfs/QmQwi8zkjoTVXbK89NeETYimWCacTrNsesJdpLSvGdqMPX\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplit.sol\":{\"keccak256\":\"0x0e1351e80cf9967caee90094712a4fc884a83f07df23a844d8cb33ebcd00721e\",\"urls\":[\"bzz-raw://19d5793c08834f2ec1d6942bd43d05042b0ecc351a57235d748a8f2ff74b6638\",\"dweb:/ipfs/QmUWjyNg7x62KsvMwAzNdpmwqCo5qK5ip9pLdshj9B2Kbf\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplitGroup.sol\":{\"keccak256\":\"0x8dc98fa9e730bee8bcc0a8acf1bc4db1c9b0edf307d969c9c9caa4d6b8d856d9\",\"urls\":[\"bzz-raw://66f4306e0e69c82033927952564fd617e7c4b29aa8b165d5b53a0ebe3109ea12\",\"dweb:/ipfs/QmQqN1u7FHAdEtEZNRcKvZwYtXEQVQnLd6FMzHESP7wDtx\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplitHookContext.sol\":{\"keccak256\":\"0x1cef82bf434f91d518092ea7e57db4a72ce7654f48a7db9bf44882900b6b6623\",\"urls\":[\"bzz-raw://cc5012008ab7e74cf766fe1c202a23e3a73365356bcf1e0b04ec01baf21b204b\",\"dweb:/ipfs/QmSwJvd6Yrg9XZMhjquBcak5sfUswbR5nPEuJBfpjM54VT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBTerminalConfig.sol\":{\"keccak256\":\"0x2da40b8ae2b6a6038da0ac17d3ccf083a8fb54ea12684242342e53811cca997c\",\"urls\":[\"bzz-raw://9ddb66e9f90ce3005bb1fedd06ec66e6d3e99c52afaf729cee0a23ae01b21fab\",\"dweb:/ipfs/QmPTD9ciAZqj5WWuE5W4Ufs1kBvVokntrfSdUcV6Egh7eQ\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBTokenAmount.sol\":{\"keccak256\":\"0xc61593d33d5ec30e695d382948a1b944d01e29a8f2bfd29f75ecebcdbc7816de\",\"urls\":[\"bzz-raw://8992c1e5fca0c2342ecc0e734dfba6a2a752e4c29184784931d0971e44305051\",\"dweb:/ipfs/QmYNcaW3qeCkgAExUaFTq238fgfJuoYCTwjCn7jm94U4dJ\"],\"license\":\"MIT\"},\"node_modules/@bananapus/permission-ids/src/JBPermissionIds.sol\":{\"keccak256\":\"0x1bd511f9cc46d134ab4743dba50ee25b1c67b5b5e30a27cbfebb1c3fcfedc876\",\"urls\":[\"bzz-raw://6d81d52f481c89832c9c61fa4ea513196c6c8182878d1fbef2038ca39a909192\",\"dweb:/ipfs/QmbaRR5ZXF9PRJwEGbwoAydQiYUoQLYiej7CVmHHbFG29z\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0xce41876e78d1badc0512229b4d14e4daf83bc1003d7f83978d18e0e56f965b9c\",\"urls\":[\"bzz-raw://a2608291cb038b388d80b79a06b6118a42f7894ff67b7da10ec0dbbf5b2973ba\",\"dweb:/ipfs/QmWohqcBLbcxmA4eGPhZDXe5RYMMEEpFq22nfkaUMvTfw1\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"urls\":[\"bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c\",\"dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"],\"license\":\"MIT\"},\"node_modules/@prb/math/src/Common.sol\":{\"keccak256\":\"0xaa374e2c26cc93e8c22a6953804ee05f811597ef5fa82f76824378b22944778b\",\"urls\":[\"bzz-raw://279c732e161d623cf4d8a9519ca4c42c0c2db99842d0eb2a20c10fde3fa722c9\",\"dweb:/ipfs/QmVViuUXbinQGqtG5M21SgVzKihiCbFUChd4tDhtvwRmxH\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IAllowanceTransfer.sol\":{\"keccak256\":\"0x37f0ac203b6ef605c9533e1a739477e8e9dcea90710b40e645a367f8a21ace29\",\"urls\":[\"bzz-raw://e0104d72aeaec1cd66cc232e7de7b7ead08608efcc179491b8a66387614670b0\",\"dweb:/ipfs/QmfAZDyuNC9FXXbnJUwqHNwmAK6uRrXxtWEytLsxjskPsN\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IEIP712.sol\":{\"keccak256\":\"0xfdccf2b9639070803cd0e4198427fb0df3cc452ca59bd3b8a0d957a9a4254138\",\"urls\":[\"bzz-raw://f7c936ac42ce89e827db905a1544397f8bdf46db34cdb6aa1b90dea42fdb4c72\",\"dweb:/ipfs/QmVgurxo1N31qZqkPBirw9Z7S9tLYmv6jSwQp8R8ur2cBk\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IPermit2.sol\":{\"keccak256\":\"0xaa631cc9f53e699301d94233007110a345e6779011def484e8dd97b8fe0af771\",\"urls\":[\"bzz-raw://fc0502cf19c9c18f320a3001201e89e350393b75837f6b7971de18b2de06f30d\",\"dweb:/ipfs/QmT9SfhdJ7VJNNrf94g4H5usyi7ShqWGx7Cqsz9jZTjX96\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/ISignatureTransfer.sol\":{\"keccak256\":\"0xe6df9966f8841dc3958ee86169c89de97e7f614c81c28b9dc947b12d732df64e\",\"urls\":[\"bzz-raw://3d4eafdee7f48c3be8350a94eb6edd0bfb2af2c105df65787a77174f356c0317\",\"dweb:/ipfs/QmY1j2adeeAhNpn6cUuthemxGCdLXHTfyMh9yTKsY4mZ2d\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol\":{\"keccak256\":\"0x4e64844c56061cd90e0a80de73534a9166704c43eed579eb83f90bc2780ce968\",\"urls\":[\"bzz-raw://cba4fab5cebdddf644b901994a7f0f52b98885d4c56012f4dc51d52c2bf9de0e\",\"dweb:/ipfs/QmVyyrRmqXrAiapewWunRVgiPVFJHpH2hKiE1py1svMSNV\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol\":{\"keccak256\":\"0x3f485fb1a44e8fbeadefb5da07d66edab3cfe809f0ac4074b1e54e3eb3c4cf69\",\"urls\":[\"bzz-raw://095ce0626b41318c772b3ebf19d548282607f6a8f3d6c41c13edfbd5370c8652\",\"dweb:/ipfs/QmVDZfJJ89UUCE1hMyzqpkZAtQ8jUsBgZNE5AMRG7RzRFS\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions.sol\":{\"keccak256\":\"0x9453dd0e7442188667d01d9b65de3f1e14e9511ff3e303179a15f6fc267f7634\",\"urls\":[\"bzz-raw://982f4328f956c3e60e67501e759eb292ac487f76460c774c50e9ae4fcc92aae5\",\"dweb:/ipfs/QmRnzEDsaqtd9PJEVcgQi7p5aV5pMSvRUoGZJAdwFUJxgZ\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState.sol\":{\"keccak256\":\"0xe603ac5b17ecdee73ba2b27efdf386c257a19c14206e87eee77e2017b742d9e5\",\"urls\":[\"bzz-raw://8febc9bdb399a4d94bb89f5377732652e2400e4a8dee808201ade6848f9004e7\",\"dweb:/ipfs/QmaKDqYYFU4d2W2iN77aDHptfbFmYZRrMYXHeGpJmM8C1c\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolErrors.sol\":{\"keccak256\":\"0xf80abf13fb1fafc127ba4e792f240dd8ea7c8c893978cdfd8439c27fae9a037b\",\"urls\":[\"bzz-raw://b04fc72a656bbf3631e9c2e67b9870a2d9d235185e833fe050e9606e6816a9aa\",\"dweb:/ipfs/QmUcz4bkEkJ9pwzFu1C3n97hBQ3st9U6qTAqCdyFwddKco\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents.sol\":{\"keccak256\":\"0x8071514d0fe5d17d6fbd31c191cdfb703031c24e0ece3621d88ab10e871375cd\",\"urls\":[\"bzz-raw://d0b571930cc7488b1d546a7e9cea7c52d8b3c4e207da657ed0e0db7343b8cd03\",\"dweb:/ipfs/QmaGK6vVwB95QSTR1XMYvrh7ivYAYZxi3fD7v6VMA4jZ39\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables.sol\":{\"keccak256\":\"0xf6e5d2cd1139c4c276bdbc8e1d2b256e456c866a91f1b868da265c6d2685c3f7\",\"urls\":[\"bzz-raw://b99c8c9ae8e27ee6559e5866bea82cbc9ffc8247f8d15b7422a4deb287d4d047\",\"dweb:/ipfs/QmfL8gaqt3ffAnm6nVj5ksuNpLygXuL3xq5VBqrkwC2JJ3\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions.sol\":{\"keccak256\":\"0x759b78a2918af9e99e246dc3af084f654e48ef32bb4e4cb8a966aa3dcaece235\",\"urls\":[\"bzz-raw://64144fb96e1c7fdba87305acadb98a198d26a3d46c097cb3a666e567f6f29735\",\"dweb:/ipfs/QmUnWVwN9FKB9uV5Pr8YfLpWZnYM2DENnRMaadZ492JS9u\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.sol\":{\"keccak256\":\"0x44fa2ce1182f6c2f6bead3d1737804bf7e112252ae86e0f2e92f9b8249603f43\",\"urls\":[\"bzz-raw://54154e8665b98d65f5dc91b256551852cb47882180b501b260657122d207c0ea\",\"dweb:/ipfs/QmcfemK1A2PXYrWB5SBFGERpMCderbFRb8BtTzQDj1sUBp\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/libraries/FullMath.sol\":{\"keccak256\":\"0x7825565a4bb2a34a1dc96bbfead755785dfb0df8ef81bd934c43023689685645\",\"urls\":[\"bzz-raw://8f44f4614d31e3d4864c7eb13620555253b84f6a69180f8745b7c6e246a9d125\",\"dweb:/ipfs/QmfNQUcXj3KL8h9u5PqbtEC6yRtwDbKNb48uMPjdwxsKnd\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v3-core/contracts/libraries/TickMath.sol\":{\"keccak256\":\"0x5c57de03a91cc2ec8939865dbbcb0197bb6c353b711075eefd8e0fca5e102129\",\"urls\":[\"bzz-raw://1e994c24fd891ef8a3f5dbf5eba42b34feaf05e0376a29f91322faa18054449c\",\"dweb:/ipfs/QmNdUJGUQxd1dPkMbnA5f5UNqakxRkQE5r7bTZJAuHeapS\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-periphery/contracts/libraries/OracleLibrary.sol\":{\"keccak256\":\"0xe313f89c69c0f1c91f0722868313b4ceb14479b3e7a0abf52a1b9bbd9c18e81b\",\"urls\":[\"bzz-raw://8ad09b061f3f533c116618c20cf01510108eebebb7ff8847b0f245b8ba368d53\",\"dweb:/ipfs/QmU6vdi5JjJfjK2KqonWvRg9NeuQWarj4B1YFN22Dh9VJM\"],\"license\":\"GPL-2.0-or-later\"},\"src/JBBuybackHook.sol\":{\"keccak256\":\"0x6ce52f5d43175b4b3c1b3ce4490aefbbf97f6bb047d01f9196e27fe934339231\",\"urls\":[\"bzz-raw://fb974d5ca3ca338841891368af57f612a1aa92c8ae600a3e25113603dc4d139d\",\"dweb:/ipfs/QmNWg3epg1Rqk8Tj5uRMxsLJEXcLdfe9wQ5u4nFH7qSSjz\"],\"license\":\"MIT\"},\"src/interfaces/IJBBuybackHook.sol\":{\"keccak256\":\"0xbe5d7f3bf2e18b569676ba9194e248e6b1ed50022f5247b4f1fa124c91bfd418\",\"urls\":[\"bzz-raw://eb221d1570e8aad409c419b6a2f84351e818c3527f3f44b806cd64c84d7a8c86\",\"dweb:/ipfs/QmUPZstaKjPN7VTywg3Mt6bF75E53mQbmXhf3TxCggJbRR\"],\"license\":\"MIT\"},\"src/interfaces/external/IWETH9.sol\":{\"keccak256\":\"0x50083bcaca6c1a8d12c79116fab4f6d8cd452a510cb3f00c4a8bc3a54678efb7\",\"urls\":[\"bzz-raw://726f187112d0953c14bff8099a8c9ce1ead47eb25e90839f77b100feaaf16127\",\"dweb:/ipfs/QmTEnMENpLjcTQLMwz4kEUiQHfiTkaZT3TL37nQ8JiRYh5\"],\"license\":\"GPL-2.0-or-later\"}},\"version\":1}", "args": [ "0x980B62Da83eFf3D4576C647993b0c1D7faf17c73", "0x248AB79Bbb9bC29bB72f7Cd42F17e054Fc40188e", - "0x877e8e31eD1Bf9F628EfA25636c5bC9Dd83BAA77", - "0x64c30002444321C4504c8f1b9B04C95DE3731Fd2" + "0x992f9e3a81c77Cb940A29311558343E1AC66c40F", + "0x1e4c8DFfE8D72aeB63e8dDbE9eF89bc368cbbE99" ], - "bytecode": "0x6101406040523480156200001257600080fd5b5060405162003e4938038062003e49833981016040819052620000359162000156565b806001600160a01b031663f434c9146040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009a9190620001be565b6001600160a01b039081166080528481166101205282811660c05281811660e081905290841660a0526040805163293c499960e01b8152905163293c4999916004808201926020929091908290030181865afa158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001259190620001be565b6001600160a01b03166101005250620001e592505050565b6001600160a01b03811681146200015357600080fd5b50565b600080600080608085870312156200016d57600080fd5b84516200017a816200013d565b60208601519094506200018d816200013d565b6040860151909350620001a0816200013d565b6060860151909250620001b3816200013d565b939692955090935050565b600060208284031215620001d157600080fd5b8151620001de816200013d565b9392505050565b60805160a05160c05160e0516101005161012051613bb262000297600039600081816104660152818161133801528181611857015281816119cf01528181611aae0152611d550152600081816102970152818161072c01528181610f49015261109001526000818161051e01528181610e14015281816111a20152611f390152600081816103d401526108df01526000818161058601526113780152600081816105520152611c5b0152613bb26000f3fe60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561054c57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000000000000000000000000000000000000000000092505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000000000000000000000000000000000000000000000816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f00000000000000000000000000000000000000000000000000000000000000005b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f00000000000000000000000000000000000000000000000000000000000000005b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f0000000000000000000000000000000000000000000000000000000000000000169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f00000000000000000000000000000000000000000000000000000000000000005b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220f82d6708b7e9d1d8e4803189749615db1f512283aff91b9bb51a552854f72e7c64736f6c63430008170033", - "deployedBytecode": "0x60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000f8ea7ba8d990646420123feaa2447b534ab2f53c81565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000877e8e31ed1bf9f628efa25636c5bc9dd83baa7781565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000980b62da83eff3d4576c647993b0c1d7faf17c7381565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f00000000000000000000000064c30002444321c4504c8f1b9b04c95de3731fd281565b34801561054c57600080fd5b506102607f000000000000000000000000cfba13b8dcb2bb4f84c5d2704882009a539bee9a81565b34801561058057600080fd5b506102607f000000000000000000000000248ab79bbb9bc29bb72f7cd42f17e054fc40188e81565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000f8ea7ba8d990646420123feaa2447b534ab2f53c73ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000877e8e31ed1bf9f628efa25636c5bc9dd83baa7773ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000064c30002444321c4504c8f1b9b04c95de3731fd21663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000f8ea7ba8d990646420123feaa2447b534ab2f53c73ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000f8ea7ba8d990646420123feaa2447b534ab2f53c1690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f00000000000000000000000064c30002444321c4504c8f1b9b04c95de3731fd273ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000980b62da83eff3d4576c647993b0c1d7faf17c7392505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f000000000000000000000000248ab79bbb9bc29bb72f7cd42f17e054fc40188e816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f000000000000000000000000980b62da83eff3d4576c647993b0c1d7faf17c735b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f000000000000000000000000980b62da83eff3d4576c647993b0c1d7faf17c735b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000980b62da83eff3d4576c647993b0c1d7faf17c7373ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f000000000000000000000000cfba13b8dcb2bb4f84c5d2704882009a539bee9a169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f000000000000000000000000980b62da83eff3d4576c647993b0c1d7faf17c735b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f00000000000000000000000064c30002444321c4504c8f1b9b04c95de3731fd273ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220f82d6708b7e9d1d8e4803189749615db1f512283aff91b9bb51a552854f72e7c64736f6c63430008170033", + "bytecode": "0x6101406040523480156200001257600080fd5b5060405162003e4938038062003e49833981016040819052620000359162000156565b806001600160a01b031663f434c9146040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009a9190620001be565b6001600160a01b039081166080528481166101205282811660c05281811660e081905290841660a0526040805163293c499960e01b8152905163293c4999916004808201926020929091908290030181865afa158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001259190620001be565b6001600160a01b03166101005250620001e592505050565b6001600160a01b03811681146200015357600080fd5b50565b600080600080608085870312156200016d57600080fd5b84516200017a816200013d565b60208601519094506200018d816200013d565b6040860151909350620001a0816200013d565b6060860151909250620001b3816200013d565b939692955090935050565b600060208284031215620001d157600080fd5b8151620001de816200013d565b9392505050565b60805160a05160c05160e0516101005161012051613bb262000297600039600081816104660152818161133801528181611857015281816119cf01528181611aae0152611d550152600081816102970152818161072c01528181610f49015261109001526000818161051e01528181610e14015281816111a20152611f390152600081816103d401526108df01526000818161058601526113780152600081816105520152611c5b0152613bb26000f3fe60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561054c57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000000000000000000000000000000000000000000092505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000000000000000000000000000000000000000000000816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f00000000000000000000000000000000000000000000000000000000000000005b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f00000000000000000000000000000000000000000000000000000000000000005b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f0000000000000000000000000000000000000000000000000000000000000000169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f00000000000000000000000000000000000000000000000000000000000000005b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220673ba775a9e9027f7796ba830c6cc31583ba0bdffbfd7ffbf013c44b6ee8d08b64736f6c63430008170033", + "deployedBytecode": "0x60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000e802b15a90a8aed41797cf535c6aee697f18e0b181565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000992f9e3a81c77cb940a29311558343e1ac66c40f81565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000980b62da83eff3d4576c647993b0c1d7faf17c7381565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe9981565b34801561054c57600080fd5b506102607f0000000000000000000000009ca9bc9d5e7e20fc2f1d750807fa30c86b7989f881565b34801561058057600080fd5b506102607f000000000000000000000000248ab79bbb9bc29bb72f7cd42f17e054fc40188e81565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000e802b15a90a8aed41797cf535c6aee697f18e0b173ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000992f9e3a81c77cb940a29311558343e1ac66c40f73ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe991663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000e802b15a90a8aed41797cf535c6aee697f18e0b173ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000e802b15a90a8aed41797cf535c6aee697f18e0b11690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe9973ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000980b62da83eff3d4576c647993b0c1d7faf17c7392505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f000000000000000000000000248ab79bbb9bc29bb72f7cd42f17e054fc40188e816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f000000000000000000000000980b62da83eff3d4576c647993b0c1d7faf17c735b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f000000000000000000000000980b62da83eff3d4576c647993b0c1d7faf17c735b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000980b62da83eff3d4576c647993b0c1d7faf17c7373ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f0000000000000000000000009ca9bc9d5e7e20fc2f1d750807fa30c86b7989f8169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f000000000000000000000000980b62da83eff3d4576c647993b0c1d7faf17c735b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe9973ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220673ba775a9e9027f7796ba830c6cc31583ba0bdffbfd7ffbf013c44b6ee8d08b64736f6c63430008170033", "devdoc": { "kind": "dev", "methods": { @@ -1212,7 +1212,7 @@ }, "version": 1 }, - "gitCommit": "74088a01fb7bb1c33e8e306744b5ecf4edb1b5a2", + "gitCommit": "9caaedd7d4d116463c4ceecb3147a8863f806dab", "sourceName": "src/JBBuybackHook.sol", "chainId": "421614", "linkReferences": {}, diff --git a/deployments/nana-buyback-hook-testnet/arbitrum_sepolia/execution/97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1.json b/deployments/nana-buyback-hook-testnet/arbitrum_sepolia/execution/97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1.json new file mode 100644 index 0000000..7662a82 --- /dev/null +++ b/deployments/nana-buyback-hook-testnet/arbitrum_sepolia/execution/97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1.json @@ -0,0 +1,221 @@ +{ + "_format": "sphinx-sol-execution-artifact-1", + "transactions": [ + { + "receipt": { + "blockHash": "0x19d20fdb93a3bea5e895b162648866d39adf1cffd39f7fa97a4f35ea8b55324c", + "blockNumber": 65598136, + "contractAddress": null, + "cumulativeGasUsed": "588985", + "from": "0x0c1c9049564269275059032Fb484Aa2e7Ab779af", + "gasPrice": "100000000", + "gasUsed": "180985", + "hash": "0x7192ee4a43fb96bf21da446f4dc383848602fecf404b9072ef13f94503287f55", + "index": 2, + "logs": [ + { + "address": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", + "blockHash": "0x19d20fdb93a3bea5e895b162648866d39adf1cffd39f7fa97a4f35ea8b55324c", + "blockNumber": 65598136, + "data": "0x0000000000000000000000000000000000000000000000000000000000000000", + "index": 6, + "topics": [ + "0x572f161235911da04685a68c06adf558fc7e4a36909dca394650e0adc19cc93d", + "0x0000000000000000000000000c1c9049564269275059032fb484aa2e7ab779af", + "0x000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4", + "0xe58e98bb0959e41b0bbbc2747c0d2df7b7742788b3f85fbd97e0207a2ffc9351" + ], + "transactionHash": "0x7192ee4a43fb96bf21da446f4dc383848602fecf404b9072ef13f94503287f55", + "transactionIndex": 2 + }, + { + "address": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", + "blockHash": "0x19d20fdb93a3bea5e895b162648866d39adf1cffd39f7fa97a4f35ea8b55324c", + "blockNumber": 65598136, + "data": "0x000000000000000000000000a2ea7657440875bf916cbfc0cfa88f13e38ad463000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "index": 7, + "topics": [ + "0x382c7aec02462c9b086aba9a7f8dbb1fb8bf336e7b624b0149eeca6726d0fb4a", + "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ], + "transactionHash": "0x7192ee4a43fb96bf21da446f4dc383848602fecf404b9072ef13f94503287f55", + "transactionIndex": 2 + } + ], + "logsBloom": "0x000000000000000000000000000000000000000000000100000000000040000000800000000000000000000000400200000000000000000000000000000c00000060000000000000000000000000000400000000200400000000001000000000000000000004000080000000000000000040000000000000000000000000000000000000000000000001000000000000000008000000000000000000000000000040000000010000000000000000000020000000000000001000000000000000000000020000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000a0100000000000000000", + "status": 1, + "to": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463" + }, + "response": { + "accessList": [], + "blockNumber": 65598136, + "blockHash": "0x19d20fdb93a3bea5e895b162648866d39adf1cffd39f7fa97a4f35ea8b55324c", + "chainId": "421614", + "data": "0xbe6002c2000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003448f38f83597d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000066eee00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001000000000000000000000000004bdf5a13e7a25f88dd5321a979e0e54c13df83e8000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a2ea7657440875bf916cbfc0cfa88f13e38ad46300000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003e0c959e8148c6573f8a85d836a1a8525e1936ebdc91747004c42eb9022d48383e1fb14e2330b6c2df8c2797b8a5ad037443b6d9b64eaf59507d84fbd95b9108677e0c3e414ef2458f86142a2ea08ea490b36629c555beb37ddb3d8cc405e60cb00000000000000000000000000000000000000000000000000000000000000414f02428220e87325aeb28468cc7ff8c84bb867601c5f91ee314a0d5c8393e2154f13f593e420a8883384f73ad73e7658068ced56f435dd9a2447df0f88795f6b1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "from": "0x0c1c9049564269275059032Fb484Aa2e7Ab779af", + "gasLimit": "195754", + "gasPrice": "100000000", + "hash": "0x7192ee4a43fb96bf21da446f4dc383848602fecf404b9072ef13f94503287f55", + "maxFeePerGas": "200000000", + "maxPriorityFeePerGas": "0", + "nonce": 96, + "signature": { + "networkV": null, + "r": "0xc066f8b2820c132c037f11da72dd43e6a86cfc26d001426831770259683e47e1", + "s": "0x05535887f9faa15dfbdb3ce8330d170c8f1ccadbdc2779f91b2f70bb51fe24bf", + "v": 28 + }, + "to": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", + "type": 2, + "value": "0" + } + }, + { + "receipt": { + "blockHash": "0xce855bfc60fe7e0c3a0567336b6ddf331c4cec410200bac808d83a9b0aed80ce", + "blockNumber": 65598174, + "contractAddress": null, + "cumulativeGasUsed": "3632385", + "from": "0x0c1c9049564269275059032Fb484Aa2e7Ab779af", + "gasPrice": "100000000", + "gasUsed": "3632385", + "hash": "0x5e5a0b728a83809ea2c88090d67c391e45989655b0e56bd7f6b27a31114a568d", + "index": 1, + "logs": [ + { + "address": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", + "blockHash": "0xce855bfc60fe7e0c3a0567336b6ddf331c4cec410200bac808d83a9b0aed80ce", + "blockNumber": 65598174, + "data": "0x0000000000000000000000000000000000000000000000000000000000000000", + "index": 0, + "topics": [ + "0x572f161235911da04685a68c06adf558fc7e4a36909dca394650e0adc19cc93d", + "0x0000000000000000000000000c1c9049564269275059032fb484aa2e7ab779af", + "0x000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4", + "0xcf7738e9fd703d1310f8326da03a891fe86fbb9e4249ed91e4f5b9b14364113b" + ], + "transactionHash": "0x5e5a0b728a83809ea2c88090d67c391e45989655b0e56bd7f6b27a31114a568d", + "transactionIndex": 1 + }, + { + "address": "0x4bDf5A13e7a25F88dd5321a979e0E54c13DF83E8", + "blockHash": "0xce855bfc60fe7e0c3a0567336b6ddf331c4cec410200bac808d83a9b0aed80ce", + "blockNumber": 65598174, + "data": "0x", + "index": 1, + "topics": [ + "0x6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8", + "0x000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4" + ], + "transactionHash": "0x5e5a0b728a83809ea2c88090d67c391e45989655b0e56bd7f6b27a31114a568d", + "transactionIndex": 1 + }, + { + "address": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", + "blockHash": "0xce855bfc60fe7e0c3a0567336b6ddf331c4cec410200bac808d83a9b0aed80ce", + "blockNumber": 65598174, + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "index": 2, + "topics": [ + "0xa65fb05c5808f5f389d72edeaf719ce38f4cc55c1f69ca3cbfb31c21501caa07", + "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1" + ], + "transactionHash": "0x5e5a0b728a83809ea2c88090d67c391e45989655b0e56bd7f6b27a31114a568d", + "transactionIndex": 1 + }, + { + "address": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", + "blockHash": "0xce855bfc60fe7e0c3a0567336b6ddf331c4cec410200bac808d83a9b0aed80ce", + "blockNumber": 65598174, + "data": "0x", + "index": 3, + "topics": [ + "0x4383d976757d67ca920616be0b6430a681ea9d3dcce8d6d61d4603ca4a9bff63", + "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1" + ], + "transactionHash": "0x5e5a0b728a83809ea2c88090d67c391e45989655b0e56bd7f6b27a31114a568d", + "transactionIndex": 1 + } + ], + "logsBloom": "0x00000000080010000000000000080000000000000000010000000000004000020080000000000000000000000040024000000000000000000000000000080000000000000000200000000000000000040000000000000000800000000000000000000000000000008000000000000000004000000400000000000000000000000000000000000000000100000000000000000800000000000000000000000000004000800001000000000000000000002200000000000000100000000004000000000002000000000000000000000000000000000008000000000000000000000000000000000008000000000000000200000000000080100000000008000000", + "status": 1, + "to": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463" + }, + "response": { + "accessList": [], + "blockNumber": 65598174, + "blockHash": "0xce855bfc60fe7e0c3a0567336b6ddf331c4cec410200bac808d83a9b0aed80ce", + "chainId": "421614", + "data": "0xbe6002c2000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000041a4e65ec46d000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000040c00000000000000000000000000000000000000000000000000000000000066eee0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000003fe00000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003bd22c00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000003ee94a424275796261636b486f6f6b000000000000000000000000000000000000006101406040523480156200001257600080fd5b5060405162003e4938038062003e49833981016040819052620000359162000156565b806001600160a01b031663f434c9146040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009a9190620001be565b6001600160a01b039081166080528481166101205282811660c05281811660e081905290841660a0526040805163293c499960e01b8152905163293c4999916004808201926020929091908290030181865afa158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001259190620001be565b6001600160a01b03166101005250620001e592505050565b6001600160a01b03811681146200015357600080fd5b50565b600080600080608085870312156200016d57600080fd5b84516200017a816200013d565b60208601519094506200018d816200013d565b6040860151909350620001a0816200013d565b6060860151909250620001b3816200013d565b939692955090935050565b600060208284031215620001d157600080fd5b8151620001de816200013d565b9392505050565b60805160a05160c05160e0516101005161012051613bb262000297600039600081816104660152818161133801528181611857015281816119cf01528181611aae0152611d550152600081816102970152818161072c01528181610f49015261109001526000818161051e01528181610e14015281816111a20152611f390152600081816103d401526108df01526000818161058601526113780152600081816105520152611c5b0152613bb26000f3fe60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561054c57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000000000000000000000000000000000000000000092505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000000000000000000000000000000000000000000000816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f00000000000000000000000000000000000000000000000000000000000000005b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f00000000000000000000000000000000000000000000000000000000000000005b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f0000000000000000000000000000000000000000000000000000000000000000169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f00000000000000000000000000000000000000000000000000000000000000005b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220673ba775a9e9027f7796ba830c6cc31583ba0bdffbfd7ffbf013c44b6ee8d08b64736f6c63430008170033000000000000000000000000980b62da83eff3d4576c647993b0c1d7faf17c73000000000000000000000000248ab79bbb9bc29bb72f7cd42f17e054fc40188e000000000000000000000000992f9e3a81c77cb940a29311558343e1ac66c40f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe99000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030d9ec84dc994bbf2500efcca1fba0bf0786cc7685d8cd9f81a0b7ac3fd6adc61e28f828145784c36c0c665c8ab6dde53c8bd0cbe5da65e3f33b51fea7a4da4ecbaec3e0ec4cdaab86d67f8057f9491828210cbd617743ede1cc69e518e61331700000000000000000000000000000000000000000000000000000000", + "from": "0x0c1c9049564269275059032Fb484Aa2e7Ab779af", + "gasLimit": "4624706", + "gasPrice": "100000000", + "hash": "0x5e5a0b728a83809ea2c88090d67c391e45989655b0e56bd7f6b27a31114a568d", + "maxFeePerGas": "200000000", + "maxPriorityFeePerGas": "0", + "nonce": 97, + "signature": { + "networkV": null, + "r": "0xd25d47f168b4f143570e1ba06ae3e3f3bd0fd0f3a3259b58a979dcf71b20fd04", + "s": "0x0bd8786bb52c0ae143c98c6f0cfea5340fb9200b646fcf18b218c00e95c41f87", + "v": 28 + }, + "to": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", + "type": 2, + "value": "0" + } + } + ], + "merkleRoot": "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1", + "solcInputHashes": [ + "f096d2968ac6c775921975b16cb0c91e" + ], + "safeAddress": "0x4bDf5A13e7a25F88dd5321a979e0E54c13DF83E8", + "moduleAddress": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", + "executorAddress": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", + "nonce": "1", + "chainId": "421614", + "actions": [ + { + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "value": "0", + "txData": "0x4a424275796261636b486f6f6b000000000000000000000000000000000000006101406040523480156200001257600080fd5b5060405162003e4938038062003e49833981016040819052620000359162000156565b806001600160a01b031663f434c9146040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009a9190620001be565b6001600160a01b039081166080528481166101205282811660c05281811660e081905290841660a0526040805163293c499960e01b8152905163293c4999916004808201926020929091908290030181865afa158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001259190620001be565b6001600160a01b03166101005250620001e592505050565b6001600160a01b03811681146200015357600080fd5b50565b600080600080608085870312156200016d57600080fd5b84516200017a816200013d565b60208601519094506200018d816200013d565b6040860151909350620001a0816200013d565b6060860151909250620001b3816200013d565b939692955090935050565b600060208284031215620001d157600080fd5b8151620001de816200013d565b9392505050565b60805160a05160c05160e0516101005161012051613bb262000297600039600081816104660152818161133801528181611857015281816119cf01528181611aae0152611d550152600081816102970152818161072c01528181610f49015261109001526000818161051e01528181610e14015281816111a20152611f390152600081816103d401526108df01526000818161058601526113780152600081816105520152611c5b0152613bb26000f3fe60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561054c57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000000000000000000000000000000000000000000092505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000000000000000000000000000000000000000000000816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f00000000000000000000000000000000000000000000000000000000000000005b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f00000000000000000000000000000000000000000000000000000000000000005b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f0000000000000000000000000000000000000000000000000000000000000000169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f00000000000000000000000000000000000000000000000000000000000000005b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220673ba775a9e9027f7796ba830c6cc31583ba0bdffbfd7ffbf013c44b6ee8d08b64736f6c63430008170033000000000000000000000000980b62da83eff3d4576c647993b0c1d7faf17c73000000000000000000000000248ab79bbb9bc29bb72f7cd42f17e054fc40188e000000000000000000000000992f9e3a81c77cb940a29311558343e1ac66c40f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe99", + "gas": "3920428", + "operation": 0, + "requireSuccess": true + } + ], + "sphinxConfig": { + "projectName": "nana-buyback-hook-testnet", + "orgId": "my-org-id", + "owners": [ + "0xba5ed94ab173e1242638F28d1449b24F1A883292" + ], + "mainnets": [ + "ethereum", + "optimism", + "base", + "arbitrum" + ], + "testnets": [ + "ethereum_sepolia", + "optimism_sepolia", + "base_sepolia", + "arbitrum_sepolia" + ], + "threshold": "1", + "saltNonce": "15" + }, + "executionMode": 2, + "initialState": { + "isSafeDeployed": true, + "isModuleDeployed": true, + "isExecuting": false + }, + "unlabeledContracts": [], + "arbitraryChain": false, + "libraries": [], + "gitCommit": "9caaedd7d4d116463c4ceecb3147a8863f806dab", + "safeInitData": null +} \ No newline at end of file diff --git a/deployments/nana-buyback-hook-testnet/base_sepolia/JBBuybackHook.json b/deployments/nana-buyback-hook-testnet/base_sepolia/JBBuybackHook.json index a3cdba5..399d183 100644 --- a/deployments/nana-buyback-hook-testnet/base_sepolia/JBBuybackHook.json +++ b/deployments/nana-buyback-hook-testnet/base_sepolia/JBBuybackHook.json @@ -1,8 +1,8 @@ { "_format": "sphinx-sol-ct-artifact-1", - "merkleRoot": "0xdf51ca1fa6bf804fc5dfbf513fb7282e053f136c07f7c4f9b3a95012943e1a10", + "merkleRoot": "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1", "contractName": "JBBuybackHook", - "address": "0xA82AEBC61E887b51B60CF2042e5ac95Bc47D4944", + "address": "0x691E7e0262A60AA77043993e151F1A96Bb063389", "abi": [ { "type": "constructor", @@ -349,7 +349,7 @@ "internalType": "uint256" }, { - "name": "reservedRate", + "name": "reservedPercent", "type": "uint256", "internalType": "uint256" }, @@ -967,86 +967,86 @@ "inputs": [] } ], - "solcInputHash": "347fff29e2440260967cc55cc0a76014", + "solcInputHash": "f096d2968ac6c775921975b16cb0c91e", "receipt": { - "blockHash": "0x6d41409ac456f79971586b1b1972d79dc3cd2e8e53ea8c879b68f16fcd96fd63", - "blockNumber": 12869393, + "blockHash": "0xcf5dca4623a4f3a9ef7ee2dc20041d5a9ce3e2df787610db9c189caf14faedd0", + "blockNumber": 12910636, "contractAddress": null, - "cumulativeGasUsed": "3720815", + "cumulativeGasUsed": "4482142", "from": "0x0c1c9049564269275059032Fb484Aa2e7Ab779af", - "gasPrice": "1984524", - "gasUsed": "3569056", - "hash": "0xd1943ff618bac3d25f9fbd9a7ffa47140016e6f76a4ac2b694ee6830f0b308bf", - "index": 6, + "gasPrice": "1971455", + "gasUsed": "3569078", + "hash": "0x0031884d3a925d2c45458e9ca941d71f2cc0a59e61d49acaf0d7f04141eb73ce", + "index": 5, "logs": [ { "address": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", - "blockHash": "0x6d41409ac456f79971586b1b1972d79dc3cd2e8e53ea8c879b68f16fcd96fd63", - "blockNumber": 12869393, + "blockHash": "0xcf5dca4623a4f3a9ef7ee2dc20041d5a9ce3e2df787610db9c189caf14faedd0", + "blockNumber": 12910636, "data": "0x0000000000000000000000000000000000000000000000000000000000000000", - "index": 0, + "index": 19, "topics": [ "0x572f161235911da04685a68c06adf558fc7e4a36909dca394650e0adc19cc93d", "0x0000000000000000000000000c1c9049564269275059032fb484aa2e7ab779af", "0x000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4", - "0xbd0f4deb792892a041809af5fd1bbde3a3975eae1c230033e2a8e0f9abb3d189" + "0x45cd83b0bda3e64b4a35b9b8050d4a58bbaee9bd49759b4fcbc0c6185bd7c1ba" ], - "transactionHash": "0xd1943ff618bac3d25f9fbd9a7ffa47140016e6f76a4ac2b694ee6830f0b308bf", - "transactionIndex": 6 + "transactionHash": "0x0031884d3a925d2c45458e9ca941d71f2cc0a59e61d49acaf0d7f04141eb73ce", + "transactionIndex": 5 }, { "address": "0x4bDf5A13e7a25F88dd5321a979e0E54c13DF83E8", - "blockHash": "0x6d41409ac456f79971586b1b1972d79dc3cd2e8e53ea8c879b68f16fcd96fd63", - "blockNumber": 12869393, + "blockHash": "0xcf5dca4623a4f3a9ef7ee2dc20041d5a9ce3e2df787610db9c189caf14faedd0", + "blockNumber": 12910636, "data": "0x", - "index": 1, + "index": 20, "topics": [ "0x6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8", "0x000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4" ], - "transactionHash": "0xd1943ff618bac3d25f9fbd9a7ffa47140016e6f76a4ac2b694ee6830f0b308bf", - "transactionIndex": 6 + "transactionHash": "0x0031884d3a925d2c45458e9ca941d71f2cc0a59e61d49acaf0d7f04141eb73ce", + "transactionIndex": 5 }, { "address": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", - "blockHash": "0x6d41409ac456f79971586b1b1972d79dc3cd2e8e53ea8c879b68f16fcd96fd63", - "blockNumber": 12869393, + "blockHash": "0xcf5dca4623a4f3a9ef7ee2dc20041d5a9ce3e2df787610db9c189caf14faedd0", + "blockNumber": 12910636, "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "index": 2, + "index": 21, "topics": [ "0xa65fb05c5808f5f389d72edeaf719ce38f4cc55c1f69ca3cbfb31c21501caa07", - "0xdf51ca1fa6bf804fc5dfbf513fb7282e053f136c07f7c4f9b3a95012943e1a10" + "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1" ], - "transactionHash": "0xd1943ff618bac3d25f9fbd9a7ffa47140016e6f76a4ac2b694ee6830f0b308bf", - "transactionIndex": 6 + "transactionHash": "0x0031884d3a925d2c45458e9ca941d71f2cc0a59e61d49acaf0d7f04141eb73ce", + "transactionIndex": 5 }, { "address": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", - "blockHash": "0x6d41409ac456f79971586b1b1972d79dc3cd2e8e53ea8c879b68f16fcd96fd63", - "blockNumber": 12869393, + "blockHash": "0xcf5dca4623a4f3a9ef7ee2dc20041d5a9ce3e2df787610db9c189caf14faedd0", + "blockNumber": 12910636, "data": "0x", - "index": 3, + "index": 22, "topics": [ "0x4383d976757d67ca920616be0b6430a681ea9d3dcce8d6d61d4603ca4a9bff63", - "0xdf51ca1fa6bf804fc5dfbf513fb7282e053f136c07f7c4f9b3a95012943e1a10" + "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1" ], - "transactionHash": "0xd1943ff618bac3d25f9fbd9a7ffa47140016e6f76a4ac2b694ee6830f0b308bf", - "transactionIndex": 6 + "transactionHash": "0x0031884d3a925d2c45458e9ca941d71f2cc0a59e61d49acaf0d7f04141eb73ce", + "transactionIndex": 5 } ], - "logsBloom": "0x00000000004010000000000000080000000000000000210000000000004000010080000000000000000000000040020000000000000000000000000000000000000000000000200000000000000000000000000000000000800000000000000000000000000000000000000000000000004000000400000000100000000000000000000000000000000100000000000000000800000040000000000000000000004000800001000000000000000000002200000400000000100000000004000000000002000000000000000000000000000000000008000000000000000000000000000000000008000000000000000200000000000080100000000008000000", + "logsBloom": "0x00000000000210000000000000080000000000000000010000000000004000000080000000000000000000000040020000000000000000000000000000080000000000000000200000000000000000040000000000000000800000000000000000000000000000008000000000000000004000000400000000000000000000000000000000000000000100000000000000000800000000000000000008000000004000800001000000000000000000002200000000000000100000000004020000000002000000000000000000000000000000000008000000000000000000000000000000000008000000000000000200000000000080100000000008000000", "status": 1, "to": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463" }, - "metadata": "{\"compiler\":{\"version\":\"0.8.23+commit.f704f362\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IWETH9\",\"name\":\"weth\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"internalType\":\"contract IJBDirectory\",\"name\":\"directory\",\"type\":\"address\"},{\"internalType\":\"contract IJBController\",\"name\":\"controller\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InsufficientPayAmount\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InvalidTwapSlippageTolerance\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InvalidTwapWindow\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"NoProjectToken\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"denominator\",\"type\":\"uint256\"}],\"type\":\"error\",\"name\":\"PRBMath_MulDiv_Overflow\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"PoolAlreadySet\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"SpecifiedSlippageExceeded\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"T\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"UNAUTHORIZED\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"Unauthorized\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"tokenCount\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"Mint\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\",\"indexed\":true},{\"internalType\":\"address\",\"name\":\"newPool\",\"type\":\"address\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"PoolAdded\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"pool\",\"type\":\"address\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"amountOut\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"Swap\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"oldTwapTolerance\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"newTwapTolerance\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"TwapSlippageToleranceChanged\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"oldSecondsAgo\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"newSecondsAgo\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"TwapWindowChanged\",\"anonymous\":false},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"CONTROLLER\",\"outputs\":[{\"internalType\":\"contract IJBController\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"DIRECTORY\",\"outputs\":[{\"internalType\":\"contract IJBDirectory\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MAX_TWAP_SLIPPAGE_TOLERANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MAX_TWAP_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MIN_TWAP_SLIPPAGE_TOLERANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MIN_TWAP_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"PERMISSIONS\",\"outputs\":[{\"internalType\":\"contract IJBPermissions\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"PROJECTS\",\"outputs\":[{\"internalType\":\"contract IJBProjects\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"TWAP_SLIPPAGE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"UNISWAP_V3_FACTORY\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"WETH\",\"outputs\":[{\"internalType\":\"contract IWETH9\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"struct JBAfterPayRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"amount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"forwardedAmount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"projectTokenCount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"hookMetadata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"payerMetadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"payable\",\"type\":\"function\",\"name\":\"afterPayRecordedWith\"},{\"inputs\":[{\"internalType\":\"struct JBBeforePayRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"terminal\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"amount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reservedRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"beforePayRecordedWith\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"struct JBPayHookSpecification[]\",\"name\":\"hookSpecifications\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"contract IJBPayHook\",\"name\":\"hook\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}]},{\"inputs\":[{\"internalType\":\"struct JBBeforeRedeemRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"terminal\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"holder\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"redeemCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"surplus\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"bool\",\"name\":\"useTotalSurplus\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"redemptionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"beforeRedeemRecordedWith\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"struct JBRedeemHookSpecification[]\",\"name\":\"hookSpecifications\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"contract IJBRedeemHook\",\"name\":\"hook\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"hasMintPermissionFor\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"poolOf\",\"outputs\":[{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"projectTokenOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"uint32\",\"name\":\"twapWindow\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"twapSlippageTolerance\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setPoolFor\",\"outputs\":[{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"newPool\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newSlippageTolerance\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setTwapSlippageToleranceOf\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"newWindow\",\"type\":\"uint32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setTwapWindowOf\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"twapSlippageToleranceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"twapWindowOf\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}]},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"amount0Delta\",\"type\":\"int256\"},{\"internalType\":\"int256\",\"name\":\"amount1Delta\",\"type\":\"int256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"uniswapV3SwapCallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"afterPayRecordedWith((address,uint256,uint256,(address,uint8,uint32,uint256),(address,uint8,uint32,uint256),uint256,uint256,address,bytes,bytes))\":{\"details\":\"This function is only called if the minimum return from the swap exceeds the return from minting by paying the project. If the swap reverts (due to slippage, insufficient liquidity, or something else), then the hook mints the number of tokens which a payment to the project would have minted.\",\"params\":{\"context\":\"The pay context passed in by the terminal.\"}},\"beforePayRecordedWith((address,address,(address,uint8,uint32,uint256),uint256,uint256,address,uint256,uint256,bytes))\":{\"params\":{\"context\":\"Payment context passed to the data hook by `terminalStore.recordPaymentFrom(...)`. `context.metadata` can specify a Uniswap quote and specify how much of the payment should be used to swap. If `context.metadata` does not specify a quote, one will be calculated based on the TWAP. If `context.metadata` does not specify how much of the payment should be used, the hook uses the full amount paid in.\"},\"returns\":{\"hookSpecifications\":\"Specifications containing pay hooks, as well as the amount and metadata to send to them. Fulfilled by the terminal. If tokens are only being minted, `hookSpecifications` will be empty.\",\"weight\":\"The weight to use. If tokens are being minted from the project, this is the original weight. If tokens are being bought from the pool, the weight is 0. If tokens are being minted AND bought from the pool, this weight is adjusted to take both into account.\"}},\"beforeRedeemRecordedWith((address,address,uint256,uint256,uint256,uint256,(address,uint8,uint32,uint256),bool,uint256,bytes))\":{\"details\":\"Pass redeem context back to the terminal without changes.\",\"params\":{\"context\":\"The redeem context passed in by the terminal.\"}},\"constructor\":{\"params\":{\"controller\":\"The controller used to mint and burn tokens.\",\"directory\":\"The directory of terminals and controllers.\",\"factory\":\"The address of the Uniswap v3 factory. Used to calculate pool addresses.\",\"weth\":\"The WETH contract.\"}},\"setPoolFor(uint256,uint24,uint32,uint256,address)\":{\"details\":\"Uses create2 for callback auth and to allow adding pools which haven't been deployed yet. This can be called by the project's owner or an address which has the `JBPermissionIds.SET_BUYBACK_POOL` permission from the owner.\",\"params\":{\"fee\":\"The fee used in the pool being set, as a fixed-point number of basis points with 2 decimals. A 0.01% fee is `100`, a 0.05% fee is `500`, a 0.3% fee is `3000`, and a 1% fee is `10000`.\",\"projectId\":\"The ID of the project to set the pool for.\",\"terminalToken\":\"The address of the terminal token that payments to the project are made in.\",\"twapSlippageTolerance\":\"The maximum spread allowed between the amount received and the TWAP.\",\"twapWindow\":\"The period of time over which the TWAP is computed.\"},\"returns\":{\"newPool\":\"The pool that was set for the project and terminal token.\"}},\"setTwapSlippageToleranceOf(uint256,uint256)\":{\"details\":\"This can be called by the project's owner or an address with `JBPermissionIds.SET_BUYBACK_TWAP` permission from the owner.\",\"params\":{\"newSlippageTolerance\":\"The new TWAP slippage tolerance, out of `TWAP_SLIPPAGE_DENOMINATOR`.\",\"projectId\":\"The ID of the project to set the TWAP slippage tolerance of.\"}},\"setTwapWindowOf(uint256,uint32)\":{\"details\":\"This can be called by the project's owner or an address with `JBPermissionIds.SET_BUYBACK_TWAP` permission from the owner.\",\"params\":{\"newWindow\":\"The new TWAP window.\",\"projectId\":\"The ID of the project to set the TWAP window of.\"}},\"supportsInterface(bytes4)\":{\"details\":\"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.\"},\"twapSlippageToleranceOf(uint256)\":{\"details\":\"The \\\"TWAP slippage tolerance\\\" is the maximum negative spread between the TWAP and the expected return from a swap. If the expected return unfavourably exceeds the TWAP slippage tolerance, the swap will revert.\",\"params\":{\"projectId\":\"The ID of the project which the TWAP slippage tolerance applies to.\"},\"returns\":{\"_0\":\"tolerance The maximum slippage allowed relative to the TWAP, as a percent out of `TWAP_SLIPPAGE_DENOMINATOR`.\"}},\"twapWindowOf(uint256)\":{\"details\":\"The \\\"TWAP window\\\" is the period over which the TWAP is computed.\",\"params\":{\"projectId\":\"The ID of the project which the TWAP window applies to.\"},\"returns\":{\"_0\":\"secondsAgo The TWAP window in seconds.\"}},\"uniswapV3SwapCallback(int256,int256,bytes)\":{\"params\":{\"amount0Delta\":\"The amount of token 0 being used for the swap.\",\"amount1Delta\":\"The amount of token 1 being used for the swap.\",\"data\":\"Data passed in by the swap operation.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"CONTROLLER()\":{\"notice\":\"The controller used to mint and burn tokens.\"},\"DIRECTORY()\":{\"notice\":\"The directory of terminals and controllers.\"},\"MAX_TWAP_SLIPPAGE_TOLERANCE()\":{\"notice\":\"Projects cannot specify a TWAP slippage tolerance larger than this constant (out of `MAX_SLIPPAGE`).\"},\"MAX_TWAP_WINDOW()\":{\"notice\":\"Projects cannot specify a TWAP window longer than this constant.\"},\"MIN_TWAP_SLIPPAGE_TOLERANCE()\":{\"notice\":\"Projects cannot specify a TWAP slippage tolerance smaller than this constant (out of `MAX_SLIPPAGE`).\"},\"MIN_TWAP_WINDOW()\":{\"notice\":\"Projects cannot specify a TWAP window shorter than this constant.\"},\"PERMISSIONS()\":{\"notice\":\"A contract storing permissions.\"},\"PROJECTS()\":{\"notice\":\"The project registry.\"},\"TWAP_SLIPPAGE_DENOMINATOR()\":{\"notice\":\"The denominator used when calculating TWAP slippage percent values.\"},\"UNISWAP_V3_FACTORY()\":{\"notice\":\"The address of the Uniswap v3 factory. Used to calculate pool addresses.\"},\"WETH()\":{\"notice\":\"The wETH contract.\"},\"afterPayRecordedWith((address,uint256,uint256,(address,uint8,uint32,uint256),(address,uint8,uint32,uint256),uint256,uint256,address,bytes,bytes))\":{\"notice\":\"Swap the specified amount of terminal tokens for project tokens, using any leftover terminal tokens to mint from the project.\"},\"beforePayRecordedWith((address,address,(address,uint8,uint32,uint256),uint256,uint256,address,uint256,uint256,bytes))\":{\"notice\":\"The `IJBRulesetDataHook` implementation which determines whether tokens should be minted from the project or bought from the pool.\"},\"beforeRedeemRecordedWith((address,address,uint256,uint256,uint256,uint256,(address,uint8,uint32,uint256),bool,uint256,bytes))\":{\"notice\":\"To fulfill the `IJBRulesetDataHook` interface.\"},\"hasMintPermissionFor(uint256,address)\":{\"notice\":\"Required by the `IJBRulesetDataHook` interfaces. Return false to not leak any permissions.\"},\"poolOf(uint256,address)\":{\"notice\":\"The Uniswap pool where a given project's token and terminal token pair are traded.\"},\"projectTokenOf(uint256)\":{\"notice\":\"The address of each project's token.\"},\"setPoolFor(uint256,uint24,uint32,uint256,address)\":{\"notice\":\"Set the pool to use for a given project and terminal token (the default for the project's token <-> terminal token pair).\"},\"setTwapSlippageToleranceOf(uint256,uint256)\":{\"notice\":\"Set the TWAP slippage tolerance for a project. The TWAP slippage tolerance is the maximum spread allowed between the amount received and the TWAP.\"},\"setTwapWindowOf(uint256,uint32)\":{\"notice\":\"Change the TWAP window for a project. The TWAP window is the period of time over which the TWAP is computed.\"},\"twapSlippageToleranceOf(uint256)\":{\"notice\":\"Get the TWAP slippage tolerance for a given project ID.\"},\"twapWindowOf(uint256)\":{\"notice\":\"Get the TWAP window for a given project ID.\"},\"uniswapV3SwapCallback(int256,int256,bytes)\":{\"notice\":\"The Uniswap v3 pool callback where the token transfer is expected to happen.\"}},\"version\":1}},\"settings\":{\"remappings\":[\"@bananapus/=node_modules/@bananapus/\",\"@chainlink/=node_modules/@chainlink/\",\"@eth-optimism/=node_modules/@eth-optimism/\",\"@exhausted-pigeon/=node_modules/@exhausted-pigeon/\",\"@openzeppelin/=node_modules/@openzeppelin/\",\"@prb/=node_modules/@prb/\",\"@scroll-tech/=node_modules/@scroll-tech/\",\"@sphinx-labs/contracts/=node_modules/@sphinx-labs/contracts/contracts/foundry/\",\"@uniswap/=node_modules/@uniswap/\",\"base64-sol/=node_modules/base64-sol/\",\"ds-test/=lib/forge-std/lib/ds-test/src/\",\"forge-std/=lib/forge-std/src/\",\"hardhat/=node_modules/hardhat/\",\"solmate/=node_modules/solmate/\",\"sphinx/=lib/sphinx/packages/contracts/contracts/forge-std/src/\"],\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"compilationTarget\":{\"src/JBBuybackHook.sol\":\"JBBuybackHook\"},\"evmVersion\":\"paris\",\"libraries\":{}},\"sources\":{\"node_modules/@bananapus/core/src/abstract/JBPermissioned.sol\":{\"keccak256\":\"0x6486c11bff6384bfa938feb7aaacc977f457abff25b17b9aa094077d3fef71f8\",\"urls\":[\"bzz-raw://8b5190202326b6499391d5128cdb2d9ff44e91cd9ba6d8a5fe01e6f21259270d\",\"dweb:/ipfs/QmR2ufPwHtCAZYkJoyWyyag6BfdaWpaLk7VhuDc6BRLqVe\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/enums/JBApprovalStatus.sol\":{\"keccak256\":\"0x61c69b6bac7d24b566d87cda23a77e4ca9cdb87200b106aba8534cb9a0973e33\",\"urls\":[\"bzz-raw://6a9ca7249de76f77a8252eefe6bd1b63d47952f25a2acfa2c8db967cdff4470c\",\"dweb:/ipfs/QmaxSxptRQNj8bNy96EreENmrnRWdKmhyihBcxyWzBX5BN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBController.sol\":{\"keccak256\":\"0xc29d388bc66931c8f236d9e27f0414120323584258c3557f7d93be053f24bafd\",\"urls\":[\"bzz-raw://628aab4035065cd043cff54436cd21db92f7551899ff42f4ee60a4fec6839276\",\"dweb:/ipfs/QmbdSuUYQL9RYkR97hDVLZw82R7o6p2vEBpPamgqUpHiE4\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBDirectory.sol\":{\"keccak256\":\"0x9cc380844aef60078ee47a61861e55a29c4a8c947efd556ebd36e6909f7b9d62\",\"urls\":[\"bzz-raw://9f5190ec8b6683d9781ee6e9eedcc91294753242748875d4a06349077e4cbaaf\",\"dweb:/ipfs/QmTQrPuXT9TCA4txwrperMeXSGvGxP8iokUK47f62F388i\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBDirectoryAccessControl.sol\":{\"keccak256\":\"0x1e67f56849320a46f834aaa9bd62b170ff8ada7b224b4a81136193740fa0be4d\",\"urls\":[\"bzz-raw://ea8fbcec44abfe49d137bcae129b67e5479d6b17879301f88534c8a7fab00be4\",\"dweb:/ipfs/QmT6wrtYX4GRpffHUzupNwYebJ1dqkkKZLEewWsoyunsqw\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFeeTerminal.sol\":{\"keccak256\":\"0xdb6f3349cbe2078faa8421dec892136693748d8a60b70a1dee3bce2cfc5274fc\",\"urls\":[\"bzz-raw://ccc6a67fc72726c6180c41523cc2a43562864347770a86ff54532fb6ca09e7c3\",\"dweb:/ipfs/QmZinV1LoRsmTq713YGvNShaPtGaxLqwJ6u2EwwGKEKCgu\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFeelessAddresses.sol\":{\"keccak256\":\"0xe5df42cfa71c5fa41b905c122de5825df13c2aab2f9cc4cf4bafa331dd69c27e\",\"urls\":[\"bzz-raw://3773bf3b42cc57d1e4086147e52135ff1dbff4309c45ca0398f821dfaa071563\",\"dweb:/ipfs/QmXUEJssHaxYKfV33tMZGf81JTR5a5yxEVshzNus84xLuT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFundAccessLimits.sol\":{\"keccak256\":\"0xf5fd6bdd723b60d490ccbe22cdf1cfe43663d23e6ee48badcd1b71e3282cb16b\",\"urls\":[\"bzz-raw://fe692f0b843ea5fccdfcb68f4ec16e1c0add945bb74b303c9866342be0e31fbf\",\"dweb:/ipfs/QmSRmzpgp3DhNEhNDiLsSu7yEiTeywbzEFbwyGyDazjgKt\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBMultiTerminal.sol\":{\"keccak256\":\"0xc7b4f5043ec5733f5b303688f3dbf475ef5f6fe12364847a538c8b48a2137fb7\",\"urls\":[\"bzz-raw://fcd1b41a2acfd035e285e6f20f983b9b00a4e00c688a3072062dfb7f5c9c5afe\",\"dweb:/ipfs/QmYCfjakBGxWWTvb5Pk9UAeguwiWrnsNviQWMsaYz7Xq5N\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPayHook.sol\":{\"keccak256\":\"0x9438866782c652c2942f4d114e35f393cd3c8b0334abce8387eed90bca35e8b2\",\"urls\":[\"bzz-raw://cfd99daf57213f92325aad7d7d16e98476d38e870470e95ba01e3ae3cdecc95d\",\"dweb:/ipfs/QmUKKAVGf7ki8BHksr99tFcRW8APveeB5tNH63ctTbbCW8\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPayoutTerminal.sol\":{\"keccak256\":\"0xd0f9374470591c4afb2525c9c7b1bdad577765857c404b22ee5d8d2997a18fad\",\"urls\":[\"bzz-raw://4529c066b2014ee64b8fb16981a9fd5badf64dea7ac6c07dd1b1e7ab5cdc1d8a\",\"dweb:/ipfs/QmYxTdPjRAZ8iThUoNmJuivEaRaB3xXpyHdhCU7my1UHZy\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermissioned.sol\":{\"keccak256\":\"0x5b038d4dee116584e88b230920e56d48e135053e3f7e5642eaea14a775c1dad7\",\"urls\":[\"bzz-raw://19e43102f349fd4a1da1c0943ffb8f2950007fe4bb4bb7e8f74fc142575d091b\",\"dweb:/ipfs/QmXHAt4KzDTdDZgDDefEXH2WKi7NcfkJb9R7nxW5uDqsNp\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermissions.sol\":{\"keccak256\":\"0x49d2b91a866004af098a6770b28040071885b048b4b50744b12a1e5b212c5e5e\",\"urls\":[\"bzz-raw://089b4dda50be91412ffe1fbe333f78cc894f073c1a7afe469f10a2cee12fbf9e\",\"dweb:/ipfs/QmYPPBZ6HwBa1RNkNGqGcR2xgj4fnWBzrPHHoJG3kZA6AN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermitTerminal.sol\":{\"keccak256\":\"0xd6bd30842273f5b794f82219fefdd4953f5343328d2cfdb684b7d826cc0c769c\",\"urls\":[\"bzz-raw://ca1195fd5572060b36fc7e45f46d59f974e3a908248edcfadeb8cb06247075f0\",\"dweb:/ipfs/QmYTpDXKTXqi8GQFsNqB8LiGFTZjSPY3PA8vKqZBraVdqD\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPriceFeed.sol\":{\"keccak256\":\"0x4bd84c0f1a5d4729ed709bcddd43f4c50ec4a165ece79780af8dce482ed07d4a\",\"urls\":[\"bzz-raw://62bac4bfb6982fb002f620c77e5c445e62d50241a5aa64a07e51d929f5a42180\",\"dweb:/ipfs/QmWgJUDreVY2BuMX38a1iUUR5kNbMwGnKG3VvurB7oZtuM\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPrices.sol\":{\"keccak256\":\"0xa4988a8984774e9f9d355236e3c4ab67868503964747684d989ceb54a4176361\",\"urls\":[\"bzz-raw://7496393b49f8a594e6bc3393ffab118e4dc95f69233c77046cd552b1c52a533a\",\"dweb:/ipfs/QmavDESpty7XFmLgWKMHb3venZVPGwwKevWmYStM2mxcPH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBProjectUriRegistry.sol\":{\"keccak256\":\"0x2799475228987e4f8334ac33d3935f759c9b8133db7383b4f622dde7a5dc0502\",\"urls\":[\"bzz-raw://d751731740f45df74eea48c9667e847ee2cddb2980ab4939c86bd17e6c6ed89b\",\"dweb:/ipfs/QmXW8SLTuhdUpfn7pRpdsYdcyuim8RTyagU37ULcj5UZhT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBProjects.sol\":{\"keccak256\":\"0x735c2fb8f1fa827f054ee77f7a0ae4b312656217acb75b624d2c8fd9dc40151b\",\"urls\":[\"bzz-raw://ee7fc92299a8633a80693ae63ab494dcd125f1789487a54a39dc0e5696e5996f\",\"dweb:/ipfs/QmX7YJD4pS2XhgQb7p3JbBAXynT7YGPXcZe92BiWWRrsCL\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRedeemHook.sol\":{\"keccak256\":\"0x8ab46fcd7d0e739661eb76056ad93ff99106f38420ef0b4eb97fa9f4bb71a68a\",\"urls\":[\"bzz-raw://0ef96fcb7ad26281d444d8e0c677b25114fdd63b1c172d477e030dce8ba53b62\",\"dweb:/ipfs/Qmcx1jRQuwU4pZFuLxsSsx4oMbRaDfktHrPnXextgbWc5m\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRedeemTerminal.sol\":{\"keccak256\":\"0xd1b4aa38154e08f1474745ea6bc8f8823fe8aa68c124d596742597f2296ea16d\",\"urls\":[\"bzz-raw://9bd254e833702dfe5e28db5fee76478947ab45b501c966501f719e73bbf0397a\",\"dweb:/ipfs/QmZ3Ng7TmVxL6ozSUhx4kYdQdZhoYi4t43cYZVAMz7Fn5M\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesetApprovalHook.sol\":{\"keccak256\":\"0x592e95d159494421c6b1bcb362d0cee1df0132921697351304e9cd7af4fbd386\",\"urls\":[\"bzz-raw://5bebfd5fa67c1b6ea16fa2e76e9520e9dfe52a579f48dd94d0c2ec45f78ad178\",\"dweb:/ipfs/QmRUawEGtfYoYSHmHELGhvJoWuMsxLPKtqAXgsrb7fJboP\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesetDataHook.sol\":{\"keccak256\":\"0x13b4b9f4b847f62442da1c1a59b399f8f201b31a28edb96aa5a8a78ad57c24d0\",\"urls\":[\"bzz-raw://4fcd00b77d0f40cf6d5ee6590b6ef4ee1f606e89ae4c4faed3710fb462108f8e\",\"dweb:/ipfs/QmeoE54DQ3eGw9EDXfN7aTMmEjubAtirahmytDijo6GSeE\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesets.sol\":{\"keccak256\":\"0x011d86a1ea51aed45ee83ce7b289e7abd231074ce1a12e53faa194811d5334c0\",\"urls\":[\"bzz-raw://c7d03e746e28f6d381c4a81e1b7599f01b84fa52e97106105f7a402f689b6395\",\"dweb:/ipfs/QmT7nWeCGnPaBQuCKFpmoZNiXzkCWCVLZJJAf9i4D6xNJg\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBSplitHook.sol\":{\"keccak256\":\"0xeb8dfac7a4b81897a1c3b5d0d853a406bcff33720fb187d5ca5bb3dcc0ba3a12\",\"urls\":[\"bzz-raw://36aaeef6107cfe5b0127e063ea215aac7200f8af02e28a48e61111abd3254688\",\"dweb:/ipfs/QmQ8yQANXnhQCAWBGKsKCDsJ3A8hnTKNg5tyo79GfWXTcV\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBSplits.sol\":{\"keccak256\":\"0xd8894cfc55560d914f413e40c981165e1e9dc845b35cdf0ecd13fd118733a483\",\"urls\":[\"bzz-raw://e03b8e5e34c924a91884e3ef79ea039292f8927241698db84a09a463ced4cc52\",\"dweb:/ipfs/QmSqhVX2LSStR7xEcc96zAiQpTPDSsZBn8YvH33CtiU1FN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTerminal.sol\":{\"keccak256\":\"0x8981b96902125707c49c63867b718118fdfb04cb8fd42b038d93ef87ea56f85c\",\"urls\":[\"bzz-raw://7b172c6924a10431652eab136758953a51af8d709a55afff1533d13e687be60c\",\"dweb:/ipfs/QmWczAk48Jw8qNgrUn4EFRK25CrmCp7MmEaJsGtTXueaEb\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTerminalStore.sol\":{\"keccak256\":\"0x140159d66d729f6aeed0fe1f7c655619985146ec00e8c68cbd9b5d30d4dc7d23\",\"urls\":[\"bzz-raw://f972ecb52bcfcd2852c9e7264b1ecc504ce94bd6e12c034b93c1768cd372954e\",\"dweb:/ipfs/QmRu7in5iJSWHLTcFPbJmiK1rCHFbwNY7qzY4cG6kgfYcr\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBToken.sol\":{\"keccak256\":\"0x71b1f9c3a0edd41910f77396e0be2c65596571176d53eb87e887c3c0da56c0fb\",\"urls\":[\"bzz-raw://6e956f0582f4525e83d845ee9b4a89959abc4f821414f6accbbee5b38960482d\",\"dweb:/ipfs/QmbSvjgmCgnfVmcCTGu8XwrV1Rufsf3M8hB8unFq6fTMdH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTokenUriResolver.sol\":{\"keccak256\":\"0xfa5cb00dcd6085d1ef912d071fe73c63f9478a2cd0f9d8bddaf659b6af2d0967\",\"urls\":[\"bzz-raw://282e4e7c342d65f77cde0e9a08fcaf20ef5cf379c7a48b639842c0ffd0b2afb8\",\"dweb:/ipfs/QmbnN3PEQeZaXdPLT75V1J79kMg7KqSMru37RHrL3z8Yf2\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTokens.sol\":{\"keccak256\":\"0x6fd67af915dd541d9547c8297aa9ae269690e4ee23531db43f021bcacec6076f\",\"urls\":[\"bzz-raw://2e5e11954e9ab2319fffccb6563f3db400b8f7760d4ffe2165048a02c9c37fa6\",\"dweb:/ipfs/QmbDXtV83dK8EfiTjsTRf55R2XqPZzDKcjtYbW8sxQ5CFm\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/libraries/JBConstants.sol\":{\"keccak256\":\"0xf7994eb0ab6979633ad42bf274f7679dcfcc81e0a35fe931d35b663ba6cb808f\",\"urls\":[\"bzz-raw://b6caec5469c07153fc7b9d6f2e1370e3da4e6386829a1fe99e02526464754610\",\"dweb:/ipfs/QmRXsoUc1FzxFHLvNQvxjZMRaiovdeTskcA5XZz4AEVGdq\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/libraries/JBMetadataResolver.sol\":{\"keccak256\":\"0xdf32038c5e7f65725e2ef87d09fe04972d7da6a63b60c066d4616b2c2ada5149\",\"urls\":[\"bzz-raw://50582c41ee196ead31d13dcc5a468436d524891d7873743ba92d1d64a0b5783a\",\"dweb:/ipfs/QmPiJMbA1oQnVKQTjqYvUvtWaaiFCeKic8NJtu2crrAznW\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAccountingContext.sol\":{\"keccak256\":\"0x9c47e048a719f784f601df69a583505432217b9868a0244876d277f84dd1ebdf\",\"urls\":[\"bzz-raw://8565f194b87914da9a02af2e760ae2ed2a9d185c6f11229f7035140776d2fec9\",\"dweb:/ipfs/QmPs2fic8W3F5e5zNRwmGmJFjb3JWGPWJ3YUe5o82nQgEn\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAfterPayRecordedContext.sol\":{\"keccak256\":\"0xd26c3a774ff38be79064085970454fe2603a23a638c76270d5b1b3829206c3e8\",\"urls\":[\"bzz-raw://3b55dbe3bf1ef625b7ca04efab3de35406e6041d5b3d82c7265469c500e2b702\",\"dweb:/ipfs/QmUdBDo4Lt3mcsFcsXT2mqq3czFwZjQJFPLM89YA2VtD7k\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAfterRedeemRecordedContext.sol\":{\"keccak256\":\"0x521f5d23a36f0da72362cd84890cc867bd83baa8dc836ba6c5066d51dba2f163\",\"urls\":[\"bzz-raw://6cc461313286dde62d045d6288e87bae5032e035796326f5b1ed6218e58aa9da\",\"dweb:/ipfs/QmQS2AkQwf2ANQieDuaUnpJEdXChoLv4CCbZqHkfywYPSR\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBBeforePayRecordedContext.sol\":{\"keccak256\":\"0x5b04e814da83c7e83ff892ab07eaad6abce6f7b85a75f8da9380e9fc3470bc81\",\"urls\":[\"bzz-raw://11c889aab993fce3e3cc2dedc15fc30dd367e7fef9b7b1bfd6a6a9f248781731\",\"dweb:/ipfs/QmVVtydCD1azeWhGLxA1hthxfLyKzMHZ1eVzCz3a3R5dLy\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBBeforeRedeemRecordedContext.sol\":{\"keccak256\":\"0x73eadaf6827e82f6ccbe3a1e2b2b7fc6c59cef471f73335041b30ddcc000989d\",\"urls\":[\"bzz-raw://2f3ee84662eed565dbdaed406ef836fffaf55cccd417575578152e5085d0b1f2\",\"dweb:/ipfs/QmaJGFS7hxJsiUdKvbv5BKhSwceDEzKBnt7t5YeNWvYgMK\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBCurrencyAmount.sol\":{\"keccak256\":\"0x7f321bbcbd13abfbc8f0d08a5adaaf8ef312db5bb899012fcffb6170fbb962a9\",\"urls\":[\"bzz-raw://bf9301ef1dbb3abda7b492585377617508ba048c6170f21a5e7d2b3c034eb384\",\"dweb:/ipfs/QmcetEFxSYLLNSZzPBpNn3Fc8sFcrFE8A8h12ZSj2tLgxD\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBFee.sol\":{\"keccak256\":\"0xffacd6dcce11a5cdd54aba7a5d8f9b28b9b36b87771dea746a117b616519bbd0\",\"urls\":[\"bzz-raw://c278d6efa1dd694c8aceba43b2cb3f2b49a52d9b15fc23089def526e4ba23778\",\"dweb:/ipfs/QmVHEGGAfsUVE791aGeYZBiymU6aJ278PoGmH9SRLY1U4N\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBFundAccessLimitGroup.sol\":{\"keccak256\":\"0x9fdaa8d017b72da25f583700a444a86849df053f7fb8eac874ec5139bcf651e5\",\"urls\":[\"bzz-raw://c8e44c49ee444a98424a0dbeb6897a76a0bf00d88a613f62ac2012afdac754ee\",\"dweb:/ipfs/QmdYkAiRi5bXM1YYNkc7BiqimHSFodMGn1cjHR5hcpm4xH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBPayHookSpecification.sol\":{\"keccak256\":\"0x955f0bfca97300b9e5927dc181753830ee362f83fa9ca32a90daade32aa0cfd5\",\"urls\":[\"bzz-raw://f517af1597c7c40f8d3da53f7a6684a3e162950a16559d6bf6ea3b727bb11546\",\"dweb:/ipfs/QmRWo2ZTYXmVZTzNJDYhsJNsEaHphjpUfx9eNz2cciyz86\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBPermissionsData.sol\":{\"keccak256\":\"0xd5a5fe65b1deb40b5cd9c8e05bc1352d0e95f3a18b4986fab7abdc621beb19c7\",\"urls\":[\"bzz-raw://a6141eaa414d3d61de671ae3584b87e98044bf6392cb94d2acd1bb5cc7c19db4\",\"dweb:/ipfs/QmbtvALmburKLRC5fHXscoeZii1N2qQrJAdqarfvSKaKEk\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRedeemHookSpecification.sol\":{\"keccak256\":\"0x673d16ee1a91bf8de3b37e57284e60451b70a9c2d748c9cdc7a151f5624af18f\",\"urls\":[\"bzz-raw://ceeb5e81effa0f076c5630c756dfcf1548d09f822b255a0a6ee01e54de8c8ae2\",\"dweb:/ipfs/QmSMoMNPRhPMnuJNvWa6S59XRfycGz9o2ApNp63bUW6TdX\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRuleset.sol\":{\"keccak256\":\"0xa40e937554418f9cc5949200ee64a434ece55b8e67f35d3c4c47a3dfbadaebbf\",\"urls\":[\"bzz-raw://87e1fb1b1c9ed2fe1948251ba5f839a33bb50ff5a1a6ef292aae6bbbeeb5f619\",\"dweb:/ipfs/QmUWTJPxqeHfciYT2kobif55CJLQaMHYtZFGju6LyWbv9D\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetConfig.sol\":{\"keccak256\":\"0x3d14de125bd1e4fa9dc3e20937fcc2aa666e0b9cfb63ff520189c5d27fea594a\",\"urls\":[\"bzz-raw://2c4a164ce0f4fce85e1c1d62be3497cd5d411c763d9582aad19901e9fb3c6c44\",\"dweb:/ipfs/QmXiCaWQD7NVMxE7JjuoXAEaFwKDSZtbf2beSh8mDiE1PN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetMetadata.sol\":{\"keccak256\":\"0xa19eb9f4c543da1d204589355040f68528dac2e021571a887b8a46397290786c\",\"urls\":[\"bzz-raw://edf57813fb0325d908a3cf67e6ddc3c894186591a4c13c496421928366bb359c\",\"dweb:/ipfs/QmP27aqG3ofA9Mzmk9JUp9gnSfuVfZfBWDv69jJWqeZm3F\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetWithMetadata.sol\":{\"keccak256\":\"0x1bcfadf20488f6df65227f8d4d0fbf9b7539456a2389567f7fe3900d23289bc3\",\"urls\":[\"bzz-raw://0a15c399a71e5373f8c0484c6d6b83521eda31e063a2c53e4c5cec4e74550343\",\"dweb:/ipfs/QmQwi8zkjoTVXbK89NeETYimWCacTrNsesJdpLSvGdqMPX\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplit.sol\":{\"keccak256\":\"0x0e1351e80cf9967caee90094712a4fc884a83f07df23a844d8cb33ebcd00721e\",\"urls\":[\"bzz-raw://19d5793c08834f2ec1d6942bd43d05042b0ecc351a57235d748a8f2ff74b6638\",\"dweb:/ipfs/QmUWjyNg7x62KsvMwAzNdpmwqCo5qK5ip9pLdshj9B2Kbf\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplitGroup.sol\":{\"keccak256\":\"0x8dc98fa9e730bee8bcc0a8acf1bc4db1c9b0edf307d969c9c9caa4d6b8d856d9\",\"urls\":[\"bzz-raw://66f4306e0e69c82033927952564fd617e7c4b29aa8b165d5b53a0ebe3109ea12\",\"dweb:/ipfs/QmQqN1u7FHAdEtEZNRcKvZwYtXEQVQnLd6FMzHESP7wDtx\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplitHookContext.sol\":{\"keccak256\":\"0x1cef82bf434f91d518092ea7e57db4a72ce7654f48a7db9bf44882900b6b6623\",\"urls\":[\"bzz-raw://cc5012008ab7e74cf766fe1c202a23e3a73365356bcf1e0b04ec01baf21b204b\",\"dweb:/ipfs/QmSwJvd6Yrg9XZMhjquBcak5sfUswbR5nPEuJBfpjM54VT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBTerminalConfig.sol\":{\"keccak256\":\"0x2da40b8ae2b6a6038da0ac17d3ccf083a8fb54ea12684242342e53811cca997c\",\"urls\":[\"bzz-raw://9ddb66e9f90ce3005bb1fedd06ec66e6d3e99c52afaf729cee0a23ae01b21fab\",\"dweb:/ipfs/QmPTD9ciAZqj5WWuE5W4Ufs1kBvVokntrfSdUcV6Egh7eQ\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBTokenAmount.sol\":{\"keccak256\":\"0xc61593d33d5ec30e695d382948a1b944d01e29a8f2bfd29f75ecebcdbc7816de\",\"urls\":[\"bzz-raw://8992c1e5fca0c2342ecc0e734dfba6a2a752e4c29184784931d0971e44305051\",\"dweb:/ipfs/QmYNcaW3qeCkgAExUaFTq238fgfJuoYCTwjCn7jm94U4dJ\"],\"license\":\"MIT\"},\"node_modules/@bananapus/permission-ids/src/JBPermissionIds.sol\":{\"keccak256\":\"0x1bd511f9cc46d134ab4743dba50ee25b1c67b5b5e30a27cbfebb1c3fcfedc876\",\"urls\":[\"bzz-raw://6d81d52f481c89832c9c61fa4ea513196c6c8182878d1fbef2038ca39a909192\",\"dweb:/ipfs/QmbaRR5ZXF9PRJwEGbwoAydQiYUoQLYiej7CVmHHbFG29z\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0xce41876e78d1badc0512229b4d14e4daf83bc1003d7f83978d18e0e56f965b9c\",\"urls\":[\"bzz-raw://a2608291cb038b388d80b79a06b6118a42f7894ff67b7da10ec0dbbf5b2973ba\",\"dweb:/ipfs/QmWohqcBLbcxmA4eGPhZDXe5RYMMEEpFq22nfkaUMvTfw1\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"urls\":[\"bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c\",\"dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"],\"license\":\"MIT\"},\"node_modules/@prb/math/src/Common.sol\":{\"keccak256\":\"0xaa374e2c26cc93e8c22a6953804ee05f811597ef5fa82f76824378b22944778b\",\"urls\":[\"bzz-raw://279c732e161d623cf4d8a9519ca4c42c0c2db99842d0eb2a20c10fde3fa722c9\",\"dweb:/ipfs/QmVViuUXbinQGqtG5M21SgVzKihiCbFUChd4tDhtvwRmxH\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IAllowanceTransfer.sol\":{\"keccak256\":\"0x37f0ac203b6ef605c9533e1a739477e8e9dcea90710b40e645a367f8a21ace29\",\"urls\":[\"bzz-raw://e0104d72aeaec1cd66cc232e7de7b7ead08608efcc179491b8a66387614670b0\",\"dweb:/ipfs/QmfAZDyuNC9FXXbnJUwqHNwmAK6uRrXxtWEytLsxjskPsN\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IEIP712.sol\":{\"keccak256\":\"0xfdccf2b9639070803cd0e4198427fb0df3cc452ca59bd3b8a0d957a9a4254138\",\"urls\":[\"bzz-raw://f7c936ac42ce89e827db905a1544397f8bdf46db34cdb6aa1b90dea42fdb4c72\",\"dweb:/ipfs/QmVgurxo1N31qZqkPBirw9Z7S9tLYmv6jSwQp8R8ur2cBk\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IPermit2.sol\":{\"keccak256\":\"0xaa631cc9f53e699301d94233007110a345e6779011def484e8dd97b8fe0af771\",\"urls\":[\"bzz-raw://fc0502cf19c9c18f320a3001201e89e350393b75837f6b7971de18b2de06f30d\",\"dweb:/ipfs/QmT9SfhdJ7VJNNrf94g4H5usyi7ShqWGx7Cqsz9jZTjX96\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/ISignatureTransfer.sol\":{\"keccak256\":\"0xe6df9966f8841dc3958ee86169c89de97e7f614c81c28b9dc947b12d732df64e\",\"urls\":[\"bzz-raw://3d4eafdee7f48c3be8350a94eb6edd0bfb2af2c105df65787a77174f356c0317\",\"dweb:/ipfs/QmY1j2adeeAhNpn6cUuthemxGCdLXHTfyMh9yTKsY4mZ2d\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol\":{\"keccak256\":\"0x4e64844c56061cd90e0a80de73534a9166704c43eed579eb83f90bc2780ce968\",\"urls\":[\"bzz-raw://cba4fab5cebdddf644b901994a7f0f52b98885d4c56012f4dc51d52c2bf9de0e\",\"dweb:/ipfs/QmVyyrRmqXrAiapewWunRVgiPVFJHpH2hKiE1py1svMSNV\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol\":{\"keccak256\":\"0x3f485fb1a44e8fbeadefb5da07d66edab3cfe809f0ac4074b1e54e3eb3c4cf69\",\"urls\":[\"bzz-raw://095ce0626b41318c772b3ebf19d548282607f6a8f3d6c41c13edfbd5370c8652\",\"dweb:/ipfs/QmVDZfJJ89UUCE1hMyzqpkZAtQ8jUsBgZNE5AMRG7RzRFS\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions.sol\":{\"keccak256\":\"0x9453dd0e7442188667d01d9b65de3f1e14e9511ff3e303179a15f6fc267f7634\",\"urls\":[\"bzz-raw://982f4328f956c3e60e67501e759eb292ac487f76460c774c50e9ae4fcc92aae5\",\"dweb:/ipfs/QmRnzEDsaqtd9PJEVcgQi7p5aV5pMSvRUoGZJAdwFUJxgZ\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState.sol\":{\"keccak256\":\"0xe603ac5b17ecdee73ba2b27efdf386c257a19c14206e87eee77e2017b742d9e5\",\"urls\":[\"bzz-raw://8febc9bdb399a4d94bb89f5377732652e2400e4a8dee808201ade6848f9004e7\",\"dweb:/ipfs/QmaKDqYYFU4d2W2iN77aDHptfbFmYZRrMYXHeGpJmM8C1c\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolErrors.sol\":{\"keccak256\":\"0xf80abf13fb1fafc127ba4e792f240dd8ea7c8c893978cdfd8439c27fae9a037b\",\"urls\":[\"bzz-raw://b04fc72a656bbf3631e9c2e67b9870a2d9d235185e833fe050e9606e6816a9aa\",\"dweb:/ipfs/QmUcz4bkEkJ9pwzFu1C3n97hBQ3st9U6qTAqCdyFwddKco\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents.sol\":{\"keccak256\":\"0x8071514d0fe5d17d6fbd31c191cdfb703031c24e0ece3621d88ab10e871375cd\",\"urls\":[\"bzz-raw://d0b571930cc7488b1d546a7e9cea7c52d8b3c4e207da657ed0e0db7343b8cd03\",\"dweb:/ipfs/QmaGK6vVwB95QSTR1XMYvrh7ivYAYZxi3fD7v6VMA4jZ39\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables.sol\":{\"keccak256\":\"0xf6e5d2cd1139c4c276bdbc8e1d2b256e456c866a91f1b868da265c6d2685c3f7\",\"urls\":[\"bzz-raw://b99c8c9ae8e27ee6559e5866bea82cbc9ffc8247f8d15b7422a4deb287d4d047\",\"dweb:/ipfs/QmfL8gaqt3ffAnm6nVj5ksuNpLygXuL3xq5VBqrkwC2JJ3\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions.sol\":{\"keccak256\":\"0x759b78a2918af9e99e246dc3af084f654e48ef32bb4e4cb8a966aa3dcaece235\",\"urls\":[\"bzz-raw://64144fb96e1c7fdba87305acadb98a198d26a3d46c097cb3a666e567f6f29735\",\"dweb:/ipfs/QmUnWVwN9FKB9uV5Pr8YfLpWZnYM2DENnRMaadZ492JS9u\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.sol\":{\"keccak256\":\"0x44fa2ce1182f6c2f6bead3d1737804bf7e112252ae86e0f2e92f9b8249603f43\",\"urls\":[\"bzz-raw://54154e8665b98d65f5dc91b256551852cb47882180b501b260657122d207c0ea\",\"dweb:/ipfs/QmcfemK1A2PXYrWB5SBFGERpMCderbFRb8BtTzQDj1sUBp\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/libraries/FullMath.sol\":{\"keccak256\":\"0x7825565a4bb2a34a1dc96bbfead755785dfb0df8ef81bd934c43023689685645\",\"urls\":[\"bzz-raw://8f44f4614d31e3d4864c7eb13620555253b84f6a69180f8745b7c6e246a9d125\",\"dweb:/ipfs/QmfNQUcXj3KL8h9u5PqbtEC6yRtwDbKNb48uMPjdwxsKnd\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v3-core/contracts/libraries/TickMath.sol\":{\"keccak256\":\"0x5c57de03a91cc2ec8939865dbbcb0197bb6c353b711075eefd8e0fca5e102129\",\"urls\":[\"bzz-raw://1e994c24fd891ef8a3f5dbf5eba42b34feaf05e0376a29f91322faa18054449c\",\"dweb:/ipfs/QmNdUJGUQxd1dPkMbnA5f5UNqakxRkQE5r7bTZJAuHeapS\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-periphery/contracts/libraries/OracleLibrary.sol\":{\"keccak256\":\"0xe313f89c69c0f1c91f0722868313b4ceb14479b3e7a0abf52a1b9bbd9c18e81b\",\"urls\":[\"bzz-raw://8ad09b061f3f533c116618c20cf01510108eebebb7ff8847b0f245b8ba368d53\",\"dweb:/ipfs/QmU6vdi5JjJfjK2KqonWvRg9NeuQWarj4B1YFN22Dh9VJM\"],\"license\":\"GPL-2.0-or-later\"},\"src/JBBuybackHook.sol\":{\"keccak256\":\"0x853030183c6b3b1cde459af63eef64091af5807a0475a9ef8e1c1bd79db72da8\",\"urls\":[\"bzz-raw://8173a685a0ad9b79745c0af675c52432a61431655f271f68b2493a284b23826e\",\"dweb:/ipfs/QmSkiaYnV7hsiqXrew6WYxu3SwWKCv5wg6mCGsAk3ARrhP\"],\"license\":\"MIT\"},\"src/interfaces/IJBBuybackHook.sol\":{\"keccak256\":\"0xbe5d7f3bf2e18b569676ba9194e248e6b1ed50022f5247b4f1fa124c91bfd418\",\"urls\":[\"bzz-raw://eb221d1570e8aad409c419b6a2f84351e818c3527f3f44b806cd64c84d7a8c86\",\"dweb:/ipfs/QmUPZstaKjPN7VTywg3Mt6bF75E53mQbmXhf3TxCggJbRR\"],\"license\":\"MIT\"},\"src/interfaces/external/IWETH9.sol\":{\"keccak256\":\"0x50083bcaca6c1a8d12c79116fab4f6d8cd452a510cb3f00c4a8bc3a54678efb7\",\"urls\":[\"bzz-raw://726f187112d0953c14bff8099a8c9ce1ead47eb25e90839f77b100feaaf16127\",\"dweb:/ipfs/QmTEnMENpLjcTQLMwz4kEUiQHfiTkaZT3TL37nQ8JiRYh5\"],\"license\":\"GPL-2.0-or-later\"}},\"version\":1}", + "metadata": "{\"compiler\":{\"version\":\"0.8.23+commit.f704f362\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IWETH9\",\"name\":\"weth\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"internalType\":\"contract IJBDirectory\",\"name\":\"directory\",\"type\":\"address\"},{\"internalType\":\"contract IJBController\",\"name\":\"controller\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InsufficientPayAmount\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InvalidTwapSlippageTolerance\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InvalidTwapWindow\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"NoProjectToken\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"denominator\",\"type\":\"uint256\"}],\"type\":\"error\",\"name\":\"PRBMath_MulDiv_Overflow\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"PoolAlreadySet\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"SpecifiedSlippageExceeded\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"T\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"UNAUTHORIZED\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"Unauthorized\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"tokenCount\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"Mint\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\",\"indexed\":true},{\"internalType\":\"address\",\"name\":\"newPool\",\"type\":\"address\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"PoolAdded\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"pool\",\"type\":\"address\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"amountOut\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"Swap\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"oldTwapTolerance\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"newTwapTolerance\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"TwapSlippageToleranceChanged\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"oldSecondsAgo\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"newSecondsAgo\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"TwapWindowChanged\",\"anonymous\":false},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"CONTROLLER\",\"outputs\":[{\"internalType\":\"contract IJBController\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"DIRECTORY\",\"outputs\":[{\"internalType\":\"contract IJBDirectory\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MAX_TWAP_SLIPPAGE_TOLERANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MAX_TWAP_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MIN_TWAP_SLIPPAGE_TOLERANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MIN_TWAP_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"PERMISSIONS\",\"outputs\":[{\"internalType\":\"contract IJBPermissions\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"PROJECTS\",\"outputs\":[{\"internalType\":\"contract IJBProjects\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"TWAP_SLIPPAGE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"UNISWAP_V3_FACTORY\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"WETH\",\"outputs\":[{\"internalType\":\"contract IWETH9\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"struct JBAfterPayRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"amount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"forwardedAmount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"projectTokenCount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"hookMetadata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"payerMetadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"payable\",\"type\":\"function\",\"name\":\"afterPayRecordedWith\"},{\"inputs\":[{\"internalType\":\"struct JBBeforePayRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"terminal\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"amount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reservedPercent\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"beforePayRecordedWith\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"struct JBPayHookSpecification[]\",\"name\":\"hookSpecifications\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"contract IJBPayHook\",\"name\":\"hook\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}]},{\"inputs\":[{\"internalType\":\"struct JBBeforeRedeemRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"terminal\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"holder\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"redeemCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"surplus\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"bool\",\"name\":\"useTotalSurplus\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"redemptionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"beforeRedeemRecordedWith\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"struct JBRedeemHookSpecification[]\",\"name\":\"hookSpecifications\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"contract IJBRedeemHook\",\"name\":\"hook\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"hasMintPermissionFor\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"poolOf\",\"outputs\":[{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"projectTokenOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"uint32\",\"name\":\"twapWindow\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"twapSlippageTolerance\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setPoolFor\",\"outputs\":[{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"newPool\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newSlippageTolerance\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setTwapSlippageToleranceOf\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"newWindow\",\"type\":\"uint32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setTwapWindowOf\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"twapSlippageToleranceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"twapWindowOf\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}]},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"amount0Delta\",\"type\":\"int256\"},{\"internalType\":\"int256\",\"name\":\"amount1Delta\",\"type\":\"int256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"uniswapV3SwapCallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"afterPayRecordedWith((address,uint256,uint256,(address,uint8,uint32,uint256),(address,uint8,uint32,uint256),uint256,uint256,address,bytes,bytes))\":{\"details\":\"This function is only called if the minimum return from the swap exceeds the return from minting by paying the project. If the swap reverts (due to slippage, insufficient liquidity, or something else), then the hook mints the number of tokens which a payment to the project would have minted.\",\"params\":{\"context\":\"The pay context passed in by the terminal.\"}},\"beforePayRecordedWith((address,address,(address,uint8,uint32,uint256),uint256,uint256,address,uint256,uint256,bytes))\":{\"params\":{\"context\":\"Payment context passed to the data hook by `terminalStore.recordPaymentFrom(...)`. `context.metadata` can specify a Uniswap quote and specify how much of the payment should be used to swap. If `context.metadata` does not specify a quote, one will be calculated based on the TWAP. If `context.metadata` does not specify how much of the payment should be used, the hook uses the full amount paid in.\"},\"returns\":{\"hookSpecifications\":\"Specifications containing pay hooks, as well as the amount and metadata to send to them. Fulfilled by the terminal. If tokens are only being minted, `hookSpecifications` will be empty.\",\"weight\":\"The weight to use. If tokens are being minted from the project, this is the original weight. If tokens are being bought from the pool, the weight is 0. If tokens are being minted AND bought from the pool, this weight is adjusted to take both into account.\"}},\"beforeRedeemRecordedWith((address,address,uint256,uint256,uint256,uint256,(address,uint8,uint32,uint256),bool,uint256,bytes))\":{\"details\":\"Pass redeem context back to the terminal without changes.\",\"params\":{\"context\":\"The redeem context passed in by the terminal.\"}},\"constructor\":{\"params\":{\"controller\":\"The controller used to mint and burn tokens.\",\"directory\":\"The directory of terminals and controllers.\",\"factory\":\"The address of the Uniswap v3 factory. Used to calculate pool addresses.\",\"weth\":\"The WETH contract.\"}},\"setPoolFor(uint256,uint24,uint32,uint256,address)\":{\"details\":\"Uses create2 for callback auth and to allow adding pools which haven't been deployed yet. This can be called by the project's owner or an address which has the `JBPermissionIds.SET_BUYBACK_POOL` permission from the owner.\",\"params\":{\"fee\":\"The fee used in the pool being set, as a fixed-point number of basis points with 2 decimals. A 0.01% fee is `100`, a 0.05% fee is `500`, a 0.3% fee is `3000`, and a 1% fee is `10000`.\",\"projectId\":\"The ID of the project to set the pool for.\",\"terminalToken\":\"The address of the terminal token that payments to the project are made in.\",\"twapSlippageTolerance\":\"The maximum spread allowed between the amount received and the TWAP.\",\"twapWindow\":\"The period of time over which the TWAP is computed.\"},\"returns\":{\"newPool\":\"The pool that was set for the project and terminal token.\"}},\"setTwapSlippageToleranceOf(uint256,uint256)\":{\"details\":\"This can be called by the project's owner or an address with `JBPermissionIds.SET_BUYBACK_TWAP` permission from the owner.\",\"params\":{\"newSlippageTolerance\":\"The new TWAP slippage tolerance, out of `TWAP_SLIPPAGE_DENOMINATOR`.\",\"projectId\":\"The ID of the project to set the TWAP slippage tolerance of.\"}},\"setTwapWindowOf(uint256,uint32)\":{\"details\":\"This can be called by the project's owner or an address with `JBPermissionIds.SET_BUYBACK_TWAP` permission from the owner.\",\"params\":{\"newWindow\":\"The new TWAP window.\",\"projectId\":\"The ID of the project to set the TWAP window of.\"}},\"supportsInterface(bytes4)\":{\"details\":\"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.\"},\"twapSlippageToleranceOf(uint256)\":{\"details\":\"The \\\"TWAP slippage tolerance\\\" is the maximum negative spread between the TWAP and the expected return from a swap. If the expected return unfavourably exceeds the TWAP slippage tolerance, the swap will revert.\",\"params\":{\"projectId\":\"The ID of the project which the TWAP slippage tolerance applies to.\"},\"returns\":{\"_0\":\"tolerance The maximum slippage allowed relative to the TWAP, as a percent out of `TWAP_SLIPPAGE_DENOMINATOR`.\"}},\"twapWindowOf(uint256)\":{\"details\":\"The \\\"TWAP window\\\" is the period over which the TWAP is computed.\",\"params\":{\"projectId\":\"The ID of the project which the TWAP window applies to.\"},\"returns\":{\"_0\":\"secondsAgo The TWAP window in seconds.\"}},\"uniswapV3SwapCallback(int256,int256,bytes)\":{\"params\":{\"amount0Delta\":\"The amount of token 0 being used for the swap.\",\"amount1Delta\":\"The amount of token 1 being used for the swap.\",\"data\":\"Data passed in by the swap operation.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"CONTROLLER()\":{\"notice\":\"The controller used to mint and burn tokens.\"},\"DIRECTORY()\":{\"notice\":\"The directory of terminals and controllers.\"},\"MAX_TWAP_SLIPPAGE_TOLERANCE()\":{\"notice\":\"Projects cannot specify a TWAP slippage tolerance larger than this constant (out of `MAX_SLIPPAGE`).\"},\"MAX_TWAP_WINDOW()\":{\"notice\":\"Projects cannot specify a TWAP window longer than this constant.\"},\"MIN_TWAP_SLIPPAGE_TOLERANCE()\":{\"notice\":\"Projects cannot specify a TWAP slippage tolerance smaller than this constant (out of `MAX_SLIPPAGE`).\"},\"MIN_TWAP_WINDOW()\":{\"notice\":\"Projects cannot specify a TWAP window shorter than this constant.\"},\"PERMISSIONS()\":{\"notice\":\"A contract storing permissions.\"},\"PROJECTS()\":{\"notice\":\"The project registry.\"},\"TWAP_SLIPPAGE_DENOMINATOR()\":{\"notice\":\"The denominator used when calculating TWAP slippage percent values.\"},\"UNISWAP_V3_FACTORY()\":{\"notice\":\"The address of the Uniswap v3 factory. Used to calculate pool addresses.\"},\"WETH()\":{\"notice\":\"The wETH contract.\"},\"afterPayRecordedWith((address,uint256,uint256,(address,uint8,uint32,uint256),(address,uint8,uint32,uint256),uint256,uint256,address,bytes,bytes))\":{\"notice\":\"Swap the specified amount of terminal tokens for project tokens, using any leftover terminal tokens to mint from the project.\"},\"beforePayRecordedWith((address,address,(address,uint8,uint32,uint256),uint256,uint256,address,uint256,uint256,bytes))\":{\"notice\":\"The `IJBRulesetDataHook` implementation which determines whether tokens should be minted from the project or bought from the pool.\"},\"beforeRedeemRecordedWith((address,address,uint256,uint256,uint256,uint256,(address,uint8,uint32,uint256),bool,uint256,bytes))\":{\"notice\":\"To fulfill the `IJBRulesetDataHook` interface.\"},\"hasMintPermissionFor(uint256,address)\":{\"notice\":\"Required by the `IJBRulesetDataHook` interfaces. Return false to not leak any permissions.\"},\"poolOf(uint256,address)\":{\"notice\":\"The Uniswap pool where a given project's token and terminal token pair are traded.\"},\"projectTokenOf(uint256)\":{\"notice\":\"The address of each project's token.\"},\"setPoolFor(uint256,uint24,uint32,uint256,address)\":{\"notice\":\"Set the pool to use for a given project and terminal token (the default for the project's token <-> terminal token pair).\"},\"setTwapSlippageToleranceOf(uint256,uint256)\":{\"notice\":\"Set the TWAP slippage tolerance for a project. The TWAP slippage tolerance is the maximum spread allowed between the amount received and the TWAP.\"},\"setTwapWindowOf(uint256,uint32)\":{\"notice\":\"Change the TWAP window for a project. The TWAP window is the period of time over which the TWAP is computed.\"},\"twapSlippageToleranceOf(uint256)\":{\"notice\":\"Get the TWAP slippage tolerance for a given project ID.\"},\"twapWindowOf(uint256)\":{\"notice\":\"Get the TWAP window for a given project ID.\"},\"uniswapV3SwapCallback(int256,int256,bytes)\":{\"notice\":\"The Uniswap v3 pool callback where the token transfer is expected to happen.\"}},\"version\":1}},\"settings\":{\"remappings\":[\"@bananapus/=node_modules/@bananapus/\",\"@chainlink/=node_modules/@chainlink/\",\"@eth-optimism/=node_modules/@eth-optimism/\",\"@exhausted-pigeon/=node_modules/@exhausted-pigeon/\",\"@openzeppelin/=node_modules/@openzeppelin/\",\"@prb/=node_modules/@prb/\",\"@scroll-tech/=node_modules/@scroll-tech/\",\"@sphinx-labs/contracts/=node_modules/@sphinx-labs/contracts/contracts/foundry/\",\"@uniswap/=node_modules/@uniswap/\",\"base64-sol/=node_modules/base64-sol/\",\"ds-test/=lib/forge-std/lib/ds-test/src/\",\"forge-std/=lib/forge-std/src/\",\"hardhat/=node_modules/hardhat/\",\"solmate/=node_modules/solmate/\",\"sphinx/=lib/sphinx/packages/contracts/contracts/forge-std/src/\"],\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"compilationTarget\":{\"src/JBBuybackHook.sol\":\"JBBuybackHook\"},\"evmVersion\":\"paris\",\"libraries\":{}},\"sources\":{\"node_modules/@bananapus/core/src/abstract/JBPermissioned.sol\":{\"keccak256\":\"0x6486c11bff6384bfa938feb7aaacc977f457abff25b17b9aa094077d3fef71f8\",\"urls\":[\"bzz-raw://8b5190202326b6499391d5128cdb2d9ff44e91cd9ba6d8a5fe01e6f21259270d\",\"dweb:/ipfs/QmR2ufPwHtCAZYkJoyWyyag6BfdaWpaLk7VhuDc6BRLqVe\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/enums/JBApprovalStatus.sol\":{\"keccak256\":\"0x61c69b6bac7d24b566d87cda23a77e4ca9cdb87200b106aba8534cb9a0973e33\",\"urls\":[\"bzz-raw://6a9ca7249de76f77a8252eefe6bd1b63d47952f25a2acfa2c8db967cdff4470c\",\"dweb:/ipfs/QmaxSxptRQNj8bNy96EreENmrnRWdKmhyihBcxyWzBX5BN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBController.sol\":{\"keccak256\":\"0xfd338e99bf942083bbf2170a147786585a0f4bcf54815b78cc13ff68cc8d6ded\",\"urls\":[\"bzz-raw://cdcaf5d032173a02e75ba63b334e002347d7a7641f1ea208e6de91f416ac6780\",\"dweb:/ipfs/QmNqHwbBrpvYAGdbhhKvdpKn5nnZMRMUXX4N465Cj4TtAq\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBDirectory.sol\":{\"keccak256\":\"0x9cc380844aef60078ee47a61861e55a29c4a8c947efd556ebd36e6909f7b9d62\",\"urls\":[\"bzz-raw://9f5190ec8b6683d9781ee6e9eedcc91294753242748875d4a06349077e4cbaaf\",\"dweb:/ipfs/QmTQrPuXT9TCA4txwrperMeXSGvGxP8iokUK47f62F388i\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBDirectoryAccessControl.sol\":{\"keccak256\":\"0x1e67f56849320a46f834aaa9bd62b170ff8ada7b224b4a81136193740fa0be4d\",\"urls\":[\"bzz-raw://ea8fbcec44abfe49d137bcae129b67e5479d6b17879301f88534c8a7fab00be4\",\"dweb:/ipfs/QmT6wrtYX4GRpffHUzupNwYebJ1dqkkKZLEewWsoyunsqw\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFeeTerminal.sol\":{\"keccak256\":\"0xdb6f3349cbe2078faa8421dec892136693748d8a60b70a1dee3bce2cfc5274fc\",\"urls\":[\"bzz-raw://ccc6a67fc72726c6180c41523cc2a43562864347770a86ff54532fb6ca09e7c3\",\"dweb:/ipfs/QmZinV1LoRsmTq713YGvNShaPtGaxLqwJ6u2EwwGKEKCgu\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFeelessAddresses.sol\":{\"keccak256\":\"0xe5df42cfa71c5fa41b905c122de5825df13c2aab2f9cc4cf4bafa331dd69c27e\",\"urls\":[\"bzz-raw://3773bf3b42cc57d1e4086147e52135ff1dbff4309c45ca0398f821dfaa071563\",\"dweb:/ipfs/QmXUEJssHaxYKfV33tMZGf81JTR5a5yxEVshzNus84xLuT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFundAccessLimits.sol\":{\"keccak256\":\"0xf5fd6bdd723b60d490ccbe22cdf1cfe43663d23e6ee48badcd1b71e3282cb16b\",\"urls\":[\"bzz-raw://fe692f0b843ea5fccdfcb68f4ec16e1c0add945bb74b303c9866342be0e31fbf\",\"dweb:/ipfs/QmSRmzpgp3DhNEhNDiLsSu7yEiTeywbzEFbwyGyDazjgKt\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBMultiTerminal.sol\":{\"keccak256\":\"0xc7b4f5043ec5733f5b303688f3dbf475ef5f6fe12364847a538c8b48a2137fb7\",\"urls\":[\"bzz-raw://fcd1b41a2acfd035e285e6f20f983b9b00a4e00c688a3072062dfb7f5c9c5afe\",\"dweb:/ipfs/QmYCfjakBGxWWTvb5Pk9UAeguwiWrnsNviQWMsaYz7Xq5N\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPayHook.sol\":{\"keccak256\":\"0x9438866782c652c2942f4d114e35f393cd3c8b0334abce8387eed90bca35e8b2\",\"urls\":[\"bzz-raw://cfd99daf57213f92325aad7d7d16e98476d38e870470e95ba01e3ae3cdecc95d\",\"dweb:/ipfs/QmUKKAVGf7ki8BHksr99tFcRW8APveeB5tNH63ctTbbCW8\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPayoutTerminal.sol\":{\"keccak256\":\"0xd0f9374470591c4afb2525c9c7b1bdad577765857c404b22ee5d8d2997a18fad\",\"urls\":[\"bzz-raw://4529c066b2014ee64b8fb16981a9fd5badf64dea7ac6c07dd1b1e7ab5cdc1d8a\",\"dweb:/ipfs/QmYxTdPjRAZ8iThUoNmJuivEaRaB3xXpyHdhCU7my1UHZy\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermissioned.sol\":{\"keccak256\":\"0x5b038d4dee116584e88b230920e56d48e135053e3f7e5642eaea14a775c1dad7\",\"urls\":[\"bzz-raw://19e43102f349fd4a1da1c0943ffb8f2950007fe4bb4bb7e8f74fc142575d091b\",\"dweb:/ipfs/QmXHAt4KzDTdDZgDDefEXH2WKi7NcfkJb9R7nxW5uDqsNp\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermissions.sol\":{\"keccak256\":\"0x49d2b91a866004af098a6770b28040071885b048b4b50744b12a1e5b212c5e5e\",\"urls\":[\"bzz-raw://089b4dda50be91412ffe1fbe333f78cc894f073c1a7afe469f10a2cee12fbf9e\",\"dweb:/ipfs/QmYPPBZ6HwBa1RNkNGqGcR2xgj4fnWBzrPHHoJG3kZA6AN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermitTerminal.sol\":{\"keccak256\":\"0xd6bd30842273f5b794f82219fefdd4953f5343328d2cfdb684b7d826cc0c769c\",\"urls\":[\"bzz-raw://ca1195fd5572060b36fc7e45f46d59f974e3a908248edcfadeb8cb06247075f0\",\"dweb:/ipfs/QmYTpDXKTXqi8GQFsNqB8LiGFTZjSPY3PA8vKqZBraVdqD\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPriceFeed.sol\":{\"keccak256\":\"0x4bd84c0f1a5d4729ed709bcddd43f4c50ec4a165ece79780af8dce482ed07d4a\",\"urls\":[\"bzz-raw://62bac4bfb6982fb002f620c77e5c445e62d50241a5aa64a07e51d929f5a42180\",\"dweb:/ipfs/QmWgJUDreVY2BuMX38a1iUUR5kNbMwGnKG3VvurB7oZtuM\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPrices.sol\":{\"keccak256\":\"0xa4988a8984774e9f9d355236e3c4ab67868503964747684d989ceb54a4176361\",\"urls\":[\"bzz-raw://7496393b49f8a594e6bc3393ffab118e4dc95f69233c77046cd552b1c52a533a\",\"dweb:/ipfs/QmavDESpty7XFmLgWKMHb3venZVPGwwKevWmYStM2mxcPH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBProjectUriRegistry.sol\":{\"keccak256\":\"0x2799475228987e4f8334ac33d3935f759c9b8133db7383b4f622dde7a5dc0502\",\"urls\":[\"bzz-raw://d751731740f45df74eea48c9667e847ee2cddb2980ab4939c86bd17e6c6ed89b\",\"dweb:/ipfs/QmXW8SLTuhdUpfn7pRpdsYdcyuim8RTyagU37ULcj5UZhT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBProjects.sol\":{\"keccak256\":\"0x735c2fb8f1fa827f054ee77f7a0ae4b312656217acb75b624d2c8fd9dc40151b\",\"urls\":[\"bzz-raw://ee7fc92299a8633a80693ae63ab494dcd125f1789487a54a39dc0e5696e5996f\",\"dweb:/ipfs/QmX7YJD4pS2XhgQb7p3JbBAXynT7YGPXcZe92BiWWRrsCL\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRedeemHook.sol\":{\"keccak256\":\"0x8ab46fcd7d0e739661eb76056ad93ff99106f38420ef0b4eb97fa9f4bb71a68a\",\"urls\":[\"bzz-raw://0ef96fcb7ad26281d444d8e0c677b25114fdd63b1c172d477e030dce8ba53b62\",\"dweb:/ipfs/Qmcx1jRQuwU4pZFuLxsSsx4oMbRaDfktHrPnXextgbWc5m\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRedeemTerminal.sol\":{\"keccak256\":\"0xd1b4aa38154e08f1474745ea6bc8f8823fe8aa68c124d596742597f2296ea16d\",\"urls\":[\"bzz-raw://9bd254e833702dfe5e28db5fee76478947ab45b501c966501f719e73bbf0397a\",\"dweb:/ipfs/QmZ3Ng7TmVxL6ozSUhx4kYdQdZhoYi4t43cYZVAMz7Fn5M\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesetApprovalHook.sol\":{\"keccak256\":\"0x592e95d159494421c6b1bcb362d0cee1df0132921697351304e9cd7af4fbd386\",\"urls\":[\"bzz-raw://5bebfd5fa67c1b6ea16fa2e76e9520e9dfe52a579f48dd94d0c2ec45f78ad178\",\"dweb:/ipfs/QmRUawEGtfYoYSHmHELGhvJoWuMsxLPKtqAXgsrb7fJboP\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesetDataHook.sol\":{\"keccak256\":\"0x13b4b9f4b847f62442da1c1a59b399f8f201b31a28edb96aa5a8a78ad57c24d0\",\"urls\":[\"bzz-raw://4fcd00b77d0f40cf6d5ee6590b6ef4ee1f606e89ae4c4faed3710fb462108f8e\",\"dweb:/ipfs/QmeoE54DQ3eGw9EDXfN7aTMmEjubAtirahmytDijo6GSeE\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesets.sol\":{\"keccak256\":\"0x552a9bc990fa47026c89defa6dd112675ee4ef13a9e38f72577e3c0c222f2a8f\",\"urls\":[\"bzz-raw://4fc8638720bac7feb191b8b4ffb4fa08c56a951924fc058561663633973235e2\",\"dweb:/ipfs/QmawYWj5syRvZ2miLQ8WT42AXsuTCH5Fm9Gmq1Rege2mKF\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBSplitHook.sol\":{\"keccak256\":\"0xeb8dfac7a4b81897a1c3b5d0d853a406bcff33720fb187d5ca5bb3dcc0ba3a12\",\"urls\":[\"bzz-raw://36aaeef6107cfe5b0127e063ea215aac7200f8af02e28a48e61111abd3254688\",\"dweb:/ipfs/QmQ8yQANXnhQCAWBGKsKCDsJ3A8hnTKNg5tyo79GfWXTcV\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBSplits.sol\":{\"keccak256\":\"0xd8894cfc55560d914f413e40c981165e1e9dc845b35cdf0ecd13fd118733a483\",\"urls\":[\"bzz-raw://e03b8e5e34c924a91884e3ef79ea039292f8927241698db84a09a463ced4cc52\",\"dweb:/ipfs/QmSqhVX2LSStR7xEcc96zAiQpTPDSsZBn8YvH33CtiU1FN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTerminal.sol\":{\"keccak256\":\"0x8981b96902125707c49c63867b718118fdfb04cb8fd42b038d93ef87ea56f85c\",\"urls\":[\"bzz-raw://7b172c6924a10431652eab136758953a51af8d709a55afff1533d13e687be60c\",\"dweb:/ipfs/QmWczAk48Jw8qNgrUn4EFRK25CrmCp7MmEaJsGtTXueaEb\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTerminalStore.sol\":{\"keccak256\":\"0x140159d66d729f6aeed0fe1f7c655619985146ec00e8c68cbd9b5d30d4dc7d23\",\"urls\":[\"bzz-raw://f972ecb52bcfcd2852c9e7264b1ecc504ce94bd6e12c034b93c1768cd372954e\",\"dweb:/ipfs/QmRu7in5iJSWHLTcFPbJmiK1rCHFbwNY7qzY4cG6kgfYcr\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBToken.sol\":{\"keccak256\":\"0x71b1f9c3a0edd41910f77396e0be2c65596571176d53eb87e887c3c0da56c0fb\",\"urls\":[\"bzz-raw://6e956f0582f4525e83d845ee9b4a89959abc4f821414f6accbbee5b38960482d\",\"dweb:/ipfs/QmbSvjgmCgnfVmcCTGu8XwrV1Rufsf3M8hB8unFq6fTMdH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTokenUriResolver.sol\":{\"keccak256\":\"0xfa5cb00dcd6085d1ef912d071fe73c63f9478a2cd0f9d8bddaf659b6af2d0967\",\"urls\":[\"bzz-raw://282e4e7c342d65f77cde0e9a08fcaf20ef5cf379c7a48b639842c0ffd0b2afb8\",\"dweb:/ipfs/QmbnN3PEQeZaXdPLT75V1J79kMg7KqSMru37RHrL3z8Yf2\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTokens.sol\":{\"keccak256\":\"0x6fd67af915dd541d9547c8297aa9ae269690e4ee23531db43f021bcacec6076f\",\"urls\":[\"bzz-raw://2e5e11954e9ab2319fffccb6563f3db400b8f7760d4ffe2165048a02c9c37fa6\",\"dweb:/ipfs/QmbDXtV83dK8EfiTjsTRf55R2XqPZzDKcjtYbW8sxQ5CFm\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/libraries/JBConstants.sol\":{\"keccak256\":\"0x822bef715c9d5803208a2e02f8d14e0ffdb1fb2ea84698c30fd801103be4a3d2\",\"urls\":[\"bzz-raw://476c87d74e31cd43419cce01551158993c311ac47ba5fad5768e26054b3c8a91\",\"dweb:/ipfs/QmdpxoGU6suZAm9FS7R47AwSmHEFjwmf6v56WrfZM4QkJc\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/libraries/JBMetadataResolver.sol\":{\"keccak256\":\"0xdf32038c5e7f65725e2ef87d09fe04972d7da6a63b60c066d4616b2c2ada5149\",\"urls\":[\"bzz-raw://50582c41ee196ead31d13dcc5a468436d524891d7873743ba92d1d64a0b5783a\",\"dweb:/ipfs/QmPiJMbA1oQnVKQTjqYvUvtWaaiFCeKic8NJtu2crrAznW\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAccountingContext.sol\":{\"keccak256\":\"0x9c47e048a719f784f601df69a583505432217b9868a0244876d277f84dd1ebdf\",\"urls\":[\"bzz-raw://8565f194b87914da9a02af2e760ae2ed2a9d185c6f11229f7035140776d2fec9\",\"dweb:/ipfs/QmPs2fic8W3F5e5zNRwmGmJFjb3JWGPWJ3YUe5o82nQgEn\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAfterPayRecordedContext.sol\":{\"keccak256\":\"0xd26c3a774ff38be79064085970454fe2603a23a638c76270d5b1b3829206c3e8\",\"urls\":[\"bzz-raw://3b55dbe3bf1ef625b7ca04efab3de35406e6041d5b3d82c7265469c500e2b702\",\"dweb:/ipfs/QmUdBDo4Lt3mcsFcsXT2mqq3czFwZjQJFPLM89YA2VtD7k\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAfterRedeemRecordedContext.sol\":{\"keccak256\":\"0x521f5d23a36f0da72362cd84890cc867bd83baa8dc836ba6c5066d51dba2f163\",\"urls\":[\"bzz-raw://6cc461313286dde62d045d6288e87bae5032e035796326f5b1ed6218e58aa9da\",\"dweb:/ipfs/QmQS2AkQwf2ANQieDuaUnpJEdXChoLv4CCbZqHkfywYPSR\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBBeforePayRecordedContext.sol\":{\"keccak256\":\"0xbc98b968d84be2f0ddbb24240723c7179ec9c5e02e5fbd5843dd0e76623a3ea5\",\"urls\":[\"bzz-raw://1310e522696a9fc6f7f96b04c293fab3b4cf1e722bdbb7aa1eec7b3ecc25402f\",\"dweb:/ipfs/QmTYiijDJRuQcMhLrmpbHzHAQFPq6jurPP5HjyYtnzbpnK\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBBeforeRedeemRecordedContext.sol\":{\"keccak256\":\"0x73eadaf6827e82f6ccbe3a1e2b2b7fc6c59cef471f73335041b30ddcc000989d\",\"urls\":[\"bzz-raw://2f3ee84662eed565dbdaed406ef836fffaf55cccd417575578152e5085d0b1f2\",\"dweb:/ipfs/QmaJGFS7hxJsiUdKvbv5BKhSwceDEzKBnt7t5YeNWvYgMK\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBCurrencyAmount.sol\":{\"keccak256\":\"0x7f321bbcbd13abfbc8f0d08a5adaaf8ef312db5bb899012fcffb6170fbb962a9\",\"urls\":[\"bzz-raw://bf9301ef1dbb3abda7b492585377617508ba048c6170f21a5e7d2b3c034eb384\",\"dweb:/ipfs/QmcetEFxSYLLNSZzPBpNn3Fc8sFcrFE8A8h12ZSj2tLgxD\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBFee.sol\":{\"keccak256\":\"0xffacd6dcce11a5cdd54aba7a5d8f9b28b9b36b87771dea746a117b616519bbd0\",\"urls\":[\"bzz-raw://c278d6efa1dd694c8aceba43b2cb3f2b49a52d9b15fc23089def526e4ba23778\",\"dweb:/ipfs/QmVHEGGAfsUVE791aGeYZBiymU6aJ278PoGmH9SRLY1U4N\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBFundAccessLimitGroup.sol\":{\"keccak256\":\"0x9fdaa8d017b72da25f583700a444a86849df053f7fb8eac874ec5139bcf651e5\",\"urls\":[\"bzz-raw://c8e44c49ee444a98424a0dbeb6897a76a0bf00d88a613f62ac2012afdac754ee\",\"dweb:/ipfs/QmdYkAiRi5bXM1YYNkc7BiqimHSFodMGn1cjHR5hcpm4xH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBPayHookSpecification.sol\":{\"keccak256\":\"0x955f0bfca97300b9e5927dc181753830ee362f83fa9ca32a90daade32aa0cfd5\",\"urls\":[\"bzz-raw://f517af1597c7c40f8d3da53f7a6684a3e162950a16559d6bf6ea3b727bb11546\",\"dweb:/ipfs/QmRWo2ZTYXmVZTzNJDYhsJNsEaHphjpUfx9eNz2cciyz86\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBPermissionsData.sol\":{\"keccak256\":\"0xd5a5fe65b1deb40b5cd9c8e05bc1352d0e95f3a18b4986fab7abdc621beb19c7\",\"urls\":[\"bzz-raw://a6141eaa414d3d61de671ae3584b87e98044bf6392cb94d2acd1bb5cc7c19db4\",\"dweb:/ipfs/QmbtvALmburKLRC5fHXscoeZii1N2qQrJAdqarfvSKaKEk\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRedeemHookSpecification.sol\":{\"keccak256\":\"0x673d16ee1a91bf8de3b37e57284e60451b70a9c2d748c9cdc7a151f5624af18f\",\"urls\":[\"bzz-raw://ceeb5e81effa0f076c5630c756dfcf1548d09f822b255a0a6ee01e54de8c8ae2\",\"dweb:/ipfs/QmSMoMNPRhPMnuJNvWa6S59XRfycGz9o2ApNp63bUW6TdX\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRuleset.sol\":{\"keccak256\":\"0x03ad7bd257d4ac55ecc42b85156dce1c70eec8572dbf8feb093c033912f305e7\",\"urls\":[\"bzz-raw://9665b4c018cd469f94bec4471222cc9e5fd58ac421a0959f70e72618fe37d55b\",\"dweb:/ipfs/QmSUf6HQv2Ckcoy5tSH1UPdD8vDMerfK29G8kaxmxB3Kow\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetConfig.sol\":{\"keccak256\":\"0x7a57ed3d73bd9457d8e1fb40f5204c364df87cbfdbf42412d5bbc08beabb49c9\",\"urls\":[\"bzz-raw://8b9a83916ee67d32b5f434b35b171c6122bbc4efeaa4fabb8dec2ca4e9e32c6e\",\"dweb:/ipfs/QmNquzUQn6ZvE2wBcMCgru3resV9UNvBWPPetyDChoh8vM\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetMetadata.sol\":{\"keccak256\":\"0xfb3601c74af59891c7a22eb33110170bbd57e3958130961704ea20cede4202cc\",\"urls\":[\"bzz-raw://fbebf88cdf5fe93aa6eae665e5a5ea277dd3d5b703afbc732fb20e3d3a1d3f0a\",\"dweb:/ipfs/QmWMBjpmNVUePZZaBPKLUP7zX1f49re55ruhLCeFx1zx9A\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetWithMetadata.sol\":{\"keccak256\":\"0x1bcfadf20488f6df65227f8d4d0fbf9b7539456a2389567f7fe3900d23289bc3\",\"urls\":[\"bzz-raw://0a15c399a71e5373f8c0484c6d6b83521eda31e063a2c53e4c5cec4e74550343\",\"dweb:/ipfs/QmQwi8zkjoTVXbK89NeETYimWCacTrNsesJdpLSvGdqMPX\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplit.sol\":{\"keccak256\":\"0x0e1351e80cf9967caee90094712a4fc884a83f07df23a844d8cb33ebcd00721e\",\"urls\":[\"bzz-raw://19d5793c08834f2ec1d6942bd43d05042b0ecc351a57235d748a8f2ff74b6638\",\"dweb:/ipfs/QmUWjyNg7x62KsvMwAzNdpmwqCo5qK5ip9pLdshj9B2Kbf\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplitGroup.sol\":{\"keccak256\":\"0x8dc98fa9e730bee8bcc0a8acf1bc4db1c9b0edf307d969c9c9caa4d6b8d856d9\",\"urls\":[\"bzz-raw://66f4306e0e69c82033927952564fd617e7c4b29aa8b165d5b53a0ebe3109ea12\",\"dweb:/ipfs/QmQqN1u7FHAdEtEZNRcKvZwYtXEQVQnLd6FMzHESP7wDtx\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplitHookContext.sol\":{\"keccak256\":\"0x1cef82bf434f91d518092ea7e57db4a72ce7654f48a7db9bf44882900b6b6623\",\"urls\":[\"bzz-raw://cc5012008ab7e74cf766fe1c202a23e3a73365356bcf1e0b04ec01baf21b204b\",\"dweb:/ipfs/QmSwJvd6Yrg9XZMhjquBcak5sfUswbR5nPEuJBfpjM54VT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBTerminalConfig.sol\":{\"keccak256\":\"0x2da40b8ae2b6a6038da0ac17d3ccf083a8fb54ea12684242342e53811cca997c\",\"urls\":[\"bzz-raw://9ddb66e9f90ce3005bb1fedd06ec66e6d3e99c52afaf729cee0a23ae01b21fab\",\"dweb:/ipfs/QmPTD9ciAZqj5WWuE5W4Ufs1kBvVokntrfSdUcV6Egh7eQ\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBTokenAmount.sol\":{\"keccak256\":\"0xc61593d33d5ec30e695d382948a1b944d01e29a8f2bfd29f75ecebcdbc7816de\",\"urls\":[\"bzz-raw://8992c1e5fca0c2342ecc0e734dfba6a2a752e4c29184784931d0971e44305051\",\"dweb:/ipfs/QmYNcaW3qeCkgAExUaFTq238fgfJuoYCTwjCn7jm94U4dJ\"],\"license\":\"MIT\"},\"node_modules/@bananapus/permission-ids/src/JBPermissionIds.sol\":{\"keccak256\":\"0x1bd511f9cc46d134ab4743dba50ee25b1c67b5b5e30a27cbfebb1c3fcfedc876\",\"urls\":[\"bzz-raw://6d81d52f481c89832c9c61fa4ea513196c6c8182878d1fbef2038ca39a909192\",\"dweb:/ipfs/QmbaRR5ZXF9PRJwEGbwoAydQiYUoQLYiej7CVmHHbFG29z\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0xce41876e78d1badc0512229b4d14e4daf83bc1003d7f83978d18e0e56f965b9c\",\"urls\":[\"bzz-raw://a2608291cb038b388d80b79a06b6118a42f7894ff67b7da10ec0dbbf5b2973ba\",\"dweb:/ipfs/QmWohqcBLbcxmA4eGPhZDXe5RYMMEEpFq22nfkaUMvTfw1\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"urls\":[\"bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c\",\"dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"],\"license\":\"MIT\"},\"node_modules/@prb/math/src/Common.sol\":{\"keccak256\":\"0xaa374e2c26cc93e8c22a6953804ee05f811597ef5fa82f76824378b22944778b\",\"urls\":[\"bzz-raw://279c732e161d623cf4d8a9519ca4c42c0c2db99842d0eb2a20c10fde3fa722c9\",\"dweb:/ipfs/QmVViuUXbinQGqtG5M21SgVzKihiCbFUChd4tDhtvwRmxH\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IAllowanceTransfer.sol\":{\"keccak256\":\"0x37f0ac203b6ef605c9533e1a739477e8e9dcea90710b40e645a367f8a21ace29\",\"urls\":[\"bzz-raw://e0104d72aeaec1cd66cc232e7de7b7ead08608efcc179491b8a66387614670b0\",\"dweb:/ipfs/QmfAZDyuNC9FXXbnJUwqHNwmAK6uRrXxtWEytLsxjskPsN\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IEIP712.sol\":{\"keccak256\":\"0xfdccf2b9639070803cd0e4198427fb0df3cc452ca59bd3b8a0d957a9a4254138\",\"urls\":[\"bzz-raw://f7c936ac42ce89e827db905a1544397f8bdf46db34cdb6aa1b90dea42fdb4c72\",\"dweb:/ipfs/QmVgurxo1N31qZqkPBirw9Z7S9tLYmv6jSwQp8R8ur2cBk\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IPermit2.sol\":{\"keccak256\":\"0xaa631cc9f53e699301d94233007110a345e6779011def484e8dd97b8fe0af771\",\"urls\":[\"bzz-raw://fc0502cf19c9c18f320a3001201e89e350393b75837f6b7971de18b2de06f30d\",\"dweb:/ipfs/QmT9SfhdJ7VJNNrf94g4H5usyi7ShqWGx7Cqsz9jZTjX96\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/ISignatureTransfer.sol\":{\"keccak256\":\"0xe6df9966f8841dc3958ee86169c89de97e7f614c81c28b9dc947b12d732df64e\",\"urls\":[\"bzz-raw://3d4eafdee7f48c3be8350a94eb6edd0bfb2af2c105df65787a77174f356c0317\",\"dweb:/ipfs/QmY1j2adeeAhNpn6cUuthemxGCdLXHTfyMh9yTKsY4mZ2d\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol\":{\"keccak256\":\"0x4e64844c56061cd90e0a80de73534a9166704c43eed579eb83f90bc2780ce968\",\"urls\":[\"bzz-raw://cba4fab5cebdddf644b901994a7f0f52b98885d4c56012f4dc51d52c2bf9de0e\",\"dweb:/ipfs/QmVyyrRmqXrAiapewWunRVgiPVFJHpH2hKiE1py1svMSNV\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol\":{\"keccak256\":\"0x3f485fb1a44e8fbeadefb5da07d66edab3cfe809f0ac4074b1e54e3eb3c4cf69\",\"urls\":[\"bzz-raw://095ce0626b41318c772b3ebf19d548282607f6a8f3d6c41c13edfbd5370c8652\",\"dweb:/ipfs/QmVDZfJJ89UUCE1hMyzqpkZAtQ8jUsBgZNE5AMRG7RzRFS\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions.sol\":{\"keccak256\":\"0x9453dd0e7442188667d01d9b65de3f1e14e9511ff3e303179a15f6fc267f7634\",\"urls\":[\"bzz-raw://982f4328f956c3e60e67501e759eb292ac487f76460c774c50e9ae4fcc92aae5\",\"dweb:/ipfs/QmRnzEDsaqtd9PJEVcgQi7p5aV5pMSvRUoGZJAdwFUJxgZ\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState.sol\":{\"keccak256\":\"0xe603ac5b17ecdee73ba2b27efdf386c257a19c14206e87eee77e2017b742d9e5\",\"urls\":[\"bzz-raw://8febc9bdb399a4d94bb89f5377732652e2400e4a8dee808201ade6848f9004e7\",\"dweb:/ipfs/QmaKDqYYFU4d2W2iN77aDHptfbFmYZRrMYXHeGpJmM8C1c\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolErrors.sol\":{\"keccak256\":\"0xf80abf13fb1fafc127ba4e792f240dd8ea7c8c893978cdfd8439c27fae9a037b\",\"urls\":[\"bzz-raw://b04fc72a656bbf3631e9c2e67b9870a2d9d235185e833fe050e9606e6816a9aa\",\"dweb:/ipfs/QmUcz4bkEkJ9pwzFu1C3n97hBQ3st9U6qTAqCdyFwddKco\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents.sol\":{\"keccak256\":\"0x8071514d0fe5d17d6fbd31c191cdfb703031c24e0ece3621d88ab10e871375cd\",\"urls\":[\"bzz-raw://d0b571930cc7488b1d546a7e9cea7c52d8b3c4e207da657ed0e0db7343b8cd03\",\"dweb:/ipfs/QmaGK6vVwB95QSTR1XMYvrh7ivYAYZxi3fD7v6VMA4jZ39\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables.sol\":{\"keccak256\":\"0xf6e5d2cd1139c4c276bdbc8e1d2b256e456c866a91f1b868da265c6d2685c3f7\",\"urls\":[\"bzz-raw://b99c8c9ae8e27ee6559e5866bea82cbc9ffc8247f8d15b7422a4deb287d4d047\",\"dweb:/ipfs/QmfL8gaqt3ffAnm6nVj5ksuNpLygXuL3xq5VBqrkwC2JJ3\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions.sol\":{\"keccak256\":\"0x759b78a2918af9e99e246dc3af084f654e48ef32bb4e4cb8a966aa3dcaece235\",\"urls\":[\"bzz-raw://64144fb96e1c7fdba87305acadb98a198d26a3d46c097cb3a666e567f6f29735\",\"dweb:/ipfs/QmUnWVwN9FKB9uV5Pr8YfLpWZnYM2DENnRMaadZ492JS9u\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.sol\":{\"keccak256\":\"0x44fa2ce1182f6c2f6bead3d1737804bf7e112252ae86e0f2e92f9b8249603f43\",\"urls\":[\"bzz-raw://54154e8665b98d65f5dc91b256551852cb47882180b501b260657122d207c0ea\",\"dweb:/ipfs/QmcfemK1A2PXYrWB5SBFGERpMCderbFRb8BtTzQDj1sUBp\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/libraries/FullMath.sol\":{\"keccak256\":\"0x7825565a4bb2a34a1dc96bbfead755785dfb0df8ef81bd934c43023689685645\",\"urls\":[\"bzz-raw://8f44f4614d31e3d4864c7eb13620555253b84f6a69180f8745b7c6e246a9d125\",\"dweb:/ipfs/QmfNQUcXj3KL8h9u5PqbtEC6yRtwDbKNb48uMPjdwxsKnd\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v3-core/contracts/libraries/TickMath.sol\":{\"keccak256\":\"0x5c57de03a91cc2ec8939865dbbcb0197bb6c353b711075eefd8e0fca5e102129\",\"urls\":[\"bzz-raw://1e994c24fd891ef8a3f5dbf5eba42b34feaf05e0376a29f91322faa18054449c\",\"dweb:/ipfs/QmNdUJGUQxd1dPkMbnA5f5UNqakxRkQE5r7bTZJAuHeapS\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-periphery/contracts/libraries/OracleLibrary.sol\":{\"keccak256\":\"0xe313f89c69c0f1c91f0722868313b4ceb14479b3e7a0abf52a1b9bbd9c18e81b\",\"urls\":[\"bzz-raw://8ad09b061f3f533c116618c20cf01510108eebebb7ff8847b0f245b8ba368d53\",\"dweb:/ipfs/QmU6vdi5JjJfjK2KqonWvRg9NeuQWarj4B1YFN22Dh9VJM\"],\"license\":\"GPL-2.0-or-later\"},\"src/JBBuybackHook.sol\":{\"keccak256\":\"0x6ce52f5d43175b4b3c1b3ce4490aefbbf97f6bb047d01f9196e27fe934339231\",\"urls\":[\"bzz-raw://fb974d5ca3ca338841891368af57f612a1aa92c8ae600a3e25113603dc4d139d\",\"dweb:/ipfs/QmNWg3epg1Rqk8Tj5uRMxsLJEXcLdfe9wQ5u4nFH7qSSjz\"],\"license\":\"MIT\"},\"src/interfaces/IJBBuybackHook.sol\":{\"keccak256\":\"0xbe5d7f3bf2e18b569676ba9194e248e6b1ed50022f5247b4f1fa124c91bfd418\",\"urls\":[\"bzz-raw://eb221d1570e8aad409c419b6a2f84351e818c3527f3f44b806cd64c84d7a8c86\",\"dweb:/ipfs/QmUPZstaKjPN7VTywg3Mt6bF75E53mQbmXhf3TxCggJbRR\"],\"license\":\"MIT\"},\"src/interfaces/external/IWETH9.sol\":{\"keccak256\":\"0x50083bcaca6c1a8d12c79116fab4f6d8cd452a510cb3f00c4a8bc3a54678efb7\",\"urls\":[\"bzz-raw://726f187112d0953c14bff8099a8c9ce1ead47eb25e90839f77b100feaaf16127\",\"dweb:/ipfs/QmTEnMENpLjcTQLMwz4kEUiQHfiTkaZT3TL37nQ8JiRYh5\"],\"license\":\"GPL-2.0-or-later\"}},\"version\":1}", "args": [ "0x4200000000000000000000000000000000000006", "0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24", - "0x877e8e31eD1Bf9F628EfA25636c5bC9Dd83BAA77", - "0x64c30002444321C4504c8f1b9B04C95DE3731Fd2" + "0x992f9e3a81c77Cb940A29311558343E1AC66c40F", + "0x1e4c8DFfE8D72aeB63e8dDbE9eF89bc368cbbE99" ], - "bytecode": "0x6101406040523480156200001257600080fd5b5060405162003e4938038062003e49833981016040819052620000359162000156565b806001600160a01b031663f434c9146040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009a9190620001be565b6001600160a01b039081166080528481166101205282811660c05281811660e081905290841660a0526040805163293c499960e01b8152905163293c4999916004808201926020929091908290030181865afa158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001259190620001be565b6001600160a01b03166101005250620001e592505050565b6001600160a01b03811681146200015357600080fd5b50565b600080600080608085870312156200016d57600080fd5b84516200017a816200013d565b60208601519094506200018d816200013d565b6040860151909350620001a0816200013d565b6060860151909250620001b3816200013d565b939692955090935050565b600060208284031215620001d157600080fd5b8151620001de816200013d565b9392505050565b60805160a05160c05160e0516101005161012051613bb262000297600039600081816104660152818161133801528181611857015281816119cf01528181611aae0152611d550152600081816102970152818161072c01528181610f49015261109001526000818161051e01528181610e14015281816111a20152611f390152600081816103d401526108df01526000818161058601526113780152600081816105520152611c5b0152613bb26000f3fe60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561054c57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000000000000000000000000000000000000000000092505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000000000000000000000000000000000000000000000816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f00000000000000000000000000000000000000000000000000000000000000005b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f00000000000000000000000000000000000000000000000000000000000000005b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f0000000000000000000000000000000000000000000000000000000000000000169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f00000000000000000000000000000000000000000000000000000000000000005b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220f82d6708b7e9d1d8e4803189749615db1f512283aff91b9bb51a552854f72e7c64736f6c63430008170033", - "deployedBytecode": "0x60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000f8ea7ba8d990646420123feaa2447b534ab2f53c81565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000877e8e31ed1bf9f628efa25636c5bc9dd83baa7781565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000420000000000000000000000000000000000000681565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f00000000000000000000000064c30002444321c4504c8f1b9b04c95de3731fd281565b34801561054c57600080fd5b506102607f000000000000000000000000cfba13b8dcb2bb4f84c5d2704882009a539bee9a81565b34801561058057600080fd5b506102607f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad2481565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000f8ea7ba8d990646420123feaa2447b534ab2f53c73ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000877e8e31ed1bf9f628efa25636c5bc9dd83baa7773ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000064c30002444321c4504c8f1b9b04c95de3731fd21663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000f8ea7ba8d990646420123feaa2447b534ab2f53c73ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000f8ea7ba8d990646420123feaa2447b534ab2f53c1690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f00000000000000000000000064c30002444321c4504c8f1b9b04c95de3731fd273ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000420000000000000000000000000000000000000692505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f00000000000000000000000042000000000000000000000000000000000000065b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f00000000000000000000000042000000000000000000000000000000000000065b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000420000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f000000000000000000000000cfba13b8dcb2bb4f84c5d2704882009a539bee9a169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f00000000000000000000000042000000000000000000000000000000000000065b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f00000000000000000000000064c30002444321c4504c8f1b9b04c95de3731fd273ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220f82d6708b7e9d1d8e4803189749615db1f512283aff91b9bb51a552854f72e7c64736f6c63430008170033", + "bytecode": "0x6101406040523480156200001257600080fd5b5060405162003e4938038062003e49833981016040819052620000359162000156565b806001600160a01b031663f434c9146040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009a9190620001be565b6001600160a01b039081166080528481166101205282811660c05281811660e081905290841660a0526040805163293c499960e01b8152905163293c4999916004808201926020929091908290030181865afa158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001259190620001be565b6001600160a01b03166101005250620001e592505050565b6001600160a01b03811681146200015357600080fd5b50565b600080600080608085870312156200016d57600080fd5b84516200017a816200013d565b60208601519094506200018d816200013d565b6040860151909350620001a0816200013d565b6060860151909250620001b3816200013d565b939692955090935050565b600060208284031215620001d157600080fd5b8151620001de816200013d565b9392505050565b60805160a05160c05160e0516101005161012051613bb262000297600039600081816104660152818161133801528181611857015281816119cf01528181611aae0152611d550152600081816102970152818161072c01528181610f49015261109001526000818161051e01528181610e14015281816111a20152611f390152600081816103d401526108df01526000818161058601526113780152600081816105520152611c5b0152613bb26000f3fe60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561054c57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000000000000000000000000000000000000000000092505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000000000000000000000000000000000000000000000816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f00000000000000000000000000000000000000000000000000000000000000005b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f00000000000000000000000000000000000000000000000000000000000000005b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f0000000000000000000000000000000000000000000000000000000000000000169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f00000000000000000000000000000000000000000000000000000000000000005b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220673ba775a9e9027f7796ba830c6cc31583ba0bdffbfd7ffbf013c44b6ee8d08b64736f6c63430008170033", + "deployedBytecode": "0x60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000e802b15a90a8aed41797cf535c6aee697f18e0b181565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000992f9e3a81c77cb940a29311558343e1ac66c40f81565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000420000000000000000000000000000000000000681565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe9981565b34801561054c57600080fd5b506102607f0000000000000000000000009ca9bc9d5e7e20fc2f1d750807fa30c86b7989f881565b34801561058057600080fd5b506102607f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad2481565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000e802b15a90a8aed41797cf535c6aee697f18e0b173ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000992f9e3a81c77cb940a29311558343e1ac66c40f73ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe991663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000e802b15a90a8aed41797cf535c6aee697f18e0b173ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000e802b15a90a8aed41797cf535c6aee697f18e0b11690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe9973ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000420000000000000000000000000000000000000692505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f00000000000000000000000042000000000000000000000000000000000000065b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f00000000000000000000000042000000000000000000000000000000000000065b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000420000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f0000000000000000000000009ca9bc9d5e7e20fc2f1d750807fa30c86b7989f8169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f00000000000000000000000042000000000000000000000000000000000000065b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe9973ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220673ba775a9e9027f7796ba830c6cc31583ba0bdffbfd7ffbf013c44b6ee8d08b64736f6c63430008170033", "devdoc": { "kind": "dev", "methods": { @@ -1212,7 +1212,7 @@ }, "version": 1 }, - "gitCommit": "74088a01fb7bb1c33e8e306744b5ecf4edb1b5a2", + "gitCommit": "9caaedd7d4d116463c4ceecb3147a8863f806dab", "sourceName": "src/JBBuybackHook.sol", "chainId": "84532", "linkReferences": {}, diff --git a/deployments/nana-buyback-hook-testnet/base_sepolia/execution/97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1.json b/deployments/nana-buyback-hook-testnet/base_sepolia/execution/97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1.json new file mode 100644 index 0000000..c2fc471 --- /dev/null +++ b/deployments/nana-buyback-hook-testnet/base_sepolia/execution/97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1.json @@ -0,0 +1,221 @@ +{ + "_format": "sphinx-sol-execution-artifact-1", + "transactions": [ + { + "receipt": { + "blockHash": "0x4ac68ffea51536985559d8c0bccb8faa39a3e2da7bc207a521de64f64e6db2de", + "blockNumber": 12910629, + "contractAddress": null, + "cumulativeGasUsed": "422107", + "from": "0x0c1c9049564269275059032Fb484Aa2e7Ab779af", + "gasPrice": "1968682", + "gasUsed": "176675", + "hash": "0xfbbf27c6eda98bbf777a1fe055918357e131afb79e3a3220fc597424a42babd2", + "index": 4, + "logs": [ + { + "address": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", + "blockHash": "0x4ac68ffea51536985559d8c0bccb8faa39a3e2da7bc207a521de64f64e6db2de", + "blockNumber": 12910629, + "data": "0x0000000000000000000000000000000000000000000000000000000000000000", + "index": 2, + "topics": [ + "0x572f161235911da04685a68c06adf558fc7e4a36909dca394650e0adc19cc93d", + "0x0000000000000000000000000c1c9049564269275059032fb484aa2e7ab779af", + "0x000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4", + "0x54f7a355e44add9fff87cf5d437a599d22a8cab05080aebe2c84304ab44f0747" + ], + "transactionHash": "0xfbbf27c6eda98bbf777a1fe055918357e131afb79e3a3220fc597424a42babd2", + "transactionIndex": 4 + }, + { + "address": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", + "blockHash": "0x4ac68ffea51536985559d8c0bccb8faa39a3e2da7bc207a521de64f64e6db2de", + "blockNumber": 12910629, + "data": "0x000000000000000000000000a2ea7657440875bf916cbfc0cfa88f13e38ad463000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "index": 3, + "topics": [ + "0x382c7aec02462c9b086aba9a7f8dbb1fb8bf336e7b624b0149eeca6726d0fb4a", + "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ], + "transactionHash": "0xfbbf27c6eda98bbf777a1fe055918357e131afb79e3a3220fc597424a42babd2", + "transactionIndex": 4 + } + ], + "logsBloom": "0x000000000000000000000000000000000000000000000100000000000040000000800000000000000000000000400200000000000000000000000000000c00000040000000010000000000000000000400000000000400000000001000000000000000000000000084000000000000000040000000000000000000000000000000000000000000000001000000000000000008000000000000000000000000000040000000010000000000000000000020000000000000001000000000000000000000020000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000a0100000000000000800", + "status": 1, + "to": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463" + }, + "response": { + "accessList": [], + "blockNumber": 12910629, + "blockHash": "0x4ac68ffea51536985559d8c0bccb8faa39a3e2da7bc207a521de64f64e6db2de", + "chainId": "84532", + "data": "0xbe6002c2000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003448f38f83597d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000014a3400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001000000000000000000000000004bdf5a13e7a25f88dd5321a979e0e54c13df83e8000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a2ea7657440875bf916cbfc0cfa88f13e38ad46300000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003cf4730160b48a62a067dfc9890f23d882d177c28f4ecf9f9da97dbd22e90e796e1fb14e2330b6c2df8c2797b8a5ad037443b6d9b64eaf59507d84fbd95b9108677e0c3e414ef2458f86142a2ea08ea490b36629c555beb37ddb3d8cc405e60cb00000000000000000000000000000000000000000000000000000000000000414f02428220e87325aeb28468cc7ff8c84bb867601c5f91ee314a0d5c8393e2154f13f593e420a8883384f73ad73e7658068ced56f435dd9a2447df0f88795f6b1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "from": "0x0c1c9049564269275059032Fb484Aa2e7Ab779af", + "gasLimit": "188968", + "gasPrice": "1968682", + "hash": "0xfbbf27c6eda98bbf777a1fe055918357e131afb79e3a3220fc597424a42babd2", + "maxFeePerGas": "2934572", + "maxPriorityFeePerGas": "1000000", + "nonce": 38, + "signature": { + "networkV": null, + "r": "0x98dbd0d8245864e56354a0622d06865e238e88e26f26413e96e8fccfa428de69", + "s": "0x2d50712224075098ba3c29843aee33e7b7b4e67b3ea03ef29ba024e82ffc8dfa", + "v": 28 + }, + "to": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", + "type": 2, + "value": "0" + } + }, + { + "receipt": { + "blockHash": "0xcf5dca4623a4f3a9ef7ee2dc20041d5a9ce3e2df787610db9c189caf14faedd0", + "blockNumber": 12910636, + "contractAddress": null, + "cumulativeGasUsed": "4482142", + "from": "0x0c1c9049564269275059032Fb484Aa2e7Ab779af", + "gasPrice": "1971455", + "gasUsed": "3569078", + "hash": "0x0031884d3a925d2c45458e9ca941d71f2cc0a59e61d49acaf0d7f04141eb73ce", + "index": 5, + "logs": [ + { + "address": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", + "blockHash": "0xcf5dca4623a4f3a9ef7ee2dc20041d5a9ce3e2df787610db9c189caf14faedd0", + "blockNumber": 12910636, + "data": "0x0000000000000000000000000000000000000000000000000000000000000000", + "index": 19, + "topics": [ + "0x572f161235911da04685a68c06adf558fc7e4a36909dca394650e0adc19cc93d", + "0x0000000000000000000000000c1c9049564269275059032fb484aa2e7ab779af", + "0x000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4", + "0x45cd83b0bda3e64b4a35b9b8050d4a58bbaee9bd49759b4fcbc0c6185bd7c1ba" + ], + "transactionHash": "0x0031884d3a925d2c45458e9ca941d71f2cc0a59e61d49acaf0d7f04141eb73ce", + "transactionIndex": 5 + }, + { + "address": "0x4bDf5A13e7a25F88dd5321a979e0E54c13DF83E8", + "blockHash": "0xcf5dca4623a4f3a9ef7ee2dc20041d5a9ce3e2df787610db9c189caf14faedd0", + "blockNumber": 12910636, + "data": "0x", + "index": 20, + "topics": [ + "0x6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8", + "0x000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4" + ], + "transactionHash": "0x0031884d3a925d2c45458e9ca941d71f2cc0a59e61d49acaf0d7f04141eb73ce", + "transactionIndex": 5 + }, + { + "address": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", + "blockHash": "0xcf5dca4623a4f3a9ef7ee2dc20041d5a9ce3e2df787610db9c189caf14faedd0", + "blockNumber": 12910636, + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "index": 21, + "topics": [ + "0xa65fb05c5808f5f389d72edeaf719ce38f4cc55c1f69ca3cbfb31c21501caa07", + "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1" + ], + "transactionHash": "0x0031884d3a925d2c45458e9ca941d71f2cc0a59e61d49acaf0d7f04141eb73ce", + "transactionIndex": 5 + }, + { + "address": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", + "blockHash": "0xcf5dca4623a4f3a9ef7ee2dc20041d5a9ce3e2df787610db9c189caf14faedd0", + "blockNumber": 12910636, + "data": "0x", + "index": 22, + "topics": [ + "0x4383d976757d67ca920616be0b6430a681ea9d3dcce8d6d61d4603ca4a9bff63", + "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1" + ], + "transactionHash": "0x0031884d3a925d2c45458e9ca941d71f2cc0a59e61d49acaf0d7f04141eb73ce", + "transactionIndex": 5 + } + ], + "logsBloom": "0x00000000000210000000000000080000000000000000010000000000004000000080000000000000000000000040020000000000000000000000000000080000000000000000200000000000000000040000000000000000800000000000000000000000000000008000000000000000004000000400000000000000000000000000000000000000000100000000000000000800000000000000000008000000004000800001000000000000000000002200000000000000100000000004020000000002000000000000000000000000000000000008000000000000000000000000000000000008000000000000000200000000000080100000000008000000", + "status": 1, + "to": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463" + }, + "response": { + "accessList": [], + "blockNumber": 12910636, + "blockHash": "0xcf5dca4623a4f3a9ef7ee2dc20041d5a9ce3e2df787610db9c189caf14faedd0", + "chainId": "84532", + "data": "0xbe6002c2000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000041a4e65ec46d000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000040c00000000000000000000000000000000000000000000000000000000000014a340000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000003fe00000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003bd22c00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000003ee94a424275796261636b486f6f6b000000000000000000000000000000000000006101406040523480156200001257600080fd5b5060405162003e4938038062003e49833981016040819052620000359162000156565b806001600160a01b031663f434c9146040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009a9190620001be565b6001600160a01b039081166080528481166101205282811660c05281811660e081905290841660a0526040805163293c499960e01b8152905163293c4999916004808201926020929091908290030181865afa158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001259190620001be565b6001600160a01b03166101005250620001e592505050565b6001600160a01b03811681146200015357600080fd5b50565b600080600080608085870312156200016d57600080fd5b84516200017a816200013d565b60208601519094506200018d816200013d565b6040860151909350620001a0816200013d565b6060860151909250620001b3816200013d565b939692955090935050565b600060208284031215620001d157600080fd5b8151620001de816200013d565b9392505050565b60805160a05160c05160e0516101005161012051613bb262000297600039600081816104660152818161133801528181611857015281816119cf01528181611aae0152611d550152600081816102970152818161072c01528181610f49015261109001526000818161051e01528181610e14015281816111a20152611f390152600081816103d401526108df01526000818161058601526113780152600081816105520152611c5b0152613bb26000f3fe60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561054c57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000000000000000000000000000000000000000000092505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000000000000000000000000000000000000000000000816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f00000000000000000000000000000000000000000000000000000000000000005b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f00000000000000000000000000000000000000000000000000000000000000005b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f0000000000000000000000000000000000000000000000000000000000000000169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f00000000000000000000000000000000000000000000000000000000000000005b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220673ba775a9e9027f7796ba830c6cc31583ba0bdffbfd7ffbf013c44b6ee8d08b64736f6c6343000817003300000000000000000000000042000000000000000000000000000000000000060000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24000000000000000000000000992f9e3a81c77cb940a29311558343e1ac66c40f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe990000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000366472a825b664788933adebdf4232db83311393d276c9717ba12e9d8a1a1cf47c5449df3ba697aaf32c23a1149a3f43cb2d269a822306adb6ce1bffeaea92947baec3e0ec4cdaab86d67f8057f9491828210cbd617743ede1cc69e518e61331700000000000000000000000000000000000000000000000000000000", + "from": "0x0c1c9049564269275059032Fb484Aa2e7Ab779af", + "gasLimit": "4548288", + "gasPrice": "1971455", + "hash": "0x0031884d3a925d2c45458e9ca941d71f2cc0a59e61d49acaf0d7f04141eb73ce", + "maxFeePerGas": "2957014", + "maxPriorityFeePerGas": "1000000", + "nonce": 39, + "signature": { + "networkV": null, + "r": "0xc794064c55749ab8390e3ba575e6cbfc95ab4bc00007900f3ad6ebf45fa93520", + "s": "0x4757e1d60b6f96e8377fbdf84ab4351fe9bee608edd61983a3f7e229aa6d2e66", + "v": 28 + }, + "to": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", + "type": 2, + "value": "0" + } + } + ], + "merkleRoot": "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1", + "solcInputHashes": [ + "f096d2968ac6c775921975b16cb0c91e" + ], + "safeAddress": "0x4bDf5A13e7a25F88dd5321a979e0E54c13DF83E8", + "moduleAddress": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", + "executorAddress": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", + "nonce": "1", + "chainId": "84532", + "actions": [ + { + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "value": "0", + "txData": "0x4a424275796261636b486f6f6b000000000000000000000000000000000000006101406040523480156200001257600080fd5b5060405162003e4938038062003e49833981016040819052620000359162000156565b806001600160a01b031663f434c9146040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009a9190620001be565b6001600160a01b039081166080528481166101205282811660c05281811660e081905290841660a0526040805163293c499960e01b8152905163293c4999916004808201926020929091908290030181865afa158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001259190620001be565b6001600160a01b03166101005250620001e592505050565b6001600160a01b03811681146200015357600080fd5b50565b600080600080608085870312156200016d57600080fd5b84516200017a816200013d565b60208601519094506200018d816200013d565b6040860151909350620001a0816200013d565b6060860151909250620001b3816200013d565b939692955090935050565b600060208284031215620001d157600080fd5b8151620001de816200013d565b9392505050565b60805160a05160c05160e0516101005161012051613bb262000297600039600081816104660152818161133801528181611857015281816119cf01528181611aae0152611d550152600081816102970152818161072c01528181610f49015261109001526000818161051e01528181610e14015281816111a20152611f390152600081816103d401526108df01526000818161058601526113780152600081816105520152611c5b0152613bb26000f3fe60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561054c57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000000000000000000000000000000000000000000092505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000000000000000000000000000000000000000000000816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f00000000000000000000000000000000000000000000000000000000000000005b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f00000000000000000000000000000000000000000000000000000000000000005b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f0000000000000000000000000000000000000000000000000000000000000000169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f00000000000000000000000000000000000000000000000000000000000000005b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220673ba775a9e9027f7796ba830c6cc31583ba0bdffbfd7ffbf013c44b6ee8d08b64736f6c6343000817003300000000000000000000000042000000000000000000000000000000000000060000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24000000000000000000000000992f9e3a81c77cb940a29311558343e1ac66c40f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe99", + "gas": "3920428", + "operation": 0, + "requireSuccess": true + } + ], + "sphinxConfig": { + "projectName": "nana-buyback-hook-testnet", + "orgId": "my-org-id", + "owners": [ + "0xba5ed94ab173e1242638F28d1449b24F1A883292" + ], + "mainnets": [ + "ethereum", + "optimism", + "base", + "arbitrum" + ], + "testnets": [ + "ethereum_sepolia", + "optimism_sepolia", + "base_sepolia", + "arbitrum_sepolia" + ], + "threshold": "1", + "saltNonce": "15" + }, + "executionMode": 2, + "initialState": { + "isSafeDeployed": true, + "isModuleDeployed": true, + "isExecuting": false + }, + "unlabeledContracts": [], + "arbitraryChain": false, + "libraries": [], + "gitCommit": "9caaedd7d4d116463c4ceecb3147a8863f806dab", + "safeInitData": null +} \ No newline at end of file diff --git a/deployments/nana-buyback-hook-testnet/optimism_sepolia/JBBuybackHook.json b/deployments/nana-buyback-hook-testnet/optimism_sepolia/JBBuybackHook.json index 4c32458..ec379e7 100644 --- a/deployments/nana-buyback-hook-testnet/optimism_sepolia/JBBuybackHook.json +++ b/deployments/nana-buyback-hook-testnet/optimism_sepolia/JBBuybackHook.json @@ -1,8 +1,8 @@ { "_format": "sphinx-sol-ct-artifact-1", - "merkleRoot": "0xdf51ca1fa6bf804fc5dfbf513fb7282e053f136c07f7c4f9b3a95012943e1a10", + "merkleRoot": "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1", "contractName": "JBBuybackHook", - "address": "0xA82AEBC61E887b51B60CF2042e5ac95Bc47D4944", + "address": "0x691E7e0262A60AA77043993e151F1A96Bb063389", "abi": [ { "type": "constructor", @@ -349,7 +349,7 @@ "internalType": "uint256" }, { - "name": "reservedRate", + "name": "reservedPercent", "type": "uint256", "internalType": "uint256" }, @@ -967,86 +967,86 @@ "inputs": [] } ], - "solcInputHash": "347fff29e2440260967cc55cc0a76014", + "solcInputHash": "f096d2968ac6c775921975b16cb0c91e", "receipt": { - "blockHash": "0xfe5cd2518509c70a46a9bf74d21fea00dbc2938f45039e9ec2270ff9463b0cd6", - "blockNumber": 14852267, + "blockHash": "0x45961ccde7270c57754780ed2b0d10b9ae31072dced89009f3582784ef611977", + "blockNumber": 14893510, "contractAddress": null, - "cumulativeGasUsed": "5222943", + "cumulativeGasUsed": "4686880", "from": "0x0c1c9049564269275059032Fb484Aa2e7Ab779af", - "gasPrice": "1000286", - "gasUsed": "3569066", - "hash": "0x4fe20e6a94338e9af63ac00fb3217ee8684c03752703e9bd1dafacc0bf140b0b", + "gasPrice": "1000305", + "gasUsed": "3569078", + "hash": "0x9269e4f2d8fe7a560798f5b41ce72f65369010cdf2f08f40aa8989b8208e3db6", "index": 3, "logs": [ { "address": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", - "blockHash": "0xfe5cd2518509c70a46a9bf74d21fea00dbc2938f45039e9ec2270ff9463b0cd6", - "blockNumber": 14852267, + "blockHash": "0x45961ccde7270c57754780ed2b0d10b9ae31072dced89009f3582784ef611977", + "blockNumber": 14893510, "data": "0x0000000000000000000000000000000000000000000000000000000000000000", - "index": 52, + "index": 24, "topics": [ "0x572f161235911da04685a68c06adf558fc7e4a36909dca394650e0adc19cc93d", "0x0000000000000000000000000c1c9049564269275059032fb484aa2e7ab779af", "0x000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4", - "0x26b272febd86ec5f0370690fadfc44ef22dc55f0ee32e21f13dc7666c5bb3077" + "0xc5e659874eeacc1ef6ee971e828d5979b5b7582d3a4fd942f6272ff75f632e9d" ], - "transactionHash": "0x4fe20e6a94338e9af63ac00fb3217ee8684c03752703e9bd1dafacc0bf140b0b", + "transactionHash": "0x9269e4f2d8fe7a560798f5b41ce72f65369010cdf2f08f40aa8989b8208e3db6", "transactionIndex": 3 }, { "address": "0x4bDf5A13e7a25F88dd5321a979e0E54c13DF83E8", - "blockHash": "0xfe5cd2518509c70a46a9bf74d21fea00dbc2938f45039e9ec2270ff9463b0cd6", - "blockNumber": 14852267, + "blockHash": "0x45961ccde7270c57754780ed2b0d10b9ae31072dced89009f3582784ef611977", + "blockNumber": 14893510, "data": "0x", - "index": 53, + "index": 25, "topics": [ "0x6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8", "0x000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4" ], - "transactionHash": "0x4fe20e6a94338e9af63ac00fb3217ee8684c03752703e9bd1dafacc0bf140b0b", + "transactionHash": "0x9269e4f2d8fe7a560798f5b41ce72f65369010cdf2f08f40aa8989b8208e3db6", "transactionIndex": 3 }, { "address": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", - "blockHash": "0xfe5cd2518509c70a46a9bf74d21fea00dbc2938f45039e9ec2270ff9463b0cd6", - "blockNumber": 14852267, + "blockHash": "0x45961ccde7270c57754780ed2b0d10b9ae31072dced89009f3582784ef611977", + "blockNumber": 14893510, "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "index": 54, + "index": 26, "topics": [ "0xa65fb05c5808f5f389d72edeaf719ce38f4cc55c1f69ca3cbfb31c21501caa07", - "0xdf51ca1fa6bf804fc5dfbf513fb7282e053f136c07f7c4f9b3a95012943e1a10" + "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1" ], - "transactionHash": "0x4fe20e6a94338e9af63ac00fb3217ee8684c03752703e9bd1dafacc0bf140b0b", + "transactionHash": "0x9269e4f2d8fe7a560798f5b41ce72f65369010cdf2f08f40aa8989b8208e3db6", "transactionIndex": 3 }, { "address": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", - "blockHash": "0xfe5cd2518509c70a46a9bf74d21fea00dbc2938f45039e9ec2270ff9463b0cd6", - "blockNumber": 14852267, + "blockHash": "0x45961ccde7270c57754780ed2b0d10b9ae31072dced89009f3582784ef611977", + "blockNumber": 14893510, "data": "0x", - "index": 55, + "index": 27, "topics": [ "0x4383d976757d67ca920616be0b6430a681ea9d3dcce8d6d61d4603ca4a9bff63", - "0xdf51ca1fa6bf804fc5dfbf513fb7282e053f136c07f7c4f9b3a95012943e1a10" + "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1" ], - "transactionHash": "0x4fe20e6a94338e9af63ac00fb3217ee8684c03752703e9bd1dafacc0bf140b0b", + "transactionHash": "0x9269e4f2d8fe7a560798f5b41ce72f65369010cdf2f08f40aa8989b8208e3db6", "transactionIndex": 3 } ], - "logsBloom": "0x00000000000010000000000000080000000000000000010000000000004000000080000000000000000000000040020000000000000000000000000000004000000000000000200000000000000000000000000000000000800000000000000000000000000002000000000000000000004000000400000000100000000000008000000000000000000100000000000000000800000040000000000000000000004000800001000000000000000000002200000400000000100000000004000000000002000000000000000000000000000000000008000000000000000000000000000000000008000000000000000200000000000080100000000008000000", + "logsBloom": "0x00000000000010000000000000080000000000000000010000000000004000000080000000000000000000000060020000000000000000000000000000080000000000000000200000000000000000040000000000000000800000000000000000000020000000008000000000000000004000000400000000000000000000000000000000000000000100000000000000000800010000000000000000000000004000800001000000000000000000002200000000000000100000000004000000000002000000000000000000000000000000000008000000000000000000000000000000000008000000000000000200000000000080100000000008000000", "status": 1, "to": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463" }, - "metadata": "{\"compiler\":{\"version\":\"0.8.23+commit.f704f362\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IWETH9\",\"name\":\"weth\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"internalType\":\"contract IJBDirectory\",\"name\":\"directory\",\"type\":\"address\"},{\"internalType\":\"contract IJBController\",\"name\":\"controller\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InsufficientPayAmount\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InvalidTwapSlippageTolerance\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InvalidTwapWindow\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"NoProjectToken\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"denominator\",\"type\":\"uint256\"}],\"type\":\"error\",\"name\":\"PRBMath_MulDiv_Overflow\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"PoolAlreadySet\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"SpecifiedSlippageExceeded\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"T\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"UNAUTHORIZED\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"Unauthorized\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"tokenCount\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"Mint\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\",\"indexed\":true},{\"internalType\":\"address\",\"name\":\"newPool\",\"type\":\"address\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"PoolAdded\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"pool\",\"type\":\"address\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"amountOut\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"Swap\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"oldTwapTolerance\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"newTwapTolerance\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"TwapSlippageToleranceChanged\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"oldSecondsAgo\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"newSecondsAgo\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"TwapWindowChanged\",\"anonymous\":false},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"CONTROLLER\",\"outputs\":[{\"internalType\":\"contract IJBController\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"DIRECTORY\",\"outputs\":[{\"internalType\":\"contract IJBDirectory\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MAX_TWAP_SLIPPAGE_TOLERANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MAX_TWAP_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MIN_TWAP_SLIPPAGE_TOLERANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MIN_TWAP_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"PERMISSIONS\",\"outputs\":[{\"internalType\":\"contract IJBPermissions\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"PROJECTS\",\"outputs\":[{\"internalType\":\"contract IJBProjects\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"TWAP_SLIPPAGE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"UNISWAP_V3_FACTORY\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"WETH\",\"outputs\":[{\"internalType\":\"contract IWETH9\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"struct JBAfterPayRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"amount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"forwardedAmount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"projectTokenCount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"hookMetadata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"payerMetadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"payable\",\"type\":\"function\",\"name\":\"afterPayRecordedWith\"},{\"inputs\":[{\"internalType\":\"struct JBBeforePayRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"terminal\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"amount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reservedRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"beforePayRecordedWith\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"struct JBPayHookSpecification[]\",\"name\":\"hookSpecifications\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"contract IJBPayHook\",\"name\":\"hook\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}]},{\"inputs\":[{\"internalType\":\"struct JBBeforeRedeemRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"terminal\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"holder\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"redeemCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"surplus\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"bool\",\"name\":\"useTotalSurplus\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"redemptionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"beforeRedeemRecordedWith\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"struct JBRedeemHookSpecification[]\",\"name\":\"hookSpecifications\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"contract IJBRedeemHook\",\"name\":\"hook\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"hasMintPermissionFor\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"poolOf\",\"outputs\":[{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"projectTokenOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"uint32\",\"name\":\"twapWindow\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"twapSlippageTolerance\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setPoolFor\",\"outputs\":[{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"newPool\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newSlippageTolerance\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setTwapSlippageToleranceOf\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"newWindow\",\"type\":\"uint32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setTwapWindowOf\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"twapSlippageToleranceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"twapWindowOf\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}]},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"amount0Delta\",\"type\":\"int256\"},{\"internalType\":\"int256\",\"name\":\"amount1Delta\",\"type\":\"int256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"uniswapV3SwapCallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"afterPayRecordedWith((address,uint256,uint256,(address,uint8,uint32,uint256),(address,uint8,uint32,uint256),uint256,uint256,address,bytes,bytes))\":{\"details\":\"This function is only called if the minimum return from the swap exceeds the return from minting by paying the project. If the swap reverts (due to slippage, insufficient liquidity, or something else), then the hook mints the number of tokens which a payment to the project would have minted.\",\"params\":{\"context\":\"The pay context passed in by the terminal.\"}},\"beforePayRecordedWith((address,address,(address,uint8,uint32,uint256),uint256,uint256,address,uint256,uint256,bytes))\":{\"params\":{\"context\":\"Payment context passed to the data hook by `terminalStore.recordPaymentFrom(...)`. `context.metadata` can specify a Uniswap quote and specify how much of the payment should be used to swap. If `context.metadata` does not specify a quote, one will be calculated based on the TWAP. If `context.metadata` does not specify how much of the payment should be used, the hook uses the full amount paid in.\"},\"returns\":{\"hookSpecifications\":\"Specifications containing pay hooks, as well as the amount and metadata to send to them. Fulfilled by the terminal. If tokens are only being minted, `hookSpecifications` will be empty.\",\"weight\":\"The weight to use. If tokens are being minted from the project, this is the original weight. If tokens are being bought from the pool, the weight is 0. If tokens are being minted AND bought from the pool, this weight is adjusted to take both into account.\"}},\"beforeRedeemRecordedWith((address,address,uint256,uint256,uint256,uint256,(address,uint8,uint32,uint256),bool,uint256,bytes))\":{\"details\":\"Pass redeem context back to the terminal without changes.\",\"params\":{\"context\":\"The redeem context passed in by the terminal.\"}},\"constructor\":{\"params\":{\"controller\":\"The controller used to mint and burn tokens.\",\"directory\":\"The directory of terminals and controllers.\",\"factory\":\"The address of the Uniswap v3 factory. Used to calculate pool addresses.\",\"weth\":\"The WETH contract.\"}},\"setPoolFor(uint256,uint24,uint32,uint256,address)\":{\"details\":\"Uses create2 for callback auth and to allow adding pools which haven't been deployed yet. This can be called by the project's owner or an address which has the `JBPermissionIds.SET_BUYBACK_POOL` permission from the owner.\",\"params\":{\"fee\":\"The fee used in the pool being set, as a fixed-point number of basis points with 2 decimals. A 0.01% fee is `100`, a 0.05% fee is `500`, a 0.3% fee is `3000`, and a 1% fee is `10000`.\",\"projectId\":\"The ID of the project to set the pool for.\",\"terminalToken\":\"The address of the terminal token that payments to the project are made in.\",\"twapSlippageTolerance\":\"The maximum spread allowed between the amount received and the TWAP.\",\"twapWindow\":\"The period of time over which the TWAP is computed.\"},\"returns\":{\"newPool\":\"The pool that was set for the project and terminal token.\"}},\"setTwapSlippageToleranceOf(uint256,uint256)\":{\"details\":\"This can be called by the project's owner or an address with `JBPermissionIds.SET_BUYBACK_TWAP` permission from the owner.\",\"params\":{\"newSlippageTolerance\":\"The new TWAP slippage tolerance, out of `TWAP_SLIPPAGE_DENOMINATOR`.\",\"projectId\":\"The ID of the project to set the TWAP slippage tolerance of.\"}},\"setTwapWindowOf(uint256,uint32)\":{\"details\":\"This can be called by the project's owner or an address with `JBPermissionIds.SET_BUYBACK_TWAP` permission from the owner.\",\"params\":{\"newWindow\":\"The new TWAP window.\",\"projectId\":\"The ID of the project to set the TWAP window of.\"}},\"supportsInterface(bytes4)\":{\"details\":\"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.\"},\"twapSlippageToleranceOf(uint256)\":{\"details\":\"The \\\"TWAP slippage tolerance\\\" is the maximum negative spread between the TWAP and the expected return from a swap. If the expected return unfavourably exceeds the TWAP slippage tolerance, the swap will revert.\",\"params\":{\"projectId\":\"The ID of the project which the TWAP slippage tolerance applies to.\"},\"returns\":{\"_0\":\"tolerance The maximum slippage allowed relative to the TWAP, as a percent out of `TWAP_SLIPPAGE_DENOMINATOR`.\"}},\"twapWindowOf(uint256)\":{\"details\":\"The \\\"TWAP window\\\" is the period over which the TWAP is computed.\",\"params\":{\"projectId\":\"The ID of the project which the TWAP window applies to.\"},\"returns\":{\"_0\":\"secondsAgo The TWAP window in seconds.\"}},\"uniswapV3SwapCallback(int256,int256,bytes)\":{\"params\":{\"amount0Delta\":\"The amount of token 0 being used for the swap.\",\"amount1Delta\":\"The amount of token 1 being used for the swap.\",\"data\":\"Data passed in by the swap operation.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"CONTROLLER()\":{\"notice\":\"The controller used to mint and burn tokens.\"},\"DIRECTORY()\":{\"notice\":\"The directory of terminals and controllers.\"},\"MAX_TWAP_SLIPPAGE_TOLERANCE()\":{\"notice\":\"Projects cannot specify a TWAP slippage tolerance larger than this constant (out of `MAX_SLIPPAGE`).\"},\"MAX_TWAP_WINDOW()\":{\"notice\":\"Projects cannot specify a TWAP window longer than this constant.\"},\"MIN_TWAP_SLIPPAGE_TOLERANCE()\":{\"notice\":\"Projects cannot specify a TWAP slippage tolerance smaller than this constant (out of `MAX_SLIPPAGE`).\"},\"MIN_TWAP_WINDOW()\":{\"notice\":\"Projects cannot specify a TWAP window shorter than this constant.\"},\"PERMISSIONS()\":{\"notice\":\"A contract storing permissions.\"},\"PROJECTS()\":{\"notice\":\"The project registry.\"},\"TWAP_SLIPPAGE_DENOMINATOR()\":{\"notice\":\"The denominator used when calculating TWAP slippage percent values.\"},\"UNISWAP_V3_FACTORY()\":{\"notice\":\"The address of the Uniswap v3 factory. Used to calculate pool addresses.\"},\"WETH()\":{\"notice\":\"The wETH contract.\"},\"afterPayRecordedWith((address,uint256,uint256,(address,uint8,uint32,uint256),(address,uint8,uint32,uint256),uint256,uint256,address,bytes,bytes))\":{\"notice\":\"Swap the specified amount of terminal tokens for project tokens, using any leftover terminal tokens to mint from the project.\"},\"beforePayRecordedWith((address,address,(address,uint8,uint32,uint256),uint256,uint256,address,uint256,uint256,bytes))\":{\"notice\":\"The `IJBRulesetDataHook` implementation which determines whether tokens should be minted from the project or bought from the pool.\"},\"beforeRedeemRecordedWith((address,address,uint256,uint256,uint256,uint256,(address,uint8,uint32,uint256),bool,uint256,bytes))\":{\"notice\":\"To fulfill the `IJBRulesetDataHook` interface.\"},\"hasMintPermissionFor(uint256,address)\":{\"notice\":\"Required by the `IJBRulesetDataHook` interfaces. Return false to not leak any permissions.\"},\"poolOf(uint256,address)\":{\"notice\":\"The Uniswap pool where a given project's token and terminal token pair are traded.\"},\"projectTokenOf(uint256)\":{\"notice\":\"The address of each project's token.\"},\"setPoolFor(uint256,uint24,uint32,uint256,address)\":{\"notice\":\"Set the pool to use for a given project and terminal token (the default for the project's token <-> terminal token pair).\"},\"setTwapSlippageToleranceOf(uint256,uint256)\":{\"notice\":\"Set the TWAP slippage tolerance for a project. The TWAP slippage tolerance is the maximum spread allowed between the amount received and the TWAP.\"},\"setTwapWindowOf(uint256,uint32)\":{\"notice\":\"Change the TWAP window for a project. The TWAP window is the period of time over which the TWAP is computed.\"},\"twapSlippageToleranceOf(uint256)\":{\"notice\":\"Get the TWAP slippage tolerance for a given project ID.\"},\"twapWindowOf(uint256)\":{\"notice\":\"Get the TWAP window for a given project ID.\"},\"uniswapV3SwapCallback(int256,int256,bytes)\":{\"notice\":\"The Uniswap v3 pool callback where the token transfer is expected to happen.\"}},\"version\":1}},\"settings\":{\"remappings\":[\"@bananapus/=node_modules/@bananapus/\",\"@chainlink/=node_modules/@chainlink/\",\"@eth-optimism/=node_modules/@eth-optimism/\",\"@exhausted-pigeon/=node_modules/@exhausted-pigeon/\",\"@openzeppelin/=node_modules/@openzeppelin/\",\"@prb/=node_modules/@prb/\",\"@scroll-tech/=node_modules/@scroll-tech/\",\"@sphinx-labs/contracts/=node_modules/@sphinx-labs/contracts/contracts/foundry/\",\"@uniswap/=node_modules/@uniswap/\",\"base64-sol/=node_modules/base64-sol/\",\"ds-test/=lib/forge-std/lib/ds-test/src/\",\"forge-std/=lib/forge-std/src/\",\"hardhat/=node_modules/hardhat/\",\"solmate/=node_modules/solmate/\",\"sphinx/=lib/sphinx/packages/contracts/contracts/forge-std/src/\"],\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"compilationTarget\":{\"src/JBBuybackHook.sol\":\"JBBuybackHook\"},\"evmVersion\":\"paris\",\"libraries\":{}},\"sources\":{\"node_modules/@bananapus/core/src/abstract/JBPermissioned.sol\":{\"keccak256\":\"0x6486c11bff6384bfa938feb7aaacc977f457abff25b17b9aa094077d3fef71f8\",\"urls\":[\"bzz-raw://8b5190202326b6499391d5128cdb2d9ff44e91cd9ba6d8a5fe01e6f21259270d\",\"dweb:/ipfs/QmR2ufPwHtCAZYkJoyWyyag6BfdaWpaLk7VhuDc6BRLqVe\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/enums/JBApprovalStatus.sol\":{\"keccak256\":\"0x61c69b6bac7d24b566d87cda23a77e4ca9cdb87200b106aba8534cb9a0973e33\",\"urls\":[\"bzz-raw://6a9ca7249de76f77a8252eefe6bd1b63d47952f25a2acfa2c8db967cdff4470c\",\"dweb:/ipfs/QmaxSxptRQNj8bNy96EreENmrnRWdKmhyihBcxyWzBX5BN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBController.sol\":{\"keccak256\":\"0xc29d388bc66931c8f236d9e27f0414120323584258c3557f7d93be053f24bafd\",\"urls\":[\"bzz-raw://628aab4035065cd043cff54436cd21db92f7551899ff42f4ee60a4fec6839276\",\"dweb:/ipfs/QmbdSuUYQL9RYkR97hDVLZw82R7o6p2vEBpPamgqUpHiE4\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBDirectory.sol\":{\"keccak256\":\"0x9cc380844aef60078ee47a61861e55a29c4a8c947efd556ebd36e6909f7b9d62\",\"urls\":[\"bzz-raw://9f5190ec8b6683d9781ee6e9eedcc91294753242748875d4a06349077e4cbaaf\",\"dweb:/ipfs/QmTQrPuXT9TCA4txwrperMeXSGvGxP8iokUK47f62F388i\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBDirectoryAccessControl.sol\":{\"keccak256\":\"0x1e67f56849320a46f834aaa9bd62b170ff8ada7b224b4a81136193740fa0be4d\",\"urls\":[\"bzz-raw://ea8fbcec44abfe49d137bcae129b67e5479d6b17879301f88534c8a7fab00be4\",\"dweb:/ipfs/QmT6wrtYX4GRpffHUzupNwYebJ1dqkkKZLEewWsoyunsqw\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFeeTerminal.sol\":{\"keccak256\":\"0xdb6f3349cbe2078faa8421dec892136693748d8a60b70a1dee3bce2cfc5274fc\",\"urls\":[\"bzz-raw://ccc6a67fc72726c6180c41523cc2a43562864347770a86ff54532fb6ca09e7c3\",\"dweb:/ipfs/QmZinV1LoRsmTq713YGvNShaPtGaxLqwJ6u2EwwGKEKCgu\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFeelessAddresses.sol\":{\"keccak256\":\"0xe5df42cfa71c5fa41b905c122de5825df13c2aab2f9cc4cf4bafa331dd69c27e\",\"urls\":[\"bzz-raw://3773bf3b42cc57d1e4086147e52135ff1dbff4309c45ca0398f821dfaa071563\",\"dweb:/ipfs/QmXUEJssHaxYKfV33tMZGf81JTR5a5yxEVshzNus84xLuT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFundAccessLimits.sol\":{\"keccak256\":\"0xf5fd6bdd723b60d490ccbe22cdf1cfe43663d23e6ee48badcd1b71e3282cb16b\",\"urls\":[\"bzz-raw://fe692f0b843ea5fccdfcb68f4ec16e1c0add945bb74b303c9866342be0e31fbf\",\"dweb:/ipfs/QmSRmzpgp3DhNEhNDiLsSu7yEiTeywbzEFbwyGyDazjgKt\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBMultiTerminal.sol\":{\"keccak256\":\"0xc7b4f5043ec5733f5b303688f3dbf475ef5f6fe12364847a538c8b48a2137fb7\",\"urls\":[\"bzz-raw://fcd1b41a2acfd035e285e6f20f983b9b00a4e00c688a3072062dfb7f5c9c5afe\",\"dweb:/ipfs/QmYCfjakBGxWWTvb5Pk9UAeguwiWrnsNviQWMsaYz7Xq5N\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPayHook.sol\":{\"keccak256\":\"0x9438866782c652c2942f4d114e35f393cd3c8b0334abce8387eed90bca35e8b2\",\"urls\":[\"bzz-raw://cfd99daf57213f92325aad7d7d16e98476d38e870470e95ba01e3ae3cdecc95d\",\"dweb:/ipfs/QmUKKAVGf7ki8BHksr99tFcRW8APveeB5tNH63ctTbbCW8\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPayoutTerminal.sol\":{\"keccak256\":\"0xd0f9374470591c4afb2525c9c7b1bdad577765857c404b22ee5d8d2997a18fad\",\"urls\":[\"bzz-raw://4529c066b2014ee64b8fb16981a9fd5badf64dea7ac6c07dd1b1e7ab5cdc1d8a\",\"dweb:/ipfs/QmYxTdPjRAZ8iThUoNmJuivEaRaB3xXpyHdhCU7my1UHZy\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermissioned.sol\":{\"keccak256\":\"0x5b038d4dee116584e88b230920e56d48e135053e3f7e5642eaea14a775c1dad7\",\"urls\":[\"bzz-raw://19e43102f349fd4a1da1c0943ffb8f2950007fe4bb4bb7e8f74fc142575d091b\",\"dweb:/ipfs/QmXHAt4KzDTdDZgDDefEXH2WKi7NcfkJb9R7nxW5uDqsNp\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermissions.sol\":{\"keccak256\":\"0x49d2b91a866004af098a6770b28040071885b048b4b50744b12a1e5b212c5e5e\",\"urls\":[\"bzz-raw://089b4dda50be91412ffe1fbe333f78cc894f073c1a7afe469f10a2cee12fbf9e\",\"dweb:/ipfs/QmYPPBZ6HwBa1RNkNGqGcR2xgj4fnWBzrPHHoJG3kZA6AN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermitTerminal.sol\":{\"keccak256\":\"0xd6bd30842273f5b794f82219fefdd4953f5343328d2cfdb684b7d826cc0c769c\",\"urls\":[\"bzz-raw://ca1195fd5572060b36fc7e45f46d59f974e3a908248edcfadeb8cb06247075f0\",\"dweb:/ipfs/QmYTpDXKTXqi8GQFsNqB8LiGFTZjSPY3PA8vKqZBraVdqD\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPriceFeed.sol\":{\"keccak256\":\"0x4bd84c0f1a5d4729ed709bcddd43f4c50ec4a165ece79780af8dce482ed07d4a\",\"urls\":[\"bzz-raw://62bac4bfb6982fb002f620c77e5c445e62d50241a5aa64a07e51d929f5a42180\",\"dweb:/ipfs/QmWgJUDreVY2BuMX38a1iUUR5kNbMwGnKG3VvurB7oZtuM\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPrices.sol\":{\"keccak256\":\"0xa4988a8984774e9f9d355236e3c4ab67868503964747684d989ceb54a4176361\",\"urls\":[\"bzz-raw://7496393b49f8a594e6bc3393ffab118e4dc95f69233c77046cd552b1c52a533a\",\"dweb:/ipfs/QmavDESpty7XFmLgWKMHb3venZVPGwwKevWmYStM2mxcPH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBProjectUriRegistry.sol\":{\"keccak256\":\"0x2799475228987e4f8334ac33d3935f759c9b8133db7383b4f622dde7a5dc0502\",\"urls\":[\"bzz-raw://d751731740f45df74eea48c9667e847ee2cddb2980ab4939c86bd17e6c6ed89b\",\"dweb:/ipfs/QmXW8SLTuhdUpfn7pRpdsYdcyuim8RTyagU37ULcj5UZhT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBProjects.sol\":{\"keccak256\":\"0x735c2fb8f1fa827f054ee77f7a0ae4b312656217acb75b624d2c8fd9dc40151b\",\"urls\":[\"bzz-raw://ee7fc92299a8633a80693ae63ab494dcd125f1789487a54a39dc0e5696e5996f\",\"dweb:/ipfs/QmX7YJD4pS2XhgQb7p3JbBAXynT7YGPXcZe92BiWWRrsCL\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRedeemHook.sol\":{\"keccak256\":\"0x8ab46fcd7d0e739661eb76056ad93ff99106f38420ef0b4eb97fa9f4bb71a68a\",\"urls\":[\"bzz-raw://0ef96fcb7ad26281d444d8e0c677b25114fdd63b1c172d477e030dce8ba53b62\",\"dweb:/ipfs/Qmcx1jRQuwU4pZFuLxsSsx4oMbRaDfktHrPnXextgbWc5m\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRedeemTerminal.sol\":{\"keccak256\":\"0xd1b4aa38154e08f1474745ea6bc8f8823fe8aa68c124d596742597f2296ea16d\",\"urls\":[\"bzz-raw://9bd254e833702dfe5e28db5fee76478947ab45b501c966501f719e73bbf0397a\",\"dweb:/ipfs/QmZ3Ng7TmVxL6ozSUhx4kYdQdZhoYi4t43cYZVAMz7Fn5M\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesetApprovalHook.sol\":{\"keccak256\":\"0x592e95d159494421c6b1bcb362d0cee1df0132921697351304e9cd7af4fbd386\",\"urls\":[\"bzz-raw://5bebfd5fa67c1b6ea16fa2e76e9520e9dfe52a579f48dd94d0c2ec45f78ad178\",\"dweb:/ipfs/QmRUawEGtfYoYSHmHELGhvJoWuMsxLPKtqAXgsrb7fJboP\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesetDataHook.sol\":{\"keccak256\":\"0x13b4b9f4b847f62442da1c1a59b399f8f201b31a28edb96aa5a8a78ad57c24d0\",\"urls\":[\"bzz-raw://4fcd00b77d0f40cf6d5ee6590b6ef4ee1f606e89ae4c4faed3710fb462108f8e\",\"dweb:/ipfs/QmeoE54DQ3eGw9EDXfN7aTMmEjubAtirahmytDijo6GSeE\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesets.sol\":{\"keccak256\":\"0x011d86a1ea51aed45ee83ce7b289e7abd231074ce1a12e53faa194811d5334c0\",\"urls\":[\"bzz-raw://c7d03e746e28f6d381c4a81e1b7599f01b84fa52e97106105f7a402f689b6395\",\"dweb:/ipfs/QmT7nWeCGnPaBQuCKFpmoZNiXzkCWCVLZJJAf9i4D6xNJg\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBSplitHook.sol\":{\"keccak256\":\"0xeb8dfac7a4b81897a1c3b5d0d853a406bcff33720fb187d5ca5bb3dcc0ba3a12\",\"urls\":[\"bzz-raw://36aaeef6107cfe5b0127e063ea215aac7200f8af02e28a48e61111abd3254688\",\"dweb:/ipfs/QmQ8yQANXnhQCAWBGKsKCDsJ3A8hnTKNg5tyo79GfWXTcV\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBSplits.sol\":{\"keccak256\":\"0xd8894cfc55560d914f413e40c981165e1e9dc845b35cdf0ecd13fd118733a483\",\"urls\":[\"bzz-raw://e03b8e5e34c924a91884e3ef79ea039292f8927241698db84a09a463ced4cc52\",\"dweb:/ipfs/QmSqhVX2LSStR7xEcc96zAiQpTPDSsZBn8YvH33CtiU1FN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTerminal.sol\":{\"keccak256\":\"0x8981b96902125707c49c63867b718118fdfb04cb8fd42b038d93ef87ea56f85c\",\"urls\":[\"bzz-raw://7b172c6924a10431652eab136758953a51af8d709a55afff1533d13e687be60c\",\"dweb:/ipfs/QmWczAk48Jw8qNgrUn4EFRK25CrmCp7MmEaJsGtTXueaEb\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTerminalStore.sol\":{\"keccak256\":\"0x140159d66d729f6aeed0fe1f7c655619985146ec00e8c68cbd9b5d30d4dc7d23\",\"urls\":[\"bzz-raw://f972ecb52bcfcd2852c9e7264b1ecc504ce94bd6e12c034b93c1768cd372954e\",\"dweb:/ipfs/QmRu7in5iJSWHLTcFPbJmiK1rCHFbwNY7qzY4cG6kgfYcr\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBToken.sol\":{\"keccak256\":\"0x71b1f9c3a0edd41910f77396e0be2c65596571176d53eb87e887c3c0da56c0fb\",\"urls\":[\"bzz-raw://6e956f0582f4525e83d845ee9b4a89959abc4f821414f6accbbee5b38960482d\",\"dweb:/ipfs/QmbSvjgmCgnfVmcCTGu8XwrV1Rufsf3M8hB8unFq6fTMdH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTokenUriResolver.sol\":{\"keccak256\":\"0xfa5cb00dcd6085d1ef912d071fe73c63f9478a2cd0f9d8bddaf659b6af2d0967\",\"urls\":[\"bzz-raw://282e4e7c342d65f77cde0e9a08fcaf20ef5cf379c7a48b639842c0ffd0b2afb8\",\"dweb:/ipfs/QmbnN3PEQeZaXdPLT75V1J79kMg7KqSMru37RHrL3z8Yf2\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTokens.sol\":{\"keccak256\":\"0x6fd67af915dd541d9547c8297aa9ae269690e4ee23531db43f021bcacec6076f\",\"urls\":[\"bzz-raw://2e5e11954e9ab2319fffccb6563f3db400b8f7760d4ffe2165048a02c9c37fa6\",\"dweb:/ipfs/QmbDXtV83dK8EfiTjsTRf55R2XqPZzDKcjtYbW8sxQ5CFm\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/libraries/JBConstants.sol\":{\"keccak256\":\"0xf7994eb0ab6979633ad42bf274f7679dcfcc81e0a35fe931d35b663ba6cb808f\",\"urls\":[\"bzz-raw://b6caec5469c07153fc7b9d6f2e1370e3da4e6386829a1fe99e02526464754610\",\"dweb:/ipfs/QmRXsoUc1FzxFHLvNQvxjZMRaiovdeTskcA5XZz4AEVGdq\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/libraries/JBMetadataResolver.sol\":{\"keccak256\":\"0xdf32038c5e7f65725e2ef87d09fe04972d7da6a63b60c066d4616b2c2ada5149\",\"urls\":[\"bzz-raw://50582c41ee196ead31d13dcc5a468436d524891d7873743ba92d1d64a0b5783a\",\"dweb:/ipfs/QmPiJMbA1oQnVKQTjqYvUvtWaaiFCeKic8NJtu2crrAznW\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAccountingContext.sol\":{\"keccak256\":\"0x9c47e048a719f784f601df69a583505432217b9868a0244876d277f84dd1ebdf\",\"urls\":[\"bzz-raw://8565f194b87914da9a02af2e760ae2ed2a9d185c6f11229f7035140776d2fec9\",\"dweb:/ipfs/QmPs2fic8W3F5e5zNRwmGmJFjb3JWGPWJ3YUe5o82nQgEn\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAfterPayRecordedContext.sol\":{\"keccak256\":\"0xd26c3a774ff38be79064085970454fe2603a23a638c76270d5b1b3829206c3e8\",\"urls\":[\"bzz-raw://3b55dbe3bf1ef625b7ca04efab3de35406e6041d5b3d82c7265469c500e2b702\",\"dweb:/ipfs/QmUdBDo4Lt3mcsFcsXT2mqq3czFwZjQJFPLM89YA2VtD7k\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAfterRedeemRecordedContext.sol\":{\"keccak256\":\"0x521f5d23a36f0da72362cd84890cc867bd83baa8dc836ba6c5066d51dba2f163\",\"urls\":[\"bzz-raw://6cc461313286dde62d045d6288e87bae5032e035796326f5b1ed6218e58aa9da\",\"dweb:/ipfs/QmQS2AkQwf2ANQieDuaUnpJEdXChoLv4CCbZqHkfywYPSR\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBBeforePayRecordedContext.sol\":{\"keccak256\":\"0x5b04e814da83c7e83ff892ab07eaad6abce6f7b85a75f8da9380e9fc3470bc81\",\"urls\":[\"bzz-raw://11c889aab993fce3e3cc2dedc15fc30dd367e7fef9b7b1bfd6a6a9f248781731\",\"dweb:/ipfs/QmVVtydCD1azeWhGLxA1hthxfLyKzMHZ1eVzCz3a3R5dLy\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBBeforeRedeemRecordedContext.sol\":{\"keccak256\":\"0x73eadaf6827e82f6ccbe3a1e2b2b7fc6c59cef471f73335041b30ddcc000989d\",\"urls\":[\"bzz-raw://2f3ee84662eed565dbdaed406ef836fffaf55cccd417575578152e5085d0b1f2\",\"dweb:/ipfs/QmaJGFS7hxJsiUdKvbv5BKhSwceDEzKBnt7t5YeNWvYgMK\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBCurrencyAmount.sol\":{\"keccak256\":\"0x7f321bbcbd13abfbc8f0d08a5adaaf8ef312db5bb899012fcffb6170fbb962a9\",\"urls\":[\"bzz-raw://bf9301ef1dbb3abda7b492585377617508ba048c6170f21a5e7d2b3c034eb384\",\"dweb:/ipfs/QmcetEFxSYLLNSZzPBpNn3Fc8sFcrFE8A8h12ZSj2tLgxD\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBFee.sol\":{\"keccak256\":\"0xffacd6dcce11a5cdd54aba7a5d8f9b28b9b36b87771dea746a117b616519bbd0\",\"urls\":[\"bzz-raw://c278d6efa1dd694c8aceba43b2cb3f2b49a52d9b15fc23089def526e4ba23778\",\"dweb:/ipfs/QmVHEGGAfsUVE791aGeYZBiymU6aJ278PoGmH9SRLY1U4N\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBFundAccessLimitGroup.sol\":{\"keccak256\":\"0x9fdaa8d017b72da25f583700a444a86849df053f7fb8eac874ec5139bcf651e5\",\"urls\":[\"bzz-raw://c8e44c49ee444a98424a0dbeb6897a76a0bf00d88a613f62ac2012afdac754ee\",\"dweb:/ipfs/QmdYkAiRi5bXM1YYNkc7BiqimHSFodMGn1cjHR5hcpm4xH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBPayHookSpecification.sol\":{\"keccak256\":\"0x955f0bfca97300b9e5927dc181753830ee362f83fa9ca32a90daade32aa0cfd5\",\"urls\":[\"bzz-raw://f517af1597c7c40f8d3da53f7a6684a3e162950a16559d6bf6ea3b727bb11546\",\"dweb:/ipfs/QmRWo2ZTYXmVZTzNJDYhsJNsEaHphjpUfx9eNz2cciyz86\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBPermissionsData.sol\":{\"keccak256\":\"0xd5a5fe65b1deb40b5cd9c8e05bc1352d0e95f3a18b4986fab7abdc621beb19c7\",\"urls\":[\"bzz-raw://a6141eaa414d3d61de671ae3584b87e98044bf6392cb94d2acd1bb5cc7c19db4\",\"dweb:/ipfs/QmbtvALmburKLRC5fHXscoeZii1N2qQrJAdqarfvSKaKEk\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRedeemHookSpecification.sol\":{\"keccak256\":\"0x673d16ee1a91bf8de3b37e57284e60451b70a9c2d748c9cdc7a151f5624af18f\",\"urls\":[\"bzz-raw://ceeb5e81effa0f076c5630c756dfcf1548d09f822b255a0a6ee01e54de8c8ae2\",\"dweb:/ipfs/QmSMoMNPRhPMnuJNvWa6S59XRfycGz9o2ApNp63bUW6TdX\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRuleset.sol\":{\"keccak256\":\"0xa40e937554418f9cc5949200ee64a434ece55b8e67f35d3c4c47a3dfbadaebbf\",\"urls\":[\"bzz-raw://87e1fb1b1c9ed2fe1948251ba5f839a33bb50ff5a1a6ef292aae6bbbeeb5f619\",\"dweb:/ipfs/QmUWTJPxqeHfciYT2kobif55CJLQaMHYtZFGju6LyWbv9D\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetConfig.sol\":{\"keccak256\":\"0x3d14de125bd1e4fa9dc3e20937fcc2aa666e0b9cfb63ff520189c5d27fea594a\",\"urls\":[\"bzz-raw://2c4a164ce0f4fce85e1c1d62be3497cd5d411c763d9582aad19901e9fb3c6c44\",\"dweb:/ipfs/QmXiCaWQD7NVMxE7JjuoXAEaFwKDSZtbf2beSh8mDiE1PN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetMetadata.sol\":{\"keccak256\":\"0xa19eb9f4c543da1d204589355040f68528dac2e021571a887b8a46397290786c\",\"urls\":[\"bzz-raw://edf57813fb0325d908a3cf67e6ddc3c894186591a4c13c496421928366bb359c\",\"dweb:/ipfs/QmP27aqG3ofA9Mzmk9JUp9gnSfuVfZfBWDv69jJWqeZm3F\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetWithMetadata.sol\":{\"keccak256\":\"0x1bcfadf20488f6df65227f8d4d0fbf9b7539456a2389567f7fe3900d23289bc3\",\"urls\":[\"bzz-raw://0a15c399a71e5373f8c0484c6d6b83521eda31e063a2c53e4c5cec4e74550343\",\"dweb:/ipfs/QmQwi8zkjoTVXbK89NeETYimWCacTrNsesJdpLSvGdqMPX\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplit.sol\":{\"keccak256\":\"0x0e1351e80cf9967caee90094712a4fc884a83f07df23a844d8cb33ebcd00721e\",\"urls\":[\"bzz-raw://19d5793c08834f2ec1d6942bd43d05042b0ecc351a57235d748a8f2ff74b6638\",\"dweb:/ipfs/QmUWjyNg7x62KsvMwAzNdpmwqCo5qK5ip9pLdshj9B2Kbf\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplitGroup.sol\":{\"keccak256\":\"0x8dc98fa9e730bee8bcc0a8acf1bc4db1c9b0edf307d969c9c9caa4d6b8d856d9\",\"urls\":[\"bzz-raw://66f4306e0e69c82033927952564fd617e7c4b29aa8b165d5b53a0ebe3109ea12\",\"dweb:/ipfs/QmQqN1u7FHAdEtEZNRcKvZwYtXEQVQnLd6FMzHESP7wDtx\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplitHookContext.sol\":{\"keccak256\":\"0x1cef82bf434f91d518092ea7e57db4a72ce7654f48a7db9bf44882900b6b6623\",\"urls\":[\"bzz-raw://cc5012008ab7e74cf766fe1c202a23e3a73365356bcf1e0b04ec01baf21b204b\",\"dweb:/ipfs/QmSwJvd6Yrg9XZMhjquBcak5sfUswbR5nPEuJBfpjM54VT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBTerminalConfig.sol\":{\"keccak256\":\"0x2da40b8ae2b6a6038da0ac17d3ccf083a8fb54ea12684242342e53811cca997c\",\"urls\":[\"bzz-raw://9ddb66e9f90ce3005bb1fedd06ec66e6d3e99c52afaf729cee0a23ae01b21fab\",\"dweb:/ipfs/QmPTD9ciAZqj5WWuE5W4Ufs1kBvVokntrfSdUcV6Egh7eQ\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBTokenAmount.sol\":{\"keccak256\":\"0xc61593d33d5ec30e695d382948a1b944d01e29a8f2bfd29f75ecebcdbc7816de\",\"urls\":[\"bzz-raw://8992c1e5fca0c2342ecc0e734dfba6a2a752e4c29184784931d0971e44305051\",\"dweb:/ipfs/QmYNcaW3qeCkgAExUaFTq238fgfJuoYCTwjCn7jm94U4dJ\"],\"license\":\"MIT\"},\"node_modules/@bananapus/permission-ids/src/JBPermissionIds.sol\":{\"keccak256\":\"0x1bd511f9cc46d134ab4743dba50ee25b1c67b5b5e30a27cbfebb1c3fcfedc876\",\"urls\":[\"bzz-raw://6d81d52f481c89832c9c61fa4ea513196c6c8182878d1fbef2038ca39a909192\",\"dweb:/ipfs/QmbaRR5ZXF9PRJwEGbwoAydQiYUoQLYiej7CVmHHbFG29z\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0xce41876e78d1badc0512229b4d14e4daf83bc1003d7f83978d18e0e56f965b9c\",\"urls\":[\"bzz-raw://a2608291cb038b388d80b79a06b6118a42f7894ff67b7da10ec0dbbf5b2973ba\",\"dweb:/ipfs/QmWohqcBLbcxmA4eGPhZDXe5RYMMEEpFq22nfkaUMvTfw1\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"urls\":[\"bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c\",\"dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"],\"license\":\"MIT\"},\"node_modules/@prb/math/src/Common.sol\":{\"keccak256\":\"0xaa374e2c26cc93e8c22a6953804ee05f811597ef5fa82f76824378b22944778b\",\"urls\":[\"bzz-raw://279c732e161d623cf4d8a9519ca4c42c0c2db99842d0eb2a20c10fde3fa722c9\",\"dweb:/ipfs/QmVViuUXbinQGqtG5M21SgVzKihiCbFUChd4tDhtvwRmxH\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IAllowanceTransfer.sol\":{\"keccak256\":\"0x37f0ac203b6ef605c9533e1a739477e8e9dcea90710b40e645a367f8a21ace29\",\"urls\":[\"bzz-raw://e0104d72aeaec1cd66cc232e7de7b7ead08608efcc179491b8a66387614670b0\",\"dweb:/ipfs/QmfAZDyuNC9FXXbnJUwqHNwmAK6uRrXxtWEytLsxjskPsN\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IEIP712.sol\":{\"keccak256\":\"0xfdccf2b9639070803cd0e4198427fb0df3cc452ca59bd3b8a0d957a9a4254138\",\"urls\":[\"bzz-raw://f7c936ac42ce89e827db905a1544397f8bdf46db34cdb6aa1b90dea42fdb4c72\",\"dweb:/ipfs/QmVgurxo1N31qZqkPBirw9Z7S9tLYmv6jSwQp8R8ur2cBk\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IPermit2.sol\":{\"keccak256\":\"0xaa631cc9f53e699301d94233007110a345e6779011def484e8dd97b8fe0af771\",\"urls\":[\"bzz-raw://fc0502cf19c9c18f320a3001201e89e350393b75837f6b7971de18b2de06f30d\",\"dweb:/ipfs/QmT9SfhdJ7VJNNrf94g4H5usyi7ShqWGx7Cqsz9jZTjX96\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/ISignatureTransfer.sol\":{\"keccak256\":\"0xe6df9966f8841dc3958ee86169c89de97e7f614c81c28b9dc947b12d732df64e\",\"urls\":[\"bzz-raw://3d4eafdee7f48c3be8350a94eb6edd0bfb2af2c105df65787a77174f356c0317\",\"dweb:/ipfs/QmY1j2adeeAhNpn6cUuthemxGCdLXHTfyMh9yTKsY4mZ2d\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol\":{\"keccak256\":\"0x4e64844c56061cd90e0a80de73534a9166704c43eed579eb83f90bc2780ce968\",\"urls\":[\"bzz-raw://cba4fab5cebdddf644b901994a7f0f52b98885d4c56012f4dc51d52c2bf9de0e\",\"dweb:/ipfs/QmVyyrRmqXrAiapewWunRVgiPVFJHpH2hKiE1py1svMSNV\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol\":{\"keccak256\":\"0x3f485fb1a44e8fbeadefb5da07d66edab3cfe809f0ac4074b1e54e3eb3c4cf69\",\"urls\":[\"bzz-raw://095ce0626b41318c772b3ebf19d548282607f6a8f3d6c41c13edfbd5370c8652\",\"dweb:/ipfs/QmVDZfJJ89UUCE1hMyzqpkZAtQ8jUsBgZNE5AMRG7RzRFS\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions.sol\":{\"keccak256\":\"0x9453dd0e7442188667d01d9b65de3f1e14e9511ff3e303179a15f6fc267f7634\",\"urls\":[\"bzz-raw://982f4328f956c3e60e67501e759eb292ac487f76460c774c50e9ae4fcc92aae5\",\"dweb:/ipfs/QmRnzEDsaqtd9PJEVcgQi7p5aV5pMSvRUoGZJAdwFUJxgZ\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState.sol\":{\"keccak256\":\"0xe603ac5b17ecdee73ba2b27efdf386c257a19c14206e87eee77e2017b742d9e5\",\"urls\":[\"bzz-raw://8febc9bdb399a4d94bb89f5377732652e2400e4a8dee808201ade6848f9004e7\",\"dweb:/ipfs/QmaKDqYYFU4d2W2iN77aDHptfbFmYZRrMYXHeGpJmM8C1c\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolErrors.sol\":{\"keccak256\":\"0xf80abf13fb1fafc127ba4e792f240dd8ea7c8c893978cdfd8439c27fae9a037b\",\"urls\":[\"bzz-raw://b04fc72a656bbf3631e9c2e67b9870a2d9d235185e833fe050e9606e6816a9aa\",\"dweb:/ipfs/QmUcz4bkEkJ9pwzFu1C3n97hBQ3st9U6qTAqCdyFwddKco\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents.sol\":{\"keccak256\":\"0x8071514d0fe5d17d6fbd31c191cdfb703031c24e0ece3621d88ab10e871375cd\",\"urls\":[\"bzz-raw://d0b571930cc7488b1d546a7e9cea7c52d8b3c4e207da657ed0e0db7343b8cd03\",\"dweb:/ipfs/QmaGK6vVwB95QSTR1XMYvrh7ivYAYZxi3fD7v6VMA4jZ39\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables.sol\":{\"keccak256\":\"0xf6e5d2cd1139c4c276bdbc8e1d2b256e456c866a91f1b868da265c6d2685c3f7\",\"urls\":[\"bzz-raw://b99c8c9ae8e27ee6559e5866bea82cbc9ffc8247f8d15b7422a4deb287d4d047\",\"dweb:/ipfs/QmfL8gaqt3ffAnm6nVj5ksuNpLygXuL3xq5VBqrkwC2JJ3\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions.sol\":{\"keccak256\":\"0x759b78a2918af9e99e246dc3af084f654e48ef32bb4e4cb8a966aa3dcaece235\",\"urls\":[\"bzz-raw://64144fb96e1c7fdba87305acadb98a198d26a3d46c097cb3a666e567f6f29735\",\"dweb:/ipfs/QmUnWVwN9FKB9uV5Pr8YfLpWZnYM2DENnRMaadZ492JS9u\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.sol\":{\"keccak256\":\"0x44fa2ce1182f6c2f6bead3d1737804bf7e112252ae86e0f2e92f9b8249603f43\",\"urls\":[\"bzz-raw://54154e8665b98d65f5dc91b256551852cb47882180b501b260657122d207c0ea\",\"dweb:/ipfs/QmcfemK1A2PXYrWB5SBFGERpMCderbFRb8BtTzQDj1sUBp\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/libraries/FullMath.sol\":{\"keccak256\":\"0x7825565a4bb2a34a1dc96bbfead755785dfb0df8ef81bd934c43023689685645\",\"urls\":[\"bzz-raw://8f44f4614d31e3d4864c7eb13620555253b84f6a69180f8745b7c6e246a9d125\",\"dweb:/ipfs/QmfNQUcXj3KL8h9u5PqbtEC6yRtwDbKNb48uMPjdwxsKnd\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v3-core/contracts/libraries/TickMath.sol\":{\"keccak256\":\"0x5c57de03a91cc2ec8939865dbbcb0197bb6c353b711075eefd8e0fca5e102129\",\"urls\":[\"bzz-raw://1e994c24fd891ef8a3f5dbf5eba42b34feaf05e0376a29f91322faa18054449c\",\"dweb:/ipfs/QmNdUJGUQxd1dPkMbnA5f5UNqakxRkQE5r7bTZJAuHeapS\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-periphery/contracts/libraries/OracleLibrary.sol\":{\"keccak256\":\"0xe313f89c69c0f1c91f0722868313b4ceb14479b3e7a0abf52a1b9bbd9c18e81b\",\"urls\":[\"bzz-raw://8ad09b061f3f533c116618c20cf01510108eebebb7ff8847b0f245b8ba368d53\",\"dweb:/ipfs/QmU6vdi5JjJfjK2KqonWvRg9NeuQWarj4B1YFN22Dh9VJM\"],\"license\":\"GPL-2.0-or-later\"},\"src/JBBuybackHook.sol\":{\"keccak256\":\"0x853030183c6b3b1cde459af63eef64091af5807a0475a9ef8e1c1bd79db72da8\",\"urls\":[\"bzz-raw://8173a685a0ad9b79745c0af675c52432a61431655f271f68b2493a284b23826e\",\"dweb:/ipfs/QmSkiaYnV7hsiqXrew6WYxu3SwWKCv5wg6mCGsAk3ARrhP\"],\"license\":\"MIT\"},\"src/interfaces/IJBBuybackHook.sol\":{\"keccak256\":\"0xbe5d7f3bf2e18b569676ba9194e248e6b1ed50022f5247b4f1fa124c91bfd418\",\"urls\":[\"bzz-raw://eb221d1570e8aad409c419b6a2f84351e818c3527f3f44b806cd64c84d7a8c86\",\"dweb:/ipfs/QmUPZstaKjPN7VTywg3Mt6bF75E53mQbmXhf3TxCggJbRR\"],\"license\":\"MIT\"},\"src/interfaces/external/IWETH9.sol\":{\"keccak256\":\"0x50083bcaca6c1a8d12c79116fab4f6d8cd452a510cb3f00c4a8bc3a54678efb7\",\"urls\":[\"bzz-raw://726f187112d0953c14bff8099a8c9ce1ead47eb25e90839f77b100feaaf16127\",\"dweb:/ipfs/QmTEnMENpLjcTQLMwz4kEUiQHfiTkaZT3TL37nQ8JiRYh5\"],\"license\":\"GPL-2.0-or-later\"}},\"version\":1}", + "metadata": "{\"compiler\":{\"version\":\"0.8.23+commit.f704f362\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IWETH9\",\"name\":\"weth\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"internalType\":\"contract IJBDirectory\",\"name\":\"directory\",\"type\":\"address\"},{\"internalType\":\"contract IJBController\",\"name\":\"controller\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InsufficientPayAmount\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InvalidTwapSlippageTolerance\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InvalidTwapWindow\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"NoProjectToken\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"denominator\",\"type\":\"uint256\"}],\"type\":\"error\",\"name\":\"PRBMath_MulDiv_Overflow\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"PoolAlreadySet\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"SpecifiedSlippageExceeded\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"T\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"UNAUTHORIZED\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"Unauthorized\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"tokenCount\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"Mint\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\",\"indexed\":true},{\"internalType\":\"address\",\"name\":\"newPool\",\"type\":\"address\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"PoolAdded\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"pool\",\"type\":\"address\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"amountOut\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"Swap\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"oldTwapTolerance\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"newTwapTolerance\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"TwapSlippageToleranceChanged\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"oldSecondsAgo\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"newSecondsAgo\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"TwapWindowChanged\",\"anonymous\":false},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"CONTROLLER\",\"outputs\":[{\"internalType\":\"contract IJBController\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"DIRECTORY\",\"outputs\":[{\"internalType\":\"contract IJBDirectory\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MAX_TWAP_SLIPPAGE_TOLERANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MAX_TWAP_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MIN_TWAP_SLIPPAGE_TOLERANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MIN_TWAP_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"PERMISSIONS\",\"outputs\":[{\"internalType\":\"contract IJBPermissions\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"PROJECTS\",\"outputs\":[{\"internalType\":\"contract IJBProjects\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"TWAP_SLIPPAGE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"UNISWAP_V3_FACTORY\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"WETH\",\"outputs\":[{\"internalType\":\"contract IWETH9\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"struct JBAfterPayRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"amount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"forwardedAmount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"projectTokenCount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"hookMetadata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"payerMetadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"payable\",\"type\":\"function\",\"name\":\"afterPayRecordedWith\"},{\"inputs\":[{\"internalType\":\"struct JBBeforePayRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"terminal\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"amount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reservedPercent\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"beforePayRecordedWith\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"struct JBPayHookSpecification[]\",\"name\":\"hookSpecifications\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"contract IJBPayHook\",\"name\":\"hook\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}]},{\"inputs\":[{\"internalType\":\"struct JBBeforeRedeemRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"terminal\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"holder\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"redeemCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"surplus\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"bool\",\"name\":\"useTotalSurplus\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"redemptionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"beforeRedeemRecordedWith\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"struct JBRedeemHookSpecification[]\",\"name\":\"hookSpecifications\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"contract IJBRedeemHook\",\"name\":\"hook\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"hasMintPermissionFor\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"poolOf\",\"outputs\":[{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"projectTokenOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"uint32\",\"name\":\"twapWindow\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"twapSlippageTolerance\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setPoolFor\",\"outputs\":[{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"newPool\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newSlippageTolerance\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setTwapSlippageToleranceOf\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"newWindow\",\"type\":\"uint32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setTwapWindowOf\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"twapSlippageToleranceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"twapWindowOf\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}]},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"amount0Delta\",\"type\":\"int256\"},{\"internalType\":\"int256\",\"name\":\"amount1Delta\",\"type\":\"int256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"uniswapV3SwapCallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"afterPayRecordedWith((address,uint256,uint256,(address,uint8,uint32,uint256),(address,uint8,uint32,uint256),uint256,uint256,address,bytes,bytes))\":{\"details\":\"This function is only called if the minimum return from the swap exceeds the return from minting by paying the project. If the swap reverts (due to slippage, insufficient liquidity, or something else), then the hook mints the number of tokens which a payment to the project would have minted.\",\"params\":{\"context\":\"The pay context passed in by the terminal.\"}},\"beforePayRecordedWith((address,address,(address,uint8,uint32,uint256),uint256,uint256,address,uint256,uint256,bytes))\":{\"params\":{\"context\":\"Payment context passed to the data hook by `terminalStore.recordPaymentFrom(...)`. `context.metadata` can specify a Uniswap quote and specify how much of the payment should be used to swap. If `context.metadata` does not specify a quote, one will be calculated based on the TWAP. If `context.metadata` does not specify how much of the payment should be used, the hook uses the full amount paid in.\"},\"returns\":{\"hookSpecifications\":\"Specifications containing pay hooks, as well as the amount and metadata to send to them. Fulfilled by the terminal. If tokens are only being minted, `hookSpecifications` will be empty.\",\"weight\":\"The weight to use. If tokens are being minted from the project, this is the original weight. If tokens are being bought from the pool, the weight is 0. If tokens are being minted AND bought from the pool, this weight is adjusted to take both into account.\"}},\"beforeRedeemRecordedWith((address,address,uint256,uint256,uint256,uint256,(address,uint8,uint32,uint256),bool,uint256,bytes))\":{\"details\":\"Pass redeem context back to the terminal without changes.\",\"params\":{\"context\":\"The redeem context passed in by the terminal.\"}},\"constructor\":{\"params\":{\"controller\":\"The controller used to mint and burn tokens.\",\"directory\":\"The directory of terminals and controllers.\",\"factory\":\"The address of the Uniswap v3 factory. Used to calculate pool addresses.\",\"weth\":\"The WETH contract.\"}},\"setPoolFor(uint256,uint24,uint32,uint256,address)\":{\"details\":\"Uses create2 for callback auth and to allow adding pools which haven't been deployed yet. This can be called by the project's owner or an address which has the `JBPermissionIds.SET_BUYBACK_POOL` permission from the owner.\",\"params\":{\"fee\":\"The fee used in the pool being set, as a fixed-point number of basis points with 2 decimals. A 0.01% fee is `100`, a 0.05% fee is `500`, a 0.3% fee is `3000`, and a 1% fee is `10000`.\",\"projectId\":\"The ID of the project to set the pool for.\",\"terminalToken\":\"The address of the terminal token that payments to the project are made in.\",\"twapSlippageTolerance\":\"The maximum spread allowed between the amount received and the TWAP.\",\"twapWindow\":\"The period of time over which the TWAP is computed.\"},\"returns\":{\"newPool\":\"The pool that was set for the project and terminal token.\"}},\"setTwapSlippageToleranceOf(uint256,uint256)\":{\"details\":\"This can be called by the project's owner or an address with `JBPermissionIds.SET_BUYBACK_TWAP` permission from the owner.\",\"params\":{\"newSlippageTolerance\":\"The new TWAP slippage tolerance, out of `TWAP_SLIPPAGE_DENOMINATOR`.\",\"projectId\":\"The ID of the project to set the TWAP slippage tolerance of.\"}},\"setTwapWindowOf(uint256,uint32)\":{\"details\":\"This can be called by the project's owner or an address with `JBPermissionIds.SET_BUYBACK_TWAP` permission from the owner.\",\"params\":{\"newWindow\":\"The new TWAP window.\",\"projectId\":\"The ID of the project to set the TWAP window of.\"}},\"supportsInterface(bytes4)\":{\"details\":\"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.\"},\"twapSlippageToleranceOf(uint256)\":{\"details\":\"The \\\"TWAP slippage tolerance\\\" is the maximum negative spread between the TWAP and the expected return from a swap. If the expected return unfavourably exceeds the TWAP slippage tolerance, the swap will revert.\",\"params\":{\"projectId\":\"The ID of the project which the TWAP slippage tolerance applies to.\"},\"returns\":{\"_0\":\"tolerance The maximum slippage allowed relative to the TWAP, as a percent out of `TWAP_SLIPPAGE_DENOMINATOR`.\"}},\"twapWindowOf(uint256)\":{\"details\":\"The \\\"TWAP window\\\" is the period over which the TWAP is computed.\",\"params\":{\"projectId\":\"The ID of the project which the TWAP window applies to.\"},\"returns\":{\"_0\":\"secondsAgo The TWAP window in seconds.\"}},\"uniswapV3SwapCallback(int256,int256,bytes)\":{\"params\":{\"amount0Delta\":\"The amount of token 0 being used for the swap.\",\"amount1Delta\":\"The amount of token 1 being used for the swap.\",\"data\":\"Data passed in by the swap operation.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"CONTROLLER()\":{\"notice\":\"The controller used to mint and burn tokens.\"},\"DIRECTORY()\":{\"notice\":\"The directory of terminals and controllers.\"},\"MAX_TWAP_SLIPPAGE_TOLERANCE()\":{\"notice\":\"Projects cannot specify a TWAP slippage tolerance larger than this constant (out of `MAX_SLIPPAGE`).\"},\"MAX_TWAP_WINDOW()\":{\"notice\":\"Projects cannot specify a TWAP window longer than this constant.\"},\"MIN_TWAP_SLIPPAGE_TOLERANCE()\":{\"notice\":\"Projects cannot specify a TWAP slippage tolerance smaller than this constant (out of `MAX_SLIPPAGE`).\"},\"MIN_TWAP_WINDOW()\":{\"notice\":\"Projects cannot specify a TWAP window shorter than this constant.\"},\"PERMISSIONS()\":{\"notice\":\"A contract storing permissions.\"},\"PROJECTS()\":{\"notice\":\"The project registry.\"},\"TWAP_SLIPPAGE_DENOMINATOR()\":{\"notice\":\"The denominator used when calculating TWAP slippage percent values.\"},\"UNISWAP_V3_FACTORY()\":{\"notice\":\"The address of the Uniswap v3 factory. Used to calculate pool addresses.\"},\"WETH()\":{\"notice\":\"The wETH contract.\"},\"afterPayRecordedWith((address,uint256,uint256,(address,uint8,uint32,uint256),(address,uint8,uint32,uint256),uint256,uint256,address,bytes,bytes))\":{\"notice\":\"Swap the specified amount of terminal tokens for project tokens, using any leftover terminal tokens to mint from the project.\"},\"beforePayRecordedWith((address,address,(address,uint8,uint32,uint256),uint256,uint256,address,uint256,uint256,bytes))\":{\"notice\":\"The `IJBRulesetDataHook` implementation which determines whether tokens should be minted from the project or bought from the pool.\"},\"beforeRedeemRecordedWith((address,address,uint256,uint256,uint256,uint256,(address,uint8,uint32,uint256),bool,uint256,bytes))\":{\"notice\":\"To fulfill the `IJBRulesetDataHook` interface.\"},\"hasMintPermissionFor(uint256,address)\":{\"notice\":\"Required by the `IJBRulesetDataHook` interfaces. Return false to not leak any permissions.\"},\"poolOf(uint256,address)\":{\"notice\":\"The Uniswap pool where a given project's token and terminal token pair are traded.\"},\"projectTokenOf(uint256)\":{\"notice\":\"The address of each project's token.\"},\"setPoolFor(uint256,uint24,uint32,uint256,address)\":{\"notice\":\"Set the pool to use for a given project and terminal token (the default for the project's token <-> terminal token pair).\"},\"setTwapSlippageToleranceOf(uint256,uint256)\":{\"notice\":\"Set the TWAP slippage tolerance for a project. The TWAP slippage tolerance is the maximum spread allowed between the amount received and the TWAP.\"},\"setTwapWindowOf(uint256,uint32)\":{\"notice\":\"Change the TWAP window for a project. The TWAP window is the period of time over which the TWAP is computed.\"},\"twapSlippageToleranceOf(uint256)\":{\"notice\":\"Get the TWAP slippage tolerance for a given project ID.\"},\"twapWindowOf(uint256)\":{\"notice\":\"Get the TWAP window for a given project ID.\"},\"uniswapV3SwapCallback(int256,int256,bytes)\":{\"notice\":\"The Uniswap v3 pool callback where the token transfer is expected to happen.\"}},\"version\":1}},\"settings\":{\"remappings\":[\"@bananapus/=node_modules/@bananapus/\",\"@chainlink/=node_modules/@chainlink/\",\"@eth-optimism/=node_modules/@eth-optimism/\",\"@exhausted-pigeon/=node_modules/@exhausted-pigeon/\",\"@openzeppelin/=node_modules/@openzeppelin/\",\"@prb/=node_modules/@prb/\",\"@scroll-tech/=node_modules/@scroll-tech/\",\"@sphinx-labs/contracts/=node_modules/@sphinx-labs/contracts/contracts/foundry/\",\"@uniswap/=node_modules/@uniswap/\",\"base64-sol/=node_modules/base64-sol/\",\"ds-test/=lib/forge-std/lib/ds-test/src/\",\"forge-std/=lib/forge-std/src/\",\"hardhat/=node_modules/hardhat/\",\"solmate/=node_modules/solmate/\",\"sphinx/=lib/sphinx/packages/contracts/contracts/forge-std/src/\"],\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"compilationTarget\":{\"src/JBBuybackHook.sol\":\"JBBuybackHook\"},\"evmVersion\":\"paris\",\"libraries\":{}},\"sources\":{\"node_modules/@bananapus/core/src/abstract/JBPermissioned.sol\":{\"keccak256\":\"0x6486c11bff6384bfa938feb7aaacc977f457abff25b17b9aa094077d3fef71f8\",\"urls\":[\"bzz-raw://8b5190202326b6499391d5128cdb2d9ff44e91cd9ba6d8a5fe01e6f21259270d\",\"dweb:/ipfs/QmR2ufPwHtCAZYkJoyWyyag6BfdaWpaLk7VhuDc6BRLqVe\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/enums/JBApprovalStatus.sol\":{\"keccak256\":\"0x61c69b6bac7d24b566d87cda23a77e4ca9cdb87200b106aba8534cb9a0973e33\",\"urls\":[\"bzz-raw://6a9ca7249de76f77a8252eefe6bd1b63d47952f25a2acfa2c8db967cdff4470c\",\"dweb:/ipfs/QmaxSxptRQNj8bNy96EreENmrnRWdKmhyihBcxyWzBX5BN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBController.sol\":{\"keccak256\":\"0xfd338e99bf942083bbf2170a147786585a0f4bcf54815b78cc13ff68cc8d6ded\",\"urls\":[\"bzz-raw://cdcaf5d032173a02e75ba63b334e002347d7a7641f1ea208e6de91f416ac6780\",\"dweb:/ipfs/QmNqHwbBrpvYAGdbhhKvdpKn5nnZMRMUXX4N465Cj4TtAq\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBDirectory.sol\":{\"keccak256\":\"0x9cc380844aef60078ee47a61861e55a29c4a8c947efd556ebd36e6909f7b9d62\",\"urls\":[\"bzz-raw://9f5190ec8b6683d9781ee6e9eedcc91294753242748875d4a06349077e4cbaaf\",\"dweb:/ipfs/QmTQrPuXT9TCA4txwrperMeXSGvGxP8iokUK47f62F388i\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBDirectoryAccessControl.sol\":{\"keccak256\":\"0x1e67f56849320a46f834aaa9bd62b170ff8ada7b224b4a81136193740fa0be4d\",\"urls\":[\"bzz-raw://ea8fbcec44abfe49d137bcae129b67e5479d6b17879301f88534c8a7fab00be4\",\"dweb:/ipfs/QmT6wrtYX4GRpffHUzupNwYebJ1dqkkKZLEewWsoyunsqw\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFeeTerminal.sol\":{\"keccak256\":\"0xdb6f3349cbe2078faa8421dec892136693748d8a60b70a1dee3bce2cfc5274fc\",\"urls\":[\"bzz-raw://ccc6a67fc72726c6180c41523cc2a43562864347770a86ff54532fb6ca09e7c3\",\"dweb:/ipfs/QmZinV1LoRsmTq713YGvNShaPtGaxLqwJ6u2EwwGKEKCgu\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFeelessAddresses.sol\":{\"keccak256\":\"0xe5df42cfa71c5fa41b905c122de5825df13c2aab2f9cc4cf4bafa331dd69c27e\",\"urls\":[\"bzz-raw://3773bf3b42cc57d1e4086147e52135ff1dbff4309c45ca0398f821dfaa071563\",\"dweb:/ipfs/QmXUEJssHaxYKfV33tMZGf81JTR5a5yxEVshzNus84xLuT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFundAccessLimits.sol\":{\"keccak256\":\"0xf5fd6bdd723b60d490ccbe22cdf1cfe43663d23e6ee48badcd1b71e3282cb16b\",\"urls\":[\"bzz-raw://fe692f0b843ea5fccdfcb68f4ec16e1c0add945bb74b303c9866342be0e31fbf\",\"dweb:/ipfs/QmSRmzpgp3DhNEhNDiLsSu7yEiTeywbzEFbwyGyDazjgKt\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBMultiTerminal.sol\":{\"keccak256\":\"0xc7b4f5043ec5733f5b303688f3dbf475ef5f6fe12364847a538c8b48a2137fb7\",\"urls\":[\"bzz-raw://fcd1b41a2acfd035e285e6f20f983b9b00a4e00c688a3072062dfb7f5c9c5afe\",\"dweb:/ipfs/QmYCfjakBGxWWTvb5Pk9UAeguwiWrnsNviQWMsaYz7Xq5N\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPayHook.sol\":{\"keccak256\":\"0x9438866782c652c2942f4d114e35f393cd3c8b0334abce8387eed90bca35e8b2\",\"urls\":[\"bzz-raw://cfd99daf57213f92325aad7d7d16e98476d38e870470e95ba01e3ae3cdecc95d\",\"dweb:/ipfs/QmUKKAVGf7ki8BHksr99tFcRW8APveeB5tNH63ctTbbCW8\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPayoutTerminal.sol\":{\"keccak256\":\"0xd0f9374470591c4afb2525c9c7b1bdad577765857c404b22ee5d8d2997a18fad\",\"urls\":[\"bzz-raw://4529c066b2014ee64b8fb16981a9fd5badf64dea7ac6c07dd1b1e7ab5cdc1d8a\",\"dweb:/ipfs/QmYxTdPjRAZ8iThUoNmJuivEaRaB3xXpyHdhCU7my1UHZy\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermissioned.sol\":{\"keccak256\":\"0x5b038d4dee116584e88b230920e56d48e135053e3f7e5642eaea14a775c1dad7\",\"urls\":[\"bzz-raw://19e43102f349fd4a1da1c0943ffb8f2950007fe4bb4bb7e8f74fc142575d091b\",\"dweb:/ipfs/QmXHAt4KzDTdDZgDDefEXH2WKi7NcfkJb9R7nxW5uDqsNp\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermissions.sol\":{\"keccak256\":\"0x49d2b91a866004af098a6770b28040071885b048b4b50744b12a1e5b212c5e5e\",\"urls\":[\"bzz-raw://089b4dda50be91412ffe1fbe333f78cc894f073c1a7afe469f10a2cee12fbf9e\",\"dweb:/ipfs/QmYPPBZ6HwBa1RNkNGqGcR2xgj4fnWBzrPHHoJG3kZA6AN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermitTerminal.sol\":{\"keccak256\":\"0xd6bd30842273f5b794f82219fefdd4953f5343328d2cfdb684b7d826cc0c769c\",\"urls\":[\"bzz-raw://ca1195fd5572060b36fc7e45f46d59f974e3a908248edcfadeb8cb06247075f0\",\"dweb:/ipfs/QmYTpDXKTXqi8GQFsNqB8LiGFTZjSPY3PA8vKqZBraVdqD\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPriceFeed.sol\":{\"keccak256\":\"0x4bd84c0f1a5d4729ed709bcddd43f4c50ec4a165ece79780af8dce482ed07d4a\",\"urls\":[\"bzz-raw://62bac4bfb6982fb002f620c77e5c445e62d50241a5aa64a07e51d929f5a42180\",\"dweb:/ipfs/QmWgJUDreVY2BuMX38a1iUUR5kNbMwGnKG3VvurB7oZtuM\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPrices.sol\":{\"keccak256\":\"0xa4988a8984774e9f9d355236e3c4ab67868503964747684d989ceb54a4176361\",\"urls\":[\"bzz-raw://7496393b49f8a594e6bc3393ffab118e4dc95f69233c77046cd552b1c52a533a\",\"dweb:/ipfs/QmavDESpty7XFmLgWKMHb3venZVPGwwKevWmYStM2mxcPH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBProjectUriRegistry.sol\":{\"keccak256\":\"0x2799475228987e4f8334ac33d3935f759c9b8133db7383b4f622dde7a5dc0502\",\"urls\":[\"bzz-raw://d751731740f45df74eea48c9667e847ee2cddb2980ab4939c86bd17e6c6ed89b\",\"dweb:/ipfs/QmXW8SLTuhdUpfn7pRpdsYdcyuim8RTyagU37ULcj5UZhT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBProjects.sol\":{\"keccak256\":\"0x735c2fb8f1fa827f054ee77f7a0ae4b312656217acb75b624d2c8fd9dc40151b\",\"urls\":[\"bzz-raw://ee7fc92299a8633a80693ae63ab494dcd125f1789487a54a39dc0e5696e5996f\",\"dweb:/ipfs/QmX7YJD4pS2XhgQb7p3JbBAXynT7YGPXcZe92BiWWRrsCL\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRedeemHook.sol\":{\"keccak256\":\"0x8ab46fcd7d0e739661eb76056ad93ff99106f38420ef0b4eb97fa9f4bb71a68a\",\"urls\":[\"bzz-raw://0ef96fcb7ad26281d444d8e0c677b25114fdd63b1c172d477e030dce8ba53b62\",\"dweb:/ipfs/Qmcx1jRQuwU4pZFuLxsSsx4oMbRaDfktHrPnXextgbWc5m\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRedeemTerminal.sol\":{\"keccak256\":\"0xd1b4aa38154e08f1474745ea6bc8f8823fe8aa68c124d596742597f2296ea16d\",\"urls\":[\"bzz-raw://9bd254e833702dfe5e28db5fee76478947ab45b501c966501f719e73bbf0397a\",\"dweb:/ipfs/QmZ3Ng7TmVxL6ozSUhx4kYdQdZhoYi4t43cYZVAMz7Fn5M\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesetApprovalHook.sol\":{\"keccak256\":\"0x592e95d159494421c6b1bcb362d0cee1df0132921697351304e9cd7af4fbd386\",\"urls\":[\"bzz-raw://5bebfd5fa67c1b6ea16fa2e76e9520e9dfe52a579f48dd94d0c2ec45f78ad178\",\"dweb:/ipfs/QmRUawEGtfYoYSHmHELGhvJoWuMsxLPKtqAXgsrb7fJboP\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesetDataHook.sol\":{\"keccak256\":\"0x13b4b9f4b847f62442da1c1a59b399f8f201b31a28edb96aa5a8a78ad57c24d0\",\"urls\":[\"bzz-raw://4fcd00b77d0f40cf6d5ee6590b6ef4ee1f606e89ae4c4faed3710fb462108f8e\",\"dweb:/ipfs/QmeoE54DQ3eGw9EDXfN7aTMmEjubAtirahmytDijo6GSeE\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesets.sol\":{\"keccak256\":\"0x552a9bc990fa47026c89defa6dd112675ee4ef13a9e38f72577e3c0c222f2a8f\",\"urls\":[\"bzz-raw://4fc8638720bac7feb191b8b4ffb4fa08c56a951924fc058561663633973235e2\",\"dweb:/ipfs/QmawYWj5syRvZ2miLQ8WT42AXsuTCH5Fm9Gmq1Rege2mKF\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBSplitHook.sol\":{\"keccak256\":\"0xeb8dfac7a4b81897a1c3b5d0d853a406bcff33720fb187d5ca5bb3dcc0ba3a12\",\"urls\":[\"bzz-raw://36aaeef6107cfe5b0127e063ea215aac7200f8af02e28a48e61111abd3254688\",\"dweb:/ipfs/QmQ8yQANXnhQCAWBGKsKCDsJ3A8hnTKNg5tyo79GfWXTcV\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBSplits.sol\":{\"keccak256\":\"0xd8894cfc55560d914f413e40c981165e1e9dc845b35cdf0ecd13fd118733a483\",\"urls\":[\"bzz-raw://e03b8e5e34c924a91884e3ef79ea039292f8927241698db84a09a463ced4cc52\",\"dweb:/ipfs/QmSqhVX2LSStR7xEcc96zAiQpTPDSsZBn8YvH33CtiU1FN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTerminal.sol\":{\"keccak256\":\"0x8981b96902125707c49c63867b718118fdfb04cb8fd42b038d93ef87ea56f85c\",\"urls\":[\"bzz-raw://7b172c6924a10431652eab136758953a51af8d709a55afff1533d13e687be60c\",\"dweb:/ipfs/QmWczAk48Jw8qNgrUn4EFRK25CrmCp7MmEaJsGtTXueaEb\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTerminalStore.sol\":{\"keccak256\":\"0x140159d66d729f6aeed0fe1f7c655619985146ec00e8c68cbd9b5d30d4dc7d23\",\"urls\":[\"bzz-raw://f972ecb52bcfcd2852c9e7264b1ecc504ce94bd6e12c034b93c1768cd372954e\",\"dweb:/ipfs/QmRu7in5iJSWHLTcFPbJmiK1rCHFbwNY7qzY4cG6kgfYcr\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBToken.sol\":{\"keccak256\":\"0x71b1f9c3a0edd41910f77396e0be2c65596571176d53eb87e887c3c0da56c0fb\",\"urls\":[\"bzz-raw://6e956f0582f4525e83d845ee9b4a89959abc4f821414f6accbbee5b38960482d\",\"dweb:/ipfs/QmbSvjgmCgnfVmcCTGu8XwrV1Rufsf3M8hB8unFq6fTMdH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTokenUriResolver.sol\":{\"keccak256\":\"0xfa5cb00dcd6085d1ef912d071fe73c63f9478a2cd0f9d8bddaf659b6af2d0967\",\"urls\":[\"bzz-raw://282e4e7c342d65f77cde0e9a08fcaf20ef5cf379c7a48b639842c0ffd0b2afb8\",\"dweb:/ipfs/QmbnN3PEQeZaXdPLT75V1J79kMg7KqSMru37RHrL3z8Yf2\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTokens.sol\":{\"keccak256\":\"0x6fd67af915dd541d9547c8297aa9ae269690e4ee23531db43f021bcacec6076f\",\"urls\":[\"bzz-raw://2e5e11954e9ab2319fffccb6563f3db400b8f7760d4ffe2165048a02c9c37fa6\",\"dweb:/ipfs/QmbDXtV83dK8EfiTjsTRf55R2XqPZzDKcjtYbW8sxQ5CFm\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/libraries/JBConstants.sol\":{\"keccak256\":\"0x822bef715c9d5803208a2e02f8d14e0ffdb1fb2ea84698c30fd801103be4a3d2\",\"urls\":[\"bzz-raw://476c87d74e31cd43419cce01551158993c311ac47ba5fad5768e26054b3c8a91\",\"dweb:/ipfs/QmdpxoGU6suZAm9FS7R47AwSmHEFjwmf6v56WrfZM4QkJc\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/libraries/JBMetadataResolver.sol\":{\"keccak256\":\"0xdf32038c5e7f65725e2ef87d09fe04972d7da6a63b60c066d4616b2c2ada5149\",\"urls\":[\"bzz-raw://50582c41ee196ead31d13dcc5a468436d524891d7873743ba92d1d64a0b5783a\",\"dweb:/ipfs/QmPiJMbA1oQnVKQTjqYvUvtWaaiFCeKic8NJtu2crrAznW\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAccountingContext.sol\":{\"keccak256\":\"0x9c47e048a719f784f601df69a583505432217b9868a0244876d277f84dd1ebdf\",\"urls\":[\"bzz-raw://8565f194b87914da9a02af2e760ae2ed2a9d185c6f11229f7035140776d2fec9\",\"dweb:/ipfs/QmPs2fic8W3F5e5zNRwmGmJFjb3JWGPWJ3YUe5o82nQgEn\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAfterPayRecordedContext.sol\":{\"keccak256\":\"0xd26c3a774ff38be79064085970454fe2603a23a638c76270d5b1b3829206c3e8\",\"urls\":[\"bzz-raw://3b55dbe3bf1ef625b7ca04efab3de35406e6041d5b3d82c7265469c500e2b702\",\"dweb:/ipfs/QmUdBDo4Lt3mcsFcsXT2mqq3czFwZjQJFPLM89YA2VtD7k\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAfterRedeemRecordedContext.sol\":{\"keccak256\":\"0x521f5d23a36f0da72362cd84890cc867bd83baa8dc836ba6c5066d51dba2f163\",\"urls\":[\"bzz-raw://6cc461313286dde62d045d6288e87bae5032e035796326f5b1ed6218e58aa9da\",\"dweb:/ipfs/QmQS2AkQwf2ANQieDuaUnpJEdXChoLv4CCbZqHkfywYPSR\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBBeforePayRecordedContext.sol\":{\"keccak256\":\"0xbc98b968d84be2f0ddbb24240723c7179ec9c5e02e5fbd5843dd0e76623a3ea5\",\"urls\":[\"bzz-raw://1310e522696a9fc6f7f96b04c293fab3b4cf1e722bdbb7aa1eec7b3ecc25402f\",\"dweb:/ipfs/QmTYiijDJRuQcMhLrmpbHzHAQFPq6jurPP5HjyYtnzbpnK\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBBeforeRedeemRecordedContext.sol\":{\"keccak256\":\"0x73eadaf6827e82f6ccbe3a1e2b2b7fc6c59cef471f73335041b30ddcc000989d\",\"urls\":[\"bzz-raw://2f3ee84662eed565dbdaed406ef836fffaf55cccd417575578152e5085d0b1f2\",\"dweb:/ipfs/QmaJGFS7hxJsiUdKvbv5BKhSwceDEzKBnt7t5YeNWvYgMK\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBCurrencyAmount.sol\":{\"keccak256\":\"0x7f321bbcbd13abfbc8f0d08a5adaaf8ef312db5bb899012fcffb6170fbb962a9\",\"urls\":[\"bzz-raw://bf9301ef1dbb3abda7b492585377617508ba048c6170f21a5e7d2b3c034eb384\",\"dweb:/ipfs/QmcetEFxSYLLNSZzPBpNn3Fc8sFcrFE8A8h12ZSj2tLgxD\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBFee.sol\":{\"keccak256\":\"0xffacd6dcce11a5cdd54aba7a5d8f9b28b9b36b87771dea746a117b616519bbd0\",\"urls\":[\"bzz-raw://c278d6efa1dd694c8aceba43b2cb3f2b49a52d9b15fc23089def526e4ba23778\",\"dweb:/ipfs/QmVHEGGAfsUVE791aGeYZBiymU6aJ278PoGmH9SRLY1U4N\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBFundAccessLimitGroup.sol\":{\"keccak256\":\"0x9fdaa8d017b72da25f583700a444a86849df053f7fb8eac874ec5139bcf651e5\",\"urls\":[\"bzz-raw://c8e44c49ee444a98424a0dbeb6897a76a0bf00d88a613f62ac2012afdac754ee\",\"dweb:/ipfs/QmdYkAiRi5bXM1YYNkc7BiqimHSFodMGn1cjHR5hcpm4xH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBPayHookSpecification.sol\":{\"keccak256\":\"0x955f0bfca97300b9e5927dc181753830ee362f83fa9ca32a90daade32aa0cfd5\",\"urls\":[\"bzz-raw://f517af1597c7c40f8d3da53f7a6684a3e162950a16559d6bf6ea3b727bb11546\",\"dweb:/ipfs/QmRWo2ZTYXmVZTzNJDYhsJNsEaHphjpUfx9eNz2cciyz86\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBPermissionsData.sol\":{\"keccak256\":\"0xd5a5fe65b1deb40b5cd9c8e05bc1352d0e95f3a18b4986fab7abdc621beb19c7\",\"urls\":[\"bzz-raw://a6141eaa414d3d61de671ae3584b87e98044bf6392cb94d2acd1bb5cc7c19db4\",\"dweb:/ipfs/QmbtvALmburKLRC5fHXscoeZii1N2qQrJAdqarfvSKaKEk\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRedeemHookSpecification.sol\":{\"keccak256\":\"0x673d16ee1a91bf8de3b37e57284e60451b70a9c2d748c9cdc7a151f5624af18f\",\"urls\":[\"bzz-raw://ceeb5e81effa0f076c5630c756dfcf1548d09f822b255a0a6ee01e54de8c8ae2\",\"dweb:/ipfs/QmSMoMNPRhPMnuJNvWa6S59XRfycGz9o2ApNp63bUW6TdX\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRuleset.sol\":{\"keccak256\":\"0x03ad7bd257d4ac55ecc42b85156dce1c70eec8572dbf8feb093c033912f305e7\",\"urls\":[\"bzz-raw://9665b4c018cd469f94bec4471222cc9e5fd58ac421a0959f70e72618fe37d55b\",\"dweb:/ipfs/QmSUf6HQv2Ckcoy5tSH1UPdD8vDMerfK29G8kaxmxB3Kow\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetConfig.sol\":{\"keccak256\":\"0x7a57ed3d73bd9457d8e1fb40f5204c364df87cbfdbf42412d5bbc08beabb49c9\",\"urls\":[\"bzz-raw://8b9a83916ee67d32b5f434b35b171c6122bbc4efeaa4fabb8dec2ca4e9e32c6e\",\"dweb:/ipfs/QmNquzUQn6ZvE2wBcMCgru3resV9UNvBWPPetyDChoh8vM\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetMetadata.sol\":{\"keccak256\":\"0xfb3601c74af59891c7a22eb33110170bbd57e3958130961704ea20cede4202cc\",\"urls\":[\"bzz-raw://fbebf88cdf5fe93aa6eae665e5a5ea277dd3d5b703afbc732fb20e3d3a1d3f0a\",\"dweb:/ipfs/QmWMBjpmNVUePZZaBPKLUP7zX1f49re55ruhLCeFx1zx9A\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetWithMetadata.sol\":{\"keccak256\":\"0x1bcfadf20488f6df65227f8d4d0fbf9b7539456a2389567f7fe3900d23289bc3\",\"urls\":[\"bzz-raw://0a15c399a71e5373f8c0484c6d6b83521eda31e063a2c53e4c5cec4e74550343\",\"dweb:/ipfs/QmQwi8zkjoTVXbK89NeETYimWCacTrNsesJdpLSvGdqMPX\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplit.sol\":{\"keccak256\":\"0x0e1351e80cf9967caee90094712a4fc884a83f07df23a844d8cb33ebcd00721e\",\"urls\":[\"bzz-raw://19d5793c08834f2ec1d6942bd43d05042b0ecc351a57235d748a8f2ff74b6638\",\"dweb:/ipfs/QmUWjyNg7x62KsvMwAzNdpmwqCo5qK5ip9pLdshj9B2Kbf\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplitGroup.sol\":{\"keccak256\":\"0x8dc98fa9e730bee8bcc0a8acf1bc4db1c9b0edf307d969c9c9caa4d6b8d856d9\",\"urls\":[\"bzz-raw://66f4306e0e69c82033927952564fd617e7c4b29aa8b165d5b53a0ebe3109ea12\",\"dweb:/ipfs/QmQqN1u7FHAdEtEZNRcKvZwYtXEQVQnLd6FMzHESP7wDtx\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplitHookContext.sol\":{\"keccak256\":\"0x1cef82bf434f91d518092ea7e57db4a72ce7654f48a7db9bf44882900b6b6623\",\"urls\":[\"bzz-raw://cc5012008ab7e74cf766fe1c202a23e3a73365356bcf1e0b04ec01baf21b204b\",\"dweb:/ipfs/QmSwJvd6Yrg9XZMhjquBcak5sfUswbR5nPEuJBfpjM54VT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBTerminalConfig.sol\":{\"keccak256\":\"0x2da40b8ae2b6a6038da0ac17d3ccf083a8fb54ea12684242342e53811cca997c\",\"urls\":[\"bzz-raw://9ddb66e9f90ce3005bb1fedd06ec66e6d3e99c52afaf729cee0a23ae01b21fab\",\"dweb:/ipfs/QmPTD9ciAZqj5WWuE5W4Ufs1kBvVokntrfSdUcV6Egh7eQ\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBTokenAmount.sol\":{\"keccak256\":\"0xc61593d33d5ec30e695d382948a1b944d01e29a8f2bfd29f75ecebcdbc7816de\",\"urls\":[\"bzz-raw://8992c1e5fca0c2342ecc0e734dfba6a2a752e4c29184784931d0971e44305051\",\"dweb:/ipfs/QmYNcaW3qeCkgAExUaFTq238fgfJuoYCTwjCn7jm94U4dJ\"],\"license\":\"MIT\"},\"node_modules/@bananapus/permission-ids/src/JBPermissionIds.sol\":{\"keccak256\":\"0x1bd511f9cc46d134ab4743dba50ee25b1c67b5b5e30a27cbfebb1c3fcfedc876\",\"urls\":[\"bzz-raw://6d81d52f481c89832c9c61fa4ea513196c6c8182878d1fbef2038ca39a909192\",\"dweb:/ipfs/QmbaRR5ZXF9PRJwEGbwoAydQiYUoQLYiej7CVmHHbFG29z\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0xce41876e78d1badc0512229b4d14e4daf83bc1003d7f83978d18e0e56f965b9c\",\"urls\":[\"bzz-raw://a2608291cb038b388d80b79a06b6118a42f7894ff67b7da10ec0dbbf5b2973ba\",\"dweb:/ipfs/QmWohqcBLbcxmA4eGPhZDXe5RYMMEEpFq22nfkaUMvTfw1\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"urls\":[\"bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c\",\"dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"],\"license\":\"MIT\"},\"node_modules/@prb/math/src/Common.sol\":{\"keccak256\":\"0xaa374e2c26cc93e8c22a6953804ee05f811597ef5fa82f76824378b22944778b\",\"urls\":[\"bzz-raw://279c732e161d623cf4d8a9519ca4c42c0c2db99842d0eb2a20c10fde3fa722c9\",\"dweb:/ipfs/QmVViuUXbinQGqtG5M21SgVzKihiCbFUChd4tDhtvwRmxH\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IAllowanceTransfer.sol\":{\"keccak256\":\"0x37f0ac203b6ef605c9533e1a739477e8e9dcea90710b40e645a367f8a21ace29\",\"urls\":[\"bzz-raw://e0104d72aeaec1cd66cc232e7de7b7ead08608efcc179491b8a66387614670b0\",\"dweb:/ipfs/QmfAZDyuNC9FXXbnJUwqHNwmAK6uRrXxtWEytLsxjskPsN\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IEIP712.sol\":{\"keccak256\":\"0xfdccf2b9639070803cd0e4198427fb0df3cc452ca59bd3b8a0d957a9a4254138\",\"urls\":[\"bzz-raw://f7c936ac42ce89e827db905a1544397f8bdf46db34cdb6aa1b90dea42fdb4c72\",\"dweb:/ipfs/QmVgurxo1N31qZqkPBirw9Z7S9tLYmv6jSwQp8R8ur2cBk\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IPermit2.sol\":{\"keccak256\":\"0xaa631cc9f53e699301d94233007110a345e6779011def484e8dd97b8fe0af771\",\"urls\":[\"bzz-raw://fc0502cf19c9c18f320a3001201e89e350393b75837f6b7971de18b2de06f30d\",\"dweb:/ipfs/QmT9SfhdJ7VJNNrf94g4H5usyi7ShqWGx7Cqsz9jZTjX96\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/ISignatureTransfer.sol\":{\"keccak256\":\"0xe6df9966f8841dc3958ee86169c89de97e7f614c81c28b9dc947b12d732df64e\",\"urls\":[\"bzz-raw://3d4eafdee7f48c3be8350a94eb6edd0bfb2af2c105df65787a77174f356c0317\",\"dweb:/ipfs/QmY1j2adeeAhNpn6cUuthemxGCdLXHTfyMh9yTKsY4mZ2d\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol\":{\"keccak256\":\"0x4e64844c56061cd90e0a80de73534a9166704c43eed579eb83f90bc2780ce968\",\"urls\":[\"bzz-raw://cba4fab5cebdddf644b901994a7f0f52b98885d4c56012f4dc51d52c2bf9de0e\",\"dweb:/ipfs/QmVyyrRmqXrAiapewWunRVgiPVFJHpH2hKiE1py1svMSNV\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol\":{\"keccak256\":\"0x3f485fb1a44e8fbeadefb5da07d66edab3cfe809f0ac4074b1e54e3eb3c4cf69\",\"urls\":[\"bzz-raw://095ce0626b41318c772b3ebf19d548282607f6a8f3d6c41c13edfbd5370c8652\",\"dweb:/ipfs/QmVDZfJJ89UUCE1hMyzqpkZAtQ8jUsBgZNE5AMRG7RzRFS\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions.sol\":{\"keccak256\":\"0x9453dd0e7442188667d01d9b65de3f1e14e9511ff3e303179a15f6fc267f7634\",\"urls\":[\"bzz-raw://982f4328f956c3e60e67501e759eb292ac487f76460c774c50e9ae4fcc92aae5\",\"dweb:/ipfs/QmRnzEDsaqtd9PJEVcgQi7p5aV5pMSvRUoGZJAdwFUJxgZ\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState.sol\":{\"keccak256\":\"0xe603ac5b17ecdee73ba2b27efdf386c257a19c14206e87eee77e2017b742d9e5\",\"urls\":[\"bzz-raw://8febc9bdb399a4d94bb89f5377732652e2400e4a8dee808201ade6848f9004e7\",\"dweb:/ipfs/QmaKDqYYFU4d2W2iN77aDHptfbFmYZRrMYXHeGpJmM8C1c\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolErrors.sol\":{\"keccak256\":\"0xf80abf13fb1fafc127ba4e792f240dd8ea7c8c893978cdfd8439c27fae9a037b\",\"urls\":[\"bzz-raw://b04fc72a656bbf3631e9c2e67b9870a2d9d235185e833fe050e9606e6816a9aa\",\"dweb:/ipfs/QmUcz4bkEkJ9pwzFu1C3n97hBQ3st9U6qTAqCdyFwddKco\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents.sol\":{\"keccak256\":\"0x8071514d0fe5d17d6fbd31c191cdfb703031c24e0ece3621d88ab10e871375cd\",\"urls\":[\"bzz-raw://d0b571930cc7488b1d546a7e9cea7c52d8b3c4e207da657ed0e0db7343b8cd03\",\"dweb:/ipfs/QmaGK6vVwB95QSTR1XMYvrh7ivYAYZxi3fD7v6VMA4jZ39\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables.sol\":{\"keccak256\":\"0xf6e5d2cd1139c4c276bdbc8e1d2b256e456c866a91f1b868da265c6d2685c3f7\",\"urls\":[\"bzz-raw://b99c8c9ae8e27ee6559e5866bea82cbc9ffc8247f8d15b7422a4deb287d4d047\",\"dweb:/ipfs/QmfL8gaqt3ffAnm6nVj5ksuNpLygXuL3xq5VBqrkwC2JJ3\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions.sol\":{\"keccak256\":\"0x759b78a2918af9e99e246dc3af084f654e48ef32bb4e4cb8a966aa3dcaece235\",\"urls\":[\"bzz-raw://64144fb96e1c7fdba87305acadb98a198d26a3d46c097cb3a666e567f6f29735\",\"dweb:/ipfs/QmUnWVwN9FKB9uV5Pr8YfLpWZnYM2DENnRMaadZ492JS9u\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.sol\":{\"keccak256\":\"0x44fa2ce1182f6c2f6bead3d1737804bf7e112252ae86e0f2e92f9b8249603f43\",\"urls\":[\"bzz-raw://54154e8665b98d65f5dc91b256551852cb47882180b501b260657122d207c0ea\",\"dweb:/ipfs/QmcfemK1A2PXYrWB5SBFGERpMCderbFRb8BtTzQDj1sUBp\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/libraries/FullMath.sol\":{\"keccak256\":\"0x7825565a4bb2a34a1dc96bbfead755785dfb0df8ef81bd934c43023689685645\",\"urls\":[\"bzz-raw://8f44f4614d31e3d4864c7eb13620555253b84f6a69180f8745b7c6e246a9d125\",\"dweb:/ipfs/QmfNQUcXj3KL8h9u5PqbtEC6yRtwDbKNb48uMPjdwxsKnd\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v3-core/contracts/libraries/TickMath.sol\":{\"keccak256\":\"0x5c57de03a91cc2ec8939865dbbcb0197bb6c353b711075eefd8e0fca5e102129\",\"urls\":[\"bzz-raw://1e994c24fd891ef8a3f5dbf5eba42b34feaf05e0376a29f91322faa18054449c\",\"dweb:/ipfs/QmNdUJGUQxd1dPkMbnA5f5UNqakxRkQE5r7bTZJAuHeapS\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-periphery/contracts/libraries/OracleLibrary.sol\":{\"keccak256\":\"0xe313f89c69c0f1c91f0722868313b4ceb14479b3e7a0abf52a1b9bbd9c18e81b\",\"urls\":[\"bzz-raw://8ad09b061f3f533c116618c20cf01510108eebebb7ff8847b0f245b8ba368d53\",\"dweb:/ipfs/QmU6vdi5JjJfjK2KqonWvRg9NeuQWarj4B1YFN22Dh9VJM\"],\"license\":\"GPL-2.0-or-later\"},\"src/JBBuybackHook.sol\":{\"keccak256\":\"0x6ce52f5d43175b4b3c1b3ce4490aefbbf97f6bb047d01f9196e27fe934339231\",\"urls\":[\"bzz-raw://fb974d5ca3ca338841891368af57f612a1aa92c8ae600a3e25113603dc4d139d\",\"dweb:/ipfs/QmNWg3epg1Rqk8Tj5uRMxsLJEXcLdfe9wQ5u4nFH7qSSjz\"],\"license\":\"MIT\"},\"src/interfaces/IJBBuybackHook.sol\":{\"keccak256\":\"0xbe5d7f3bf2e18b569676ba9194e248e6b1ed50022f5247b4f1fa124c91bfd418\",\"urls\":[\"bzz-raw://eb221d1570e8aad409c419b6a2f84351e818c3527f3f44b806cd64c84d7a8c86\",\"dweb:/ipfs/QmUPZstaKjPN7VTywg3Mt6bF75E53mQbmXhf3TxCggJbRR\"],\"license\":\"MIT\"},\"src/interfaces/external/IWETH9.sol\":{\"keccak256\":\"0x50083bcaca6c1a8d12c79116fab4f6d8cd452a510cb3f00c4a8bc3a54678efb7\",\"urls\":[\"bzz-raw://726f187112d0953c14bff8099a8c9ce1ead47eb25e90839f77b100feaaf16127\",\"dweb:/ipfs/QmTEnMENpLjcTQLMwz4kEUiQHfiTkaZT3TL37nQ8JiRYh5\"],\"license\":\"GPL-2.0-or-later\"}},\"version\":1}", "args": [ "0x4200000000000000000000000000000000000006", "0x4752ba5DBc23f44D87826276BF6Fd6b1C372aD24", - "0x877e8e31eD1Bf9F628EfA25636c5bC9Dd83BAA77", - "0x64c30002444321C4504c8f1b9B04C95DE3731Fd2" + "0x992f9e3a81c77Cb940A29311558343E1AC66c40F", + "0x1e4c8DFfE8D72aeB63e8dDbE9eF89bc368cbbE99" ], - "bytecode": "0x6101406040523480156200001257600080fd5b5060405162003e4938038062003e49833981016040819052620000359162000156565b806001600160a01b031663f434c9146040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009a9190620001be565b6001600160a01b039081166080528481166101205282811660c05281811660e081905290841660a0526040805163293c499960e01b8152905163293c4999916004808201926020929091908290030181865afa158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001259190620001be565b6001600160a01b03166101005250620001e592505050565b6001600160a01b03811681146200015357600080fd5b50565b600080600080608085870312156200016d57600080fd5b84516200017a816200013d565b60208601519094506200018d816200013d565b6040860151909350620001a0816200013d565b6060860151909250620001b3816200013d565b939692955090935050565b600060208284031215620001d157600080fd5b8151620001de816200013d565b9392505050565b60805160a05160c05160e0516101005161012051613bb262000297600039600081816104660152818161133801528181611857015281816119cf01528181611aae0152611d550152600081816102970152818161072c01528181610f49015261109001526000818161051e01528181610e14015281816111a20152611f390152600081816103d401526108df01526000818161058601526113780152600081816105520152611c5b0152613bb26000f3fe60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561054c57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000000000000000000000000000000000000000000092505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000000000000000000000000000000000000000000000816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f00000000000000000000000000000000000000000000000000000000000000005b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f00000000000000000000000000000000000000000000000000000000000000005b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f0000000000000000000000000000000000000000000000000000000000000000169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f00000000000000000000000000000000000000000000000000000000000000005b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220f82d6708b7e9d1d8e4803189749615db1f512283aff91b9bb51a552854f72e7c64736f6c63430008170033", - "deployedBytecode": "0x60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000f8ea7ba8d990646420123feaa2447b534ab2f53c81565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000877e8e31ed1bf9f628efa25636c5bc9dd83baa7781565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000420000000000000000000000000000000000000681565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f00000000000000000000000064c30002444321c4504c8f1b9b04c95de3731fd281565b34801561054c57600080fd5b506102607f000000000000000000000000cfba13b8dcb2bb4f84c5d2704882009a539bee9a81565b34801561058057600080fd5b506102607f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad2481565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000f8ea7ba8d990646420123feaa2447b534ab2f53c73ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000877e8e31ed1bf9f628efa25636c5bc9dd83baa7773ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000064c30002444321c4504c8f1b9b04c95de3731fd21663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000f8ea7ba8d990646420123feaa2447b534ab2f53c73ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000f8ea7ba8d990646420123feaa2447b534ab2f53c1690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f00000000000000000000000064c30002444321c4504c8f1b9b04c95de3731fd273ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000420000000000000000000000000000000000000692505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f00000000000000000000000042000000000000000000000000000000000000065b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f00000000000000000000000042000000000000000000000000000000000000065b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000420000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f000000000000000000000000cfba13b8dcb2bb4f84c5d2704882009a539bee9a169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f00000000000000000000000042000000000000000000000000000000000000065b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f00000000000000000000000064c30002444321c4504c8f1b9b04c95de3731fd273ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220f82d6708b7e9d1d8e4803189749615db1f512283aff91b9bb51a552854f72e7c64736f6c63430008170033", + "bytecode": "0x6101406040523480156200001257600080fd5b5060405162003e4938038062003e49833981016040819052620000359162000156565b806001600160a01b031663f434c9146040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009a9190620001be565b6001600160a01b039081166080528481166101205282811660c05281811660e081905290841660a0526040805163293c499960e01b8152905163293c4999916004808201926020929091908290030181865afa158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001259190620001be565b6001600160a01b03166101005250620001e592505050565b6001600160a01b03811681146200015357600080fd5b50565b600080600080608085870312156200016d57600080fd5b84516200017a816200013d565b60208601519094506200018d816200013d565b6040860151909350620001a0816200013d565b6060860151909250620001b3816200013d565b939692955090935050565b600060208284031215620001d157600080fd5b8151620001de816200013d565b9392505050565b60805160a05160c05160e0516101005161012051613bb262000297600039600081816104660152818161133801528181611857015281816119cf01528181611aae0152611d550152600081816102970152818161072c01528181610f49015261109001526000818161051e01528181610e14015281816111a20152611f390152600081816103d401526108df01526000818161058601526113780152600081816105520152611c5b0152613bb26000f3fe60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561054c57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000000000000000000000000000000000000000000092505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000000000000000000000000000000000000000000000816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f00000000000000000000000000000000000000000000000000000000000000005b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f00000000000000000000000000000000000000000000000000000000000000005b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f0000000000000000000000000000000000000000000000000000000000000000169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f00000000000000000000000000000000000000000000000000000000000000005b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220673ba775a9e9027f7796ba830c6cc31583ba0bdffbfd7ffbf013c44b6ee8d08b64736f6c63430008170033", + "deployedBytecode": "0x60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000e802b15a90a8aed41797cf535c6aee697f18e0b181565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000992f9e3a81c77cb940a29311558343e1ac66c40f81565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000420000000000000000000000000000000000000681565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe9981565b34801561054c57600080fd5b506102607f0000000000000000000000009ca9bc9d5e7e20fc2f1d750807fa30c86b7989f881565b34801561058057600080fd5b506102607f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad2481565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000e802b15a90a8aed41797cf535c6aee697f18e0b173ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000992f9e3a81c77cb940a29311558343e1ac66c40f73ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe991663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000e802b15a90a8aed41797cf535c6aee697f18e0b173ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000e802b15a90a8aed41797cf535c6aee697f18e0b11690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe9973ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000420000000000000000000000000000000000000692505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f00000000000000000000000042000000000000000000000000000000000000065b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f00000000000000000000000042000000000000000000000000000000000000065b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000420000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f0000000000000000000000009ca9bc9d5e7e20fc2f1d750807fa30c86b7989f8169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f00000000000000000000000042000000000000000000000000000000000000065b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe9973ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220673ba775a9e9027f7796ba830c6cc31583ba0bdffbfd7ffbf013c44b6ee8d08b64736f6c63430008170033", "devdoc": { "kind": "dev", "methods": { @@ -1212,7 +1212,7 @@ }, "version": 1 }, - "gitCommit": "74088a01fb7bb1c33e8e306744b5ecf4edb1b5a2", + "gitCommit": "9caaedd7d4d116463c4ceecb3147a8863f806dab", "sourceName": "src/JBBuybackHook.sol", "chainId": "11155420", "linkReferences": {}, diff --git a/deployments/nana-buyback-hook-testnet/optimism_sepolia/execution/97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1.json b/deployments/nana-buyback-hook-testnet/optimism_sepolia/execution/97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1.json new file mode 100644 index 0000000..e81ab35 --- /dev/null +++ b/deployments/nana-buyback-hook-testnet/optimism_sepolia/execution/97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1.json @@ -0,0 +1,221 @@ +{ + "_format": "sphinx-sol-execution-artifact-1", + "transactions": [ + { + "receipt": { + "blockHash": "0x507f63a0e3de6936d5d8f8ab345b647aa6f9e6a67bb5146175f7549d92c81da8", + "blockNumber": 14893503, + "contractAddress": null, + "cumulativeGasUsed": "1461399", + "from": "0x0c1c9049564269275059032Fb484Aa2e7Ab779af", + "gasPrice": "1000307", + "gasUsed": "176673", + "hash": "0x390bfbfe0aea656a0c6d6259347c38defbbc7ba8e5496688be9b6360c921745a", + "index": 4, + "logs": [ + { + "address": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", + "blockHash": "0x507f63a0e3de6936d5d8f8ab345b647aa6f9e6a67bb5146175f7549d92c81da8", + "blockNumber": 14893503, + "data": "0x0000000000000000000000000000000000000000000000000000000000000000", + "index": 25, + "topics": [ + "0x572f161235911da04685a68c06adf558fc7e4a36909dca394650e0adc19cc93d", + "0x0000000000000000000000000c1c9049564269275059032fb484aa2e7ab779af", + "0x000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4", + "0x58fbd9fe6aeea9d935b258da63c1bfb885a2038f41035f1ef2b66f83686de21d" + ], + "transactionHash": "0x390bfbfe0aea656a0c6d6259347c38defbbc7ba8e5496688be9b6360c921745a", + "transactionIndex": 4 + }, + { + "address": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", + "blockHash": "0x507f63a0e3de6936d5d8f8ab345b647aa6f9e6a67bb5146175f7549d92c81da8", + "blockNumber": 14893503, + "data": "0x000000000000000000000000a2ea7657440875bf916cbfc0cfa88f13e38ad463000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "index": 26, + "topics": [ + "0x382c7aec02462c9b086aba9a7f8dbb1fb8bf336e7b624b0149eeca6726d0fb4a", + "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ], + "transactionHash": "0x390bfbfe0aea656a0c6d6259347c38defbbc7ba8e5496688be9b6360c921745a", + "transactionIndex": 4 + } + ], + "logsBloom": "0x000000000000000000000000000000000000000000000100000000000040000000800000000000000000000000400200000000000000000000000000000c00000040000000000000000000000000000400400000000400000000001000000000000000000000000080000000000000000040000000000000000000000000000000000000000000000001000000000000000008000000000000000000000000000040000000010000000000000080000020000000000000001000000000000000000000020000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000a0100002000000000000", + "status": 1, + "to": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463" + }, + "response": { + "accessList": [], + "blockNumber": 14893503, + "blockHash": "0x507f63a0e3de6936d5d8f8ab345b647aa6f9e6a67bb5146175f7549d92c81da8", + "chainId": "11155420", + "data": "0xbe6002c2000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003448f38f83597d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000aa37dc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001000000000000000000000000004bdf5a13e7a25f88dd5321a979e0e54c13df83e8000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a2ea7657440875bf916cbfc0cfa88f13e38ad46300000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003c03ed7172d2600bd05c9dc7a14c57ba31af6c9c1b3e51e42d23968bc4c1ebe1d4b66e3f67bbc4837c2d24b0275c6437044481329a8fb52af19e6d2ea5c11733c77e0c3e414ef2458f86142a2ea08ea490b36629c555beb37ddb3d8cc405e60cb00000000000000000000000000000000000000000000000000000000000000414f02428220e87325aeb28468cc7ff8c84bb867601c5f91ee314a0d5c8393e2154f13f593e420a8883384f73ad73e7658068ced56f435dd9a2447df0f88795f6b1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "from": "0x0c1c9049564269275059032Fb484Aa2e7Ab779af", + "gasLimit": "188966", + "gasPrice": "1000307", + "hash": "0x390bfbfe0aea656a0c6d6259347c38defbbc7ba8e5496688be9b6360c921745a", + "maxFeePerGas": "1000614", + "maxPriorityFeePerGas": "1000000", + "nonce": 43, + "signature": { + "networkV": null, + "r": "0x232caebaac897efb0e97e55da8df2be7c5a58fa56feeee101c8e24bc6446b7db", + "s": "0x06b6350a0a1b5c1a2f7ee8a0ed383a24334e4f59996a1b5266a17af67ba7e3d9", + "v": 28 + }, + "to": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", + "type": 2, + "value": "0" + } + }, + { + "receipt": { + "blockHash": "0x45961ccde7270c57754780ed2b0d10b9ae31072dced89009f3582784ef611977", + "blockNumber": 14893510, + "contractAddress": null, + "cumulativeGasUsed": "4686880", + "from": "0x0c1c9049564269275059032Fb484Aa2e7Ab779af", + "gasPrice": "1000305", + "gasUsed": "3569078", + "hash": "0x9269e4f2d8fe7a560798f5b41ce72f65369010cdf2f08f40aa8989b8208e3db6", + "index": 3, + "logs": [ + { + "address": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", + "blockHash": "0x45961ccde7270c57754780ed2b0d10b9ae31072dced89009f3582784ef611977", + "blockNumber": 14893510, + "data": "0x0000000000000000000000000000000000000000000000000000000000000000", + "index": 24, + "topics": [ + "0x572f161235911da04685a68c06adf558fc7e4a36909dca394650e0adc19cc93d", + "0x0000000000000000000000000c1c9049564269275059032fb484aa2e7ab779af", + "0x000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4", + "0xc5e659874eeacc1ef6ee971e828d5979b5b7582d3a4fd942f6272ff75f632e9d" + ], + "transactionHash": "0x9269e4f2d8fe7a560798f5b41ce72f65369010cdf2f08f40aa8989b8208e3db6", + "transactionIndex": 3 + }, + { + "address": "0x4bDf5A13e7a25F88dd5321a979e0E54c13DF83E8", + "blockHash": "0x45961ccde7270c57754780ed2b0d10b9ae31072dced89009f3582784ef611977", + "blockNumber": 14893510, + "data": "0x", + "index": 25, + "topics": [ + "0x6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8", + "0x000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4" + ], + "transactionHash": "0x9269e4f2d8fe7a560798f5b41ce72f65369010cdf2f08f40aa8989b8208e3db6", + "transactionIndex": 3 + }, + { + "address": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", + "blockHash": "0x45961ccde7270c57754780ed2b0d10b9ae31072dced89009f3582784ef611977", + "blockNumber": 14893510, + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "index": 26, + "topics": [ + "0xa65fb05c5808f5f389d72edeaf719ce38f4cc55c1f69ca3cbfb31c21501caa07", + "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1" + ], + "transactionHash": "0x9269e4f2d8fe7a560798f5b41ce72f65369010cdf2f08f40aa8989b8208e3db6", + "transactionIndex": 3 + }, + { + "address": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", + "blockHash": "0x45961ccde7270c57754780ed2b0d10b9ae31072dced89009f3582784ef611977", + "blockNumber": 14893510, + "data": "0x", + "index": 27, + "topics": [ + "0x4383d976757d67ca920616be0b6430a681ea9d3dcce8d6d61d4603ca4a9bff63", + "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1" + ], + "transactionHash": "0x9269e4f2d8fe7a560798f5b41ce72f65369010cdf2f08f40aa8989b8208e3db6", + "transactionIndex": 3 + } + ], + "logsBloom": "0x00000000000010000000000000080000000000000000010000000000004000000080000000000000000000000060020000000000000000000000000000080000000000000000200000000000000000040000000000000000800000000000000000000020000000008000000000000000004000000400000000000000000000000000000000000000000100000000000000000800010000000000000000000000004000800001000000000000000000002200000000000000100000000004000000000002000000000000000000000000000000000008000000000000000000000000000000000008000000000000000200000000000080100000000008000000", + "status": 1, + "to": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463" + }, + "response": { + "accessList": [], + "blockNumber": 14893510, + "blockHash": "0x45961ccde7270c57754780ed2b0d10b9ae31072dced89009f3582784ef611977", + "chainId": "11155420", + "data": "0xbe6002c2000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000041a4e65ec46d000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000040c00000000000000000000000000000000000000000000000000000000000aa37dc0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000003fe00000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003bd22c00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000003ee94a424275796261636b486f6f6b000000000000000000000000000000000000006101406040523480156200001257600080fd5b5060405162003e4938038062003e49833981016040819052620000359162000156565b806001600160a01b031663f434c9146040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009a9190620001be565b6001600160a01b039081166080528481166101205282811660c05281811660e081905290841660a0526040805163293c499960e01b8152905163293c4999916004808201926020929091908290030181865afa158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001259190620001be565b6001600160a01b03166101005250620001e592505050565b6001600160a01b03811681146200015357600080fd5b50565b600080600080608085870312156200016d57600080fd5b84516200017a816200013d565b60208601519094506200018d816200013d565b6040860151909350620001a0816200013d565b6060860151909250620001b3816200013d565b939692955090935050565b600060208284031215620001d157600080fd5b8151620001de816200013d565b9392505050565b60805160a05160c05160e0516101005161012051613bb262000297600039600081816104660152818161133801528181611857015281816119cf01528181611aae0152611d550152600081816102970152818161072c01528181610f49015261109001526000818161051e01528181610e14015281816111a20152611f390152600081816103d401526108df01526000818161058601526113780152600081816105520152611c5b0152613bb26000f3fe60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561054c57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000000000000000000000000000000000000000000092505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000000000000000000000000000000000000000000000816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f00000000000000000000000000000000000000000000000000000000000000005b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f00000000000000000000000000000000000000000000000000000000000000005b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f0000000000000000000000000000000000000000000000000000000000000000169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f00000000000000000000000000000000000000000000000000000000000000005b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220673ba775a9e9027f7796ba830c6cc31583ba0bdffbfd7ffbf013c44b6ee8d08b64736f6c6343000817003300000000000000000000000042000000000000000000000000000000000000060000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24000000000000000000000000992f9e3a81c77cb940a29311558343e1ac66c40f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe9900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003cc6c4bdee075f3d8a77a44af95c4aea6866162aad630cbce0d1f63c08d3324824b66e3f67bbc4837c2d24b0275c6437044481329a8fb52af19e6d2ea5c11733c77e0c3e414ef2458f86142a2ea08ea490b36629c555beb37ddb3d8cc405e60cb00000000000000000000000000000000000000000000000000000000", + "from": "0x0c1c9049564269275059032Fb484Aa2e7Ab779af", + "gasLimit": "4548288", + "gasPrice": "1000305", + "hash": "0x9269e4f2d8fe7a560798f5b41ce72f65369010cdf2f08f40aa8989b8208e3db6", + "maxFeePerGas": "1000612", + "maxPriorityFeePerGas": "1000000", + "nonce": 44, + "signature": { + "networkV": null, + "r": "0xdfb0987496db836e0f08956a3b82ad8cc29ddfc3ade6ac07d25d3f183fbcc3f5", + "s": "0x35bf1b9265755dd4ea11e39ba4b4be55a1936354df7e4339db351400b601eca0", + "v": 27 + }, + "to": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", + "type": 2, + "value": "0" + } + } + ], + "merkleRoot": "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1", + "solcInputHashes": [ + "f096d2968ac6c775921975b16cb0c91e" + ], + "safeAddress": "0x4bDf5A13e7a25F88dd5321a979e0E54c13DF83E8", + "moduleAddress": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", + "executorAddress": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", + "nonce": "1", + "chainId": "11155420", + "actions": [ + { + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "value": "0", + "txData": "0x4a424275796261636b486f6f6b000000000000000000000000000000000000006101406040523480156200001257600080fd5b5060405162003e4938038062003e49833981016040819052620000359162000156565b806001600160a01b031663f434c9146040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009a9190620001be565b6001600160a01b039081166080528481166101205282811660c05281811660e081905290841660a0526040805163293c499960e01b8152905163293c4999916004808201926020929091908290030181865afa158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001259190620001be565b6001600160a01b03166101005250620001e592505050565b6001600160a01b03811681146200015357600080fd5b50565b600080600080608085870312156200016d57600080fd5b84516200017a816200013d565b60208601519094506200018d816200013d565b6040860151909350620001a0816200013d565b6060860151909250620001b3816200013d565b939692955090935050565b600060208284031215620001d157600080fd5b8151620001de816200013d565b9392505050565b60805160a05160c05160e0516101005161012051613bb262000297600039600081816104660152818161133801528181611857015281816119cf01528181611aae0152611d550152600081816102970152818161072c01528181610f49015261109001526000818161051e01528181610e14015281816111a20152611f390152600081816103d401526108df01526000818161058601526113780152600081816105520152611c5b0152613bb26000f3fe60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561054c57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000000000000000000000000000000000000000000092505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000000000000000000000000000000000000000000000816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f00000000000000000000000000000000000000000000000000000000000000005b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f00000000000000000000000000000000000000000000000000000000000000005b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f0000000000000000000000000000000000000000000000000000000000000000169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f00000000000000000000000000000000000000000000000000000000000000005b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220673ba775a9e9027f7796ba830c6cc31583ba0bdffbfd7ffbf013c44b6ee8d08b64736f6c6343000817003300000000000000000000000042000000000000000000000000000000000000060000000000000000000000004752ba5dbc23f44d87826276bf6fd6b1c372ad24000000000000000000000000992f9e3a81c77cb940a29311558343e1ac66c40f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe99", + "gas": "3920428", + "operation": 0, + "requireSuccess": true + } + ], + "sphinxConfig": { + "projectName": "nana-buyback-hook-testnet", + "orgId": "my-org-id", + "owners": [ + "0xba5ed94ab173e1242638F28d1449b24F1A883292" + ], + "mainnets": [ + "ethereum", + "optimism", + "base", + "arbitrum" + ], + "testnets": [ + "ethereum_sepolia", + "optimism_sepolia", + "base_sepolia", + "arbitrum_sepolia" + ], + "threshold": "1", + "saltNonce": "15" + }, + "executionMode": 2, + "initialState": { + "isSafeDeployed": true, + "isModuleDeployed": true, + "isExecuting": false + }, + "unlabeledContracts": [], + "arbitraryChain": false, + "libraries": [], + "gitCommit": "9caaedd7d4d116463c4ceecb3147a8863f806dab", + "safeInitData": null +} \ No newline at end of file diff --git a/deployments/nana-buyback-hook-testnet/sepolia/JBBuybackHook.json b/deployments/nana-buyback-hook-testnet/sepolia/JBBuybackHook.json index 74e0699..bb1153f 100644 --- a/deployments/nana-buyback-hook-testnet/sepolia/JBBuybackHook.json +++ b/deployments/nana-buyback-hook-testnet/sepolia/JBBuybackHook.json @@ -1,8 +1,8 @@ { "_format": "sphinx-sol-ct-artifact-1", - "merkleRoot": "0xdf51ca1fa6bf804fc5dfbf513fb7282e053f136c07f7c4f9b3a95012943e1a10", + "merkleRoot": "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1", "contractName": "JBBuybackHook", - "address": "0x4a89CFFee754a67D62c70B7D62674382c8D57eA8", + "address": "0xA478dd6D7B760bf63f1E99868c94cd2EBeE5E605", "abi": [ { "type": "constructor", @@ -349,7 +349,7 @@ "internalType": "uint256" }, { - "name": "reservedRate", + "name": "reservedPercent", "type": "uint256", "internalType": "uint256" }, @@ -967,86 +967,86 @@ "inputs": [] } ], - "solcInputHash": "347fff29e2440260967cc55cc0a76014", + "solcInputHash": "f096d2968ac6c775921975b16cb0c91e", "receipt": { - "blockHash": "0x2911c90b341d8b2c6589c24a5b85f81a648b6c9aee55de41e233e7671a2a05f5", - "blockNumber": 6346597, + "blockHash": "0xc6d3628b007961aa29034b74598c174b05ac8ec53e1919df282bc97ca2d9d95a", + "blockNumber": 6352015, "contractAddress": null, - "cumulativeGasUsed": "9349348", + "cumulativeGasUsed": "13953457", "from": "0x0c1c9049564269275059032Fb484Aa2e7Ab779af", - "gasPrice": "3843442", - "gasUsed": "3569238", - "hash": "0x3c28623602daa454a0dfd1fd8d10c13d4b7bf9c8e5b1a7172f8ce53f1004db63", - "index": 47, + "gasPrice": "170969085", + "gasUsed": "3569272", + "hash": "0x30ef079f088329b2831dc1cacc5e5524735849da2ced6741969131e62ec70df8", + "index": 75, "logs": [ { "address": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", - "blockHash": "0x2911c90b341d8b2c6589c24a5b85f81a648b6c9aee55de41e233e7671a2a05f5", - "blockNumber": 6346597, + "blockHash": "0xc6d3628b007961aa29034b74598c174b05ac8ec53e1919df282bc97ca2d9d95a", + "blockNumber": 6352015, "data": "0x0000000000000000000000000000000000000000000000000000000000000000", - "index": 55, + "index": 154, "topics": [ "0x572f161235911da04685a68c06adf558fc7e4a36909dca394650e0adc19cc93d", "0x0000000000000000000000000c1c9049564269275059032fb484aa2e7ab779af", "0x000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4", - "0xc2a87521d16c59366eee8b661750df44bc592d096c530972cd9f313e99722be4" + "0xa02f90f5a4f5b5bcecf85cff120e7271ba5c0b1cf871817e7bd478ddae0a02d6" ], - "transactionHash": "0x3c28623602daa454a0dfd1fd8d10c13d4b7bf9c8e5b1a7172f8ce53f1004db63", - "transactionIndex": 47 + "transactionHash": "0x30ef079f088329b2831dc1cacc5e5524735849da2ced6741969131e62ec70df8", + "transactionIndex": 75 }, { "address": "0x4bDf5A13e7a25F88dd5321a979e0E54c13DF83E8", - "blockHash": "0x2911c90b341d8b2c6589c24a5b85f81a648b6c9aee55de41e233e7671a2a05f5", - "blockNumber": 6346597, + "blockHash": "0xc6d3628b007961aa29034b74598c174b05ac8ec53e1919df282bc97ca2d9d95a", + "blockNumber": 6352015, "data": "0x", - "index": 56, + "index": 155, "topics": [ "0x6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8", "0x000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4" ], - "transactionHash": "0x3c28623602daa454a0dfd1fd8d10c13d4b7bf9c8e5b1a7172f8ce53f1004db63", - "transactionIndex": 47 + "transactionHash": "0x30ef079f088329b2831dc1cacc5e5524735849da2ced6741969131e62ec70df8", + "transactionIndex": 75 }, { "address": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", - "blockHash": "0x2911c90b341d8b2c6589c24a5b85f81a648b6c9aee55de41e233e7671a2a05f5", - "blockNumber": 6346597, + "blockHash": "0xc6d3628b007961aa29034b74598c174b05ac8ec53e1919df282bc97ca2d9d95a", + "blockNumber": 6352015, "data": "0x0000000000000000000000000000000000000000000000000000000000000001", - "index": 57, + "index": 156, "topics": [ "0xa65fb05c5808f5f389d72edeaf719ce38f4cc55c1f69ca3cbfb31c21501caa07", - "0xdf51ca1fa6bf804fc5dfbf513fb7282e053f136c07f7c4f9b3a95012943e1a10" + "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1" ], - "transactionHash": "0x3c28623602daa454a0dfd1fd8d10c13d4b7bf9c8e5b1a7172f8ce53f1004db63", - "transactionIndex": 47 + "transactionHash": "0x30ef079f088329b2831dc1cacc5e5524735849da2ced6741969131e62ec70df8", + "transactionIndex": 75 }, { "address": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", - "blockHash": "0x2911c90b341d8b2c6589c24a5b85f81a648b6c9aee55de41e233e7671a2a05f5", - "blockNumber": 6346597, + "blockHash": "0xc6d3628b007961aa29034b74598c174b05ac8ec53e1919df282bc97ca2d9d95a", + "blockNumber": 6352015, "data": "0x", - "index": 58, + "index": 157, "topics": [ "0x4383d976757d67ca920616be0b6430a681ea9d3dcce8d6d61d4603ca4a9bff63", - "0xdf51ca1fa6bf804fc5dfbf513fb7282e053f136c07f7c4f9b3a95012943e1a10" + "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1" ], - "transactionHash": "0x3c28623602daa454a0dfd1fd8d10c13d4b7bf9c8e5b1a7172f8ce53f1004db63", - "transactionIndex": 47 + "transactionHash": "0x30ef079f088329b2831dc1cacc5e5524735849da2ced6741969131e62ec70df8", + "transactionIndex": 75 } ], - "logsBloom": "0x00000000000010000000000000080000000000000000010000000000004000000080000000000000000000000040020000000000000000000000000000000000000000000000200000000000000000000000000000000000800000000000000000000000000000000000000000000000004000000400000000100000000000000000000000040000000100000000000000000800000040000000000000000000004000800001000000000000000000002200000400000000100000800004000000000002000000000000000000000000000000000008000000000000000000000000000000000008000000000000000200000000000080100004000008000000", + "logsBloom": "0x00000000000010000000000000080000000000000000010000000000004000000080000000000000000000000040020000000000000000000000000000080000000000000000200000000000000000040000000000000000800000000000000000000000000000008000000000000000004000000400000000000000000000000000000000000000000100000000000000000800000000000000000000000000004000800001000000000000000000002200000000000000100000000004000000000002100000000000000000000000000000000008000000000000000000000100000000000008000000000000000200000000000080100000000008000200", "status": 1, "to": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463" }, - "metadata": "{\"compiler\":{\"version\":\"0.8.23+commit.f704f362\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IWETH9\",\"name\":\"weth\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"internalType\":\"contract IJBDirectory\",\"name\":\"directory\",\"type\":\"address\"},{\"internalType\":\"contract IJBController\",\"name\":\"controller\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InsufficientPayAmount\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InvalidTwapSlippageTolerance\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InvalidTwapWindow\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"NoProjectToken\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"denominator\",\"type\":\"uint256\"}],\"type\":\"error\",\"name\":\"PRBMath_MulDiv_Overflow\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"PoolAlreadySet\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"SpecifiedSlippageExceeded\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"T\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"UNAUTHORIZED\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"Unauthorized\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"tokenCount\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"Mint\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\",\"indexed\":true},{\"internalType\":\"address\",\"name\":\"newPool\",\"type\":\"address\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"PoolAdded\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"pool\",\"type\":\"address\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"amountOut\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"Swap\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"oldTwapTolerance\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"newTwapTolerance\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"TwapSlippageToleranceChanged\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"oldSecondsAgo\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"newSecondsAgo\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"TwapWindowChanged\",\"anonymous\":false},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"CONTROLLER\",\"outputs\":[{\"internalType\":\"contract IJBController\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"DIRECTORY\",\"outputs\":[{\"internalType\":\"contract IJBDirectory\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MAX_TWAP_SLIPPAGE_TOLERANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MAX_TWAP_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MIN_TWAP_SLIPPAGE_TOLERANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MIN_TWAP_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"PERMISSIONS\",\"outputs\":[{\"internalType\":\"contract IJBPermissions\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"PROJECTS\",\"outputs\":[{\"internalType\":\"contract IJBProjects\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"TWAP_SLIPPAGE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"UNISWAP_V3_FACTORY\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"WETH\",\"outputs\":[{\"internalType\":\"contract IWETH9\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"struct JBAfterPayRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"amount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"forwardedAmount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"projectTokenCount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"hookMetadata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"payerMetadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"payable\",\"type\":\"function\",\"name\":\"afterPayRecordedWith\"},{\"inputs\":[{\"internalType\":\"struct JBBeforePayRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"terminal\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"amount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reservedRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"beforePayRecordedWith\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"struct JBPayHookSpecification[]\",\"name\":\"hookSpecifications\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"contract IJBPayHook\",\"name\":\"hook\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}]},{\"inputs\":[{\"internalType\":\"struct JBBeforeRedeemRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"terminal\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"holder\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"redeemCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"surplus\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"bool\",\"name\":\"useTotalSurplus\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"redemptionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"beforeRedeemRecordedWith\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"struct JBRedeemHookSpecification[]\",\"name\":\"hookSpecifications\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"contract IJBRedeemHook\",\"name\":\"hook\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"hasMintPermissionFor\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"poolOf\",\"outputs\":[{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"projectTokenOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"uint32\",\"name\":\"twapWindow\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"twapSlippageTolerance\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setPoolFor\",\"outputs\":[{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"newPool\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newSlippageTolerance\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setTwapSlippageToleranceOf\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"newWindow\",\"type\":\"uint32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setTwapWindowOf\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"twapSlippageToleranceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"twapWindowOf\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}]},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"amount0Delta\",\"type\":\"int256\"},{\"internalType\":\"int256\",\"name\":\"amount1Delta\",\"type\":\"int256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"uniswapV3SwapCallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"afterPayRecordedWith((address,uint256,uint256,(address,uint8,uint32,uint256),(address,uint8,uint32,uint256),uint256,uint256,address,bytes,bytes))\":{\"details\":\"This function is only called if the minimum return from the swap exceeds the return from minting by paying the project. If the swap reverts (due to slippage, insufficient liquidity, or something else), then the hook mints the number of tokens which a payment to the project would have minted.\",\"params\":{\"context\":\"The pay context passed in by the terminal.\"}},\"beforePayRecordedWith((address,address,(address,uint8,uint32,uint256),uint256,uint256,address,uint256,uint256,bytes))\":{\"params\":{\"context\":\"Payment context passed to the data hook by `terminalStore.recordPaymentFrom(...)`. `context.metadata` can specify a Uniswap quote and specify how much of the payment should be used to swap. If `context.metadata` does not specify a quote, one will be calculated based on the TWAP. If `context.metadata` does not specify how much of the payment should be used, the hook uses the full amount paid in.\"},\"returns\":{\"hookSpecifications\":\"Specifications containing pay hooks, as well as the amount and metadata to send to them. Fulfilled by the terminal. If tokens are only being minted, `hookSpecifications` will be empty.\",\"weight\":\"The weight to use. If tokens are being minted from the project, this is the original weight. If tokens are being bought from the pool, the weight is 0. If tokens are being minted AND bought from the pool, this weight is adjusted to take both into account.\"}},\"beforeRedeemRecordedWith((address,address,uint256,uint256,uint256,uint256,(address,uint8,uint32,uint256),bool,uint256,bytes))\":{\"details\":\"Pass redeem context back to the terminal without changes.\",\"params\":{\"context\":\"The redeem context passed in by the terminal.\"}},\"constructor\":{\"params\":{\"controller\":\"The controller used to mint and burn tokens.\",\"directory\":\"The directory of terminals and controllers.\",\"factory\":\"The address of the Uniswap v3 factory. Used to calculate pool addresses.\",\"weth\":\"The WETH contract.\"}},\"setPoolFor(uint256,uint24,uint32,uint256,address)\":{\"details\":\"Uses create2 for callback auth and to allow adding pools which haven't been deployed yet. This can be called by the project's owner or an address which has the `JBPermissionIds.SET_BUYBACK_POOL` permission from the owner.\",\"params\":{\"fee\":\"The fee used in the pool being set, as a fixed-point number of basis points with 2 decimals. A 0.01% fee is `100`, a 0.05% fee is `500`, a 0.3% fee is `3000`, and a 1% fee is `10000`.\",\"projectId\":\"The ID of the project to set the pool for.\",\"terminalToken\":\"The address of the terminal token that payments to the project are made in.\",\"twapSlippageTolerance\":\"The maximum spread allowed between the amount received and the TWAP.\",\"twapWindow\":\"The period of time over which the TWAP is computed.\"},\"returns\":{\"newPool\":\"The pool that was set for the project and terminal token.\"}},\"setTwapSlippageToleranceOf(uint256,uint256)\":{\"details\":\"This can be called by the project's owner or an address with `JBPermissionIds.SET_BUYBACK_TWAP` permission from the owner.\",\"params\":{\"newSlippageTolerance\":\"The new TWAP slippage tolerance, out of `TWAP_SLIPPAGE_DENOMINATOR`.\",\"projectId\":\"The ID of the project to set the TWAP slippage tolerance of.\"}},\"setTwapWindowOf(uint256,uint32)\":{\"details\":\"This can be called by the project's owner or an address with `JBPermissionIds.SET_BUYBACK_TWAP` permission from the owner.\",\"params\":{\"newWindow\":\"The new TWAP window.\",\"projectId\":\"The ID of the project to set the TWAP window of.\"}},\"supportsInterface(bytes4)\":{\"details\":\"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.\"},\"twapSlippageToleranceOf(uint256)\":{\"details\":\"The \\\"TWAP slippage tolerance\\\" is the maximum negative spread between the TWAP and the expected return from a swap. If the expected return unfavourably exceeds the TWAP slippage tolerance, the swap will revert.\",\"params\":{\"projectId\":\"The ID of the project which the TWAP slippage tolerance applies to.\"},\"returns\":{\"_0\":\"tolerance The maximum slippage allowed relative to the TWAP, as a percent out of `TWAP_SLIPPAGE_DENOMINATOR`.\"}},\"twapWindowOf(uint256)\":{\"details\":\"The \\\"TWAP window\\\" is the period over which the TWAP is computed.\",\"params\":{\"projectId\":\"The ID of the project which the TWAP window applies to.\"},\"returns\":{\"_0\":\"secondsAgo The TWAP window in seconds.\"}},\"uniswapV3SwapCallback(int256,int256,bytes)\":{\"params\":{\"amount0Delta\":\"The amount of token 0 being used for the swap.\",\"amount1Delta\":\"The amount of token 1 being used for the swap.\",\"data\":\"Data passed in by the swap operation.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"CONTROLLER()\":{\"notice\":\"The controller used to mint and burn tokens.\"},\"DIRECTORY()\":{\"notice\":\"The directory of terminals and controllers.\"},\"MAX_TWAP_SLIPPAGE_TOLERANCE()\":{\"notice\":\"Projects cannot specify a TWAP slippage tolerance larger than this constant (out of `MAX_SLIPPAGE`).\"},\"MAX_TWAP_WINDOW()\":{\"notice\":\"Projects cannot specify a TWAP window longer than this constant.\"},\"MIN_TWAP_SLIPPAGE_TOLERANCE()\":{\"notice\":\"Projects cannot specify a TWAP slippage tolerance smaller than this constant (out of `MAX_SLIPPAGE`).\"},\"MIN_TWAP_WINDOW()\":{\"notice\":\"Projects cannot specify a TWAP window shorter than this constant.\"},\"PERMISSIONS()\":{\"notice\":\"A contract storing permissions.\"},\"PROJECTS()\":{\"notice\":\"The project registry.\"},\"TWAP_SLIPPAGE_DENOMINATOR()\":{\"notice\":\"The denominator used when calculating TWAP slippage percent values.\"},\"UNISWAP_V3_FACTORY()\":{\"notice\":\"The address of the Uniswap v3 factory. Used to calculate pool addresses.\"},\"WETH()\":{\"notice\":\"The wETH contract.\"},\"afterPayRecordedWith((address,uint256,uint256,(address,uint8,uint32,uint256),(address,uint8,uint32,uint256),uint256,uint256,address,bytes,bytes))\":{\"notice\":\"Swap the specified amount of terminal tokens for project tokens, using any leftover terminal tokens to mint from the project.\"},\"beforePayRecordedWith((address,address,(address,uint8,uint32,uint256),uint256,uint256,address,uint256,uint256,bytes))\":{\"notice\":\"The `IJBRulesetDataHook` implementation which determines whether tokens should be minted from the project or bought from the pool.\"},\"beforeRedeemRecordedWith((address,address,uint256,uint256,uint256,uint256,(address,uint8,uint32,uint256),bool,uint256,bytes))\":{\"notice\":\"To fulfill the `IJBRulesetDataHook` interface.\"},\"hasMintPermissionFor(uint256,address)\":{\"notice\":\"Required by the `IJBRulesetDataHook` interfaces. Return false to not leak any permissions.\"},\"poolOf(uint256,address)\":{\"notice\":\"The Uniswap pool where a given project's token and terminal token pair are traded.\"},\"projectTokenOf(uint256)\":{\"notice\":\"The address of each project's token.\"},\"setPoolFor(uint256,uint24,uint32,uint256,address)\":{\"notice\":\"Set the pool to use for a given project and terminal token (the default for the project's token <-> terminal token pair).\"},\"setTwapSlippageToleranceOf(uint256,uint256)\":{\"notice\":\"Set the TWAP slippage tolerance for a project. The TWAP slippage tolerance is the maximum spread allowed between the amount received and the TWAP.\"},\"setTwapWindowOf(uint256,uint32)\":{\"notice\":\"Change the TWAP window for a project. The TWAP window is the period of time over which the TWAP is computed.\"},\"twapSlippageToleranceOf(uint256)\":{\"notice\":\"Get the TWAP slippage tolerance for a given project ID.\"},\"twapWindowOf(uint256)\":{\"notice\":\"Get the TWAP window for a given project ID.\"},\"uniswapV3SwapCallback(int256,int256,bytes)\":{\"notice\":\"The Uniswap v3 pool callback where the token transfer is expected to happen.\"}},\"version\":1}},\"settings\":{\"remappings\":[\"@bananapus/=node_modules/@bananapus/\",\"@chainlink/=node_modules/@chainlink/\",\"@eth-optimism/=node_modules/@eth-optimism/\",\"@exhausted-pigeon/=node_modules/@exhausted-pigeon/\",\"@openzeppelin/=node_modules/@openzeppelin/\",\"@prb/=node_modules/@prb/\",\"@scroll-tech/=node_modules/@scroll-tech/\",\"@sphinx-labs/contracts/=node_modules/@sphinx-labs/contracts/contracts/foundry/\",\"@uniswap/=node_modules/@uniswap/\",\"base64-sol/=node_modules/base64-sol/\",\"ds-test/=lib/forge-std/lib/ds-test/src/\",\"forge-std/=lib/forge-std/src/\",\"hardhat/=node_modules/hardhat/\",\"solmate/=node_modules/solmate/\",\"sphinx/=lib/sphinx/packages/contracts/contracts/forge-std/src/\"],\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"compilationTarget\":{\"src/JBBuybackHook.sol\":\"JBBuybackHook\"},\"evmVersion\":\"paris\",\"libraries\":{}},\"sources\":{\"node_modules/@bananapus/core/src/abstract/JBPermissioned.sol\":{\"keccak256\":\"0x6486c11bff6384bfa938feb7aaacc977f457abff25b17b9aa094077d3fef71f8\",\"urls\":[\"bzz-raw://8b5190202326b6499391d5128cdb2d9ff44e91cd9ba6d8a5fe01e6f21259270d\",\"dweb:/ipfs/QmR2ufPwHtCAZYkJoyWyyag6BfdaWpaLk7VhuDc6BRLqVe\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/enums/JBApprovalStatus.sol\":{\"keccak256\":\"0x61c69b6bac7d24b566d87cda23a77e4ca9cdb87200b106aba8534cb9a0973e33\",\"urls\":[\"bzz-raw://6a9ca7249de76f77a8252eefe6bd1b63d47952f25a2acfa2c8db967cdff4470c\",\"dweb:/ipfs/QmaxSxptRQNj8bNy96EreENmrnRWdKmhyihBcxyWzBX5BN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBController.sol\":{\"keccak256\":\"0xc29d388bc66931c8f236d9e27f0414120323584258c3557f7d93be053f24bafd\",\"urls\":[\"bzz-raw://628aab4035065cd043cff54436cd21db92f7551899ff42f4ee60a4fec6839276\",\"dweb:/ipfs/QmbdSuUYQL9RYkR97hDVLZw82R7o6p2vEBpPamgqUpHiE4\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBDirectory.sol\":{\"keccak256\":\"0x9cc380844aef60078ee47a61861e55a29c4a8c947efd556ebd36e6909f7b9d62\",\"urls\":[\"bzz-raw://9f5190ec8b6683d9781ee6e9eedcc91294753242748875d4a06349077e4cbaaf\",\"dweb:/ipfs/QmTQrPuXT9TCA4txwrperMeXSGvGxP8iokUK47f62F388i\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBDirectoryAccessControl.sol\":{\"keccak256\":\"0x1e67f56849320a46f834aaa9bd62b170ff8ada7b224b4a81136193740fa0be4d\",\"urls\":[\"bzz-raw://ea8fbcec44abfe49d137bcae129b67e5479d6b17879301f88534c8a7fab00be4\",\"dweb:/ipfs/QmT6wrtYX4GRpffHUzupNwYebJ1dqkkKZLEewWsoyunsqw\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFeeTerminal.sol\":{\"keccak256\":\"0xdb6f3349cbe2078faa8421dec892136693748d8a60b70a1dee3bce2cfc5274fc\",\"urls\":[\"bzz-raw://ccc6a67fc72726c6180c41523cc2a43562864347770a86ff54532fb6ca09e7c3\",\"dweb:/ipfs/QmZinV1LoRsmTq713YGvNShaPtGaxLqwJ6u2EwwGKEKCgu\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFeelessAddresses.sol\":{\"keccak256\":\"0xe5df42cfa71c5fa41b905c122de5825df13c2aab2f9cc4cf4bafa331dd69c27e\",\"urls\":[\"bzz-raw://3773bf3b42cc57d1e4086147e52135ff1dbff4309c45ca0398f821dfaa071563\",\"dweb:/ipfs/QmXUEJssHaxYKfV33tMZGf81JTR5a5yxEVshzNus84xLuT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFundAccessLimits.sol\":{\"keccak256\":\"0xf5fd6bdd723b60d490ccbe22cdf1cfe43663d23e6ee48badcd1b71e3282cb16b\",\"urls\":[\"bzz-raw://fe692f0b843ea5fccdfcb68f4ec16e1c0add945bb74b303c9866342be0e31fbf\",\"dweb:/ipfs/QmSRmzpgp3DhNEhNDiLsSu7yEiTeywbzEFbwyGyDazjgKt\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBMultiTerminal.sol\":{\"keccak256\":\"0xc7b4f5043ec5733f5b303688f3dbf475ef5f6fe12364847a538c8b48a2137fb7\",\"urls\":[\"bzz-raw://fcd1b41a2acfd035e285e6f20f983b9b00a4e00c688a3072062dfb7f5c9c5afe\",\"dweb:/ipfs/QmYCfjakBGxWWTvb5Pk9UAeguwiWrnsNviQWMsaYz7Xq5N\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPayHook.sol\":{\"keccak256\":\"0x9438866782c652c2942f4d114e35f393cd3c8b0334abce8387eed90bca35e8b2\",\"urls\":[\"bzz-raw://cfd99daf57213f92325aad7d7d16e98476d38e870470e95ba01e3ae3cdecc95d\",\"dweb:/ipfs/QmUKKAVGf7ki8BHksr99tFcRW8APveeB5tNH63ctTbbCW8\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPayoutTerminal.sol\":{\"keccak256\":\"0xd0f9374470591c4afb2525c9c7b1bdad577765857c404b22ee5d8d2997a18fad\",\"urls\":[\"bzz-raw://4529c066b2014ee64b8fb16981a9fd5badf64dea7ac6c07dd1b1e7ab5cdc1d8a\",\"dweb:/ipfs/QmYxTdPjRAZ8iThUoNmJuivEaRaB3xXpyHdhCU7my1UHZy\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermissioned.sol\":{\"keccak256\":\"0x5b038d4dee116584e88b230920e56d48e135053e3f7e5642eaea14a775c1dad7\",\"urls\":[\"bzz-raw://19e43102f349fd4a1da1c0943ffb8f2950007fe4bb4bb7e8f74fc142575d091b\",\"dweb:/ipfs/QmXHAt4KzDTdDZgDDefEXH2WKi7NcfkJb9R7nxW5uDqsNp\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermissions.sol\":{\"keccak256\":\"0x49d2b91a866004af098a6770b28040071885b048b4b50744b12a1e5b212c5e5e\",\"urls\":[\"bzz-raw://089b4dda50be91412ffe1fbe333f78cc894f073c1a7afe469f10a2cee12fbf9e\",\"dweb:/ipfs/QmYPPBZ6HwBa1RNkNGqGcR2xgj4fnWBzrPHHoJG3kZA6AN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermitTerminal.sol\":{\"keccak256\":\"0xd6bd30842273f5b794f82219fefdd4953f5343328d2cfdb684b7d826cc0c769c\",\"urls\":[\"bzz-raw://ca1195fd5572060b36fc7e45f46d59f974e3a908248edcfadeb8cb06247075f0\",\"dweb:/ipfs/QmYTpDXKTXqi8GQFsNqB8LiGFTZjSPY3PA8vKqZBraVdqD\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPriceFeed.sol\":{\"keccak256\":\"0x4bd84c0f1a5d4729ed709bcddd43f4c50ec4a165ece79780af8dce482ed07d4a\",\"urls\":[\"bzz-raw://62bac4bfb6982fb002f620c77e5c445e62d50241a5aa64a07e51d929f5a42180\",\"dweb:/ipfs/QmWgJUDreVY2BuMX38a1iUUR5kNbMwGnKG3VvurB7oZtuM\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPrices.sol\":{\"keccak256\":\"0xa4988a8984774e9f9d355236e3c4ab67868503964747684d989ceb54a4176361\",\"urls\":[\"bzz-raw://7496393b49f8a594e6bc3393ffab118e4dc95f69233c77046cd552b1c52a533a\",\"dweb:/ipfs/QmavDESpty7XFmLgWKMHb3venZVPGwwKevWmYStM2mxcPH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBProjectUriRegistry.sol\":{\"keccak256\":\"0x2799475228987e4f8334ac33d3935f759c9b8133db7383b4f622dde7a5dc0502\",\"urls\":[\"bzz-raw://d751731740f45df74eea48c9667e847ee2cddb2980ab4939c86bd17e6c6ed89b\",\"dweb:/ipfs/QmXW8SLTuhdUpfn7pRpdsYdcyuim8RTyagU37ULcj5UZhT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBProjects.sol\":{\"keccak256\":\"0x735c2fb8f1fa827f054ee77f7a0ae4b312656217acb75b624d2c8fd9dc40151b\",\"urls\":[\"bzz-raw://ee7fc92299a8633a80693ae63ab494dcd125f1789487a54a39dc0e5696e5996f\",\"dweb:/ipfs/QmX7YJD4pS2XhgQb7p3JbBAXynT7YGPXcZe92BiWWRrsCL\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRedeemHook.sol\":{\"keccak256\":\"0x8ab46fcd7d0e739661eb76056ad93ff99106f38420ef0b4eb97fa9f4bb71a68a\",\"urls\":[\"bzz-raw://0ef96fcb7ad26281d444d8e0c677b25114fdd63b1c172d477e030dce8ba53b62\",\"dweb:/ipfs/Qmcx1jRQuwU4pZFuLxsSsx4oMbRaDfktHrPnXextgbWc5m\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRedeemTerminal.sol\":{\"keccak256\":\"0xd1b4aa38154e08f1474745ea6bc8f8823fe8aa68c124d596742597f2296ea16d\",\"urls\":[\"bzz-raw://9bd254e833702dfe5e28db5fee76478947ab45b501c966501f719e73bbf0397a\",\"dweb:/ipfs/QmZ3Ng7TmVxL6ozSUhx4kYdQdZhoYi4t43cYZVAMz7Fn5M\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesetApprovalHook.sol\":{\"keccak256\":\"0x592e95d159494421c6b1bcb362d0cee1df0132921697351304e9cd7af4fbd386\",\"urls\":[\"bzz-raw://5bebfd5fa67c1b6ea16fa2e76e9520e9dfe52a579f48dd94d0c2ec45f78ad178\",\"dweb:/ipfs/QmRUawEGtfYoYSHmHELGhvJoWuMsxLPKtqAXgsrb7fJboP\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesetDataHook.sol\":{\"keccak256\":\"0x13b4b9f4b847f62442da1c1a59b399f8f201b31a28edb96aa5a8a78ad57c24d0\",\"urls\":[\"bzz-raw://4fcd00b77d0f40cf6d5ee6590b6ef4ee1f606e89ae4c4faed3710fb462108f8e\",\"dweb:/ipfs/QmeoE54DQ3eGw9EDXfN7aTMmEjubAtirahmytDijo6GSeE\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesets.sol\":{\"keccak256\":\"0x011d86a1ea51aed45ee83ce7b289e7abd231074ce1a12e53faa194811d5334c0\",\"urls\":[\"bzz-raw://c7d03e746e28f6d381c4a81e1b7599f01b84fa52e97106105f7a402f689b6395\",\"dweb:/ipfs/QmT7nWeCGnPaBQuCKFpmoZNiXzkCWCVLZJJAf9i4D6xNJg\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBSplitHook.sol\":{\"keccak256\":\"0xeb8dfac7a4b81897a1c3b5d0d853a406bcff33720fb187d5ca5bb3dcc0ba3a12\",\"urls\":[\"bzz-raw://36aaeef6107cfe5b0127e063ea215aac7200f8af02e28a48e61111abd3254688\",\"dweb:/ipfs/QmQ8yQANXnhQCAWBGKsKCDsJ3A8hnTKNg5tyo79GfWXTcV\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBSplits.sol\":{\"keccak256\":\"0xd8894cfc55560d914f413e40c981165e1e9dc845b35cdf0ecd13fd118733a483\",\"urls\":[\"bzz-raw://e03b8e5e34c924a91884e3ef79ea039292f8927241698db84a09a463ced4cc52\",\"dweb:/ipfs/QmSqhVX2LSStR7xEcc96zAiQpTPDSsZBn8YvH33CtiU1FN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTerminal.sol\":{\"keccak256\":\"0x8981b96902125707c49c63867b718118fdfb04cb8fd42b038d93ef87ea56f85c\",\"urls\":[\"bzz-raw://7b172c6924a10431652eab136758953a51af8d709a55afff1533d13e687be60c\",\"dweb:/ipfs/QmWczAk48Jw8qNgrUn4EFRK25CrmCp7MmEaJsGtTXueaEb\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTerminalStore.sol\":{\"keccak256\":\"0x140159d66d729f6aeed0fe1f7c655619985146ec00e8c68cbd9b5d30d4dc7d23\",\"urls\":[\"bzz-raw://f972ecb52bcfcd2852c9e7264b1ecc504ce94bd6e12c034b93c1768cd372954e\",\"dweb:/ipfs/QmRu7in5iJSWHLTcFPbJmiK1rCHFbwNY7qzY4cG6kgfYcr\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBToken.sol\":{\"keccak256\":\"0x71b1f9c3a0edd41910f77396e0be2c65596571176d53eb87e887c3c0da56c0fb\",\"urls\":[\"bzz-raw://6e956f0582f4525e83d845ee9b4a89959abc4f821414f6accbbee5b38960482d\",\"dweb:/ipfs/QmbSvjgmCgnfVmcCTGu8XwrV1Rufsf3M8hB8unFq6fTMdH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTokenUriResolver.sol\":{\"keccak256\":\"0xfa5cb00dcd6085d1ef912d071fe73c63f9478a2cd0f9d8bddaf659b6af2d0967\",\"urls\":[\"bzz-raw://282e4e7c342d65f77cde0e9a08fcaf20ef5cf379c7a48b639842c0ffd0b2afb8\",\"dweb:/ipfs/QmbnN3PEQeZaXdPLT75V1J79kMg7KqSMru37RHrL3z8Yf2\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTokens.sol\":{\"keccak256\":\"0x6fd67af915dd541d9547c8297aa9ae269690e4ee23531db43f021bcacec6076f\",\"urls\":[\"bzz-raw://2e5e11954e9ab2319fffccb6563f3db400b8f7760d4ffe2165048a02c9c37fa6\",\"dweb:/ipfs/QmbDXtV83dK8EfiTjsTRf55R2XqPZzDKcjtYbW8sxQ5CFm\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/libraries/JBConstants.sol\":{\"keccak256\":\"0xf7994eb0ab6979633ad42bf274f7679dcfcc81e0a35fe931d35b663ba6cb808f\",\"urls\":[\"bzz-raw://b6caec5469c07153fc7b9d6f2e1370e3da4e6386829a1fe99e02526464754610\",\"dweb:/ipfs/QmRXsoUc1FzxFHLvNQvxjZMRaiovdeTskcA5XZz4AEVGdq\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/libraries/JBMetadataResolver.sol\":{\"keccak256\":\"0xdf32038c5e7f65725e2ef87d09fe04972d7da6a63b60c066d4616b2c2ada5149\",\"urls\":[\"bzz-raw://50582c41ee196ead31d13dcc5a468436d524891d7873743ba92d1d64a0b5783a\",\"dweb:/ipfs/QmPiJMbA1oQnVKQTjqYvUvtWaaiFCeKic8NJtu2crrAznW\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAccountingContext.sol\":{\"keccak256\":\"0x9c47e048a719f784f601df69a583505432217b9868a0244876d277f84dd1ebdf\",\"urls\":[\"bzz-raw://8565f194b87914da9a02af2e760ae2ed2a9d185c6f11229f7035140776d2fec9\",\"dweb:/ipfs/QmPs2fic8W3F5e5zNRwmGmJFjb3JWGPWJ3YUe5o82nQgEn\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAfterPayRecordedContext.sol\":{\"keccak256\":\"0xd26c3a774ff38be79064085970454fe2603a23a638c76270d5b1b3829206c3e8\",\"urls\":[\"bzz-raw://3b55dbe3bf1ef625b7ca04efab3de35406e6041d5b3d82c7265469c500e2b702\",\"dweb:/ipfs/QmUdBDo4Lt3mcsFcsXT2mqq3czFwZjQJFPLM89YA2VtD7k\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAfterRedeemRecordedContext.sol\":{\"keccak256\":\"0x521f5d23a36f0da72362cd84890cc867bd83baa8dc836ba6c5066d51dba2f163\",\"urls\":[\"bzz-raw://6cc461313286dde62d045d6288e87bae5032e035796326f5b1ed6218e58aa9da\",\"dweb:/ipfs/QmQS2AkQwf2ANQieDuaUnpJEdXChoLv4CCbZqHkfywYPSR\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBBeforePayRecordedContext.sol\":{\"keccak256\":\"0x5b04e814da83c7e83ff892ab07eaad6abce6f7b85a75f8da9380e9fc3470bc81\",\"urls\":[\"bzz-raw://11c889aab993fce3e3cc2dedc15fc30dd367e7fef9b7b1bfd6a6a9f248781731\",\"dweb:/ipfs/QmVVtydCD1azeWhGLxA1hthxfLyKzMHZ1eVzCz3a3R5dLy\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBBeforeRedeemRecordedContext.sol\":{\"keccak256\":\"0x73eadaf6827e82f6ccbe3a1e2b2b7fc6c59cef471f73335041b30ddcc000989d\",\"urls\":[\"bzz-raw://2f3ee84662eed565dbdaed406ef836fffaf55cccd417575578152e5085d0b1f2\",\"dweb:/ipfs/QmaJGFS7hxJsiUdKvbv5BKhSwceDEzKBnt7t5YeNWvYgMK\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBCurrencyAmount.sol\":{\"keccak256\":\"0x7f321bbcbd13abfbc8f0d08a5adaaf8ef312db5bb899012fcffb6170fbb962a9\",\"urls\":[\"bzz-raw://bf9301ef1dbb3abda7b492585377617508ba048c6170f21a5e7d2b3c034eb384\",\"dweb:/ipfs/QmcetEFxSYLLNSZzPBpNn3Fc8sFcrFE8A8h12ZSj2tLgxD\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBFee.sol\":{\"keccak256\":\"0xffacd6dcce11a5cdd54aba7a5d8f9b28b9b36b87771dea746a117b616519bbd0\",\"urls\":[\"bzz-raw://c278d6efa1dd694c8aceba43b2cb3f2b49a52d9b15fc23089def526e4ba23778\",\"dweb:/ipfs/QmVHEGGAfsUVE791aGeYZBiymU6aJ278PoGmH9SRLY1U4N\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBFundAccessLimitGroup.sol\":{\"keccak256\":\"0x9fdaa8d017b72da25f583700a444a86849df053f7fb8eac874ec5139bcf651e5\",\"urls\":[\"bzz-raw://c8e44c49ee444a98424a0dbeb6897a76a0bf00d88a613f62ac2012afdac754ee\",\"dweb:/ipfs/QmdYkAiRi5bXM1YYNkc7BiqimHSFodMGn1cjHR5hcpm4xH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBPayHookSpecification.sol\":{\"keccak256\":\"0x955f0bfca97300b9e5927dc181753830ee362f83fa9ca32a90daade32aa0cfd5\",\"urls\":[\"bzz-raw://f517af1597c7c40f8d3da53f7a6684a3e162950a16559d6bf6ea3b727bb11546\",\"dweb:/ipfs/QmRWo2ZTYXmVZTzNJDYhsJNsEaHphjpUfx9eNz2cciyz86\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBPermissionsData.sol\":{\"keccak256\":\"0xd5a5fe65b1deb40b5cd9c8e05bc1352d0e95f3a18b4986fab7abdc621beb19c7\",\"urls\":[\"bzz-raw://a6141eaa414d3d61de671ae3584b87e98044bf6392cb94d2acd1bb5cc7c19db4\",\"dweb:/ipfs/QmbtvALmburKLRC5fHXscoeZii1N2qQrJAdqarfvSKaKEk\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRedeemHookSpecification.sol\":{\"keccak256\":\"0x673d16ee1a91bf8de3b37e57284e60451b70a9c2d748c9cdc7a151f5624af18f\",\"urls\":[\"bzz-raw://ceeb5e81effa0f076c5630c756dfcf1548d09f822b255a0a6ee01e54de8c8ae2\",\"dweb:/ipfs/QmSMoMNPRhPMnuJNvWa6S59XRfycGz9o2ApNp63bUW6TdX\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRuleset.sol\":{\"keccak256\":\"0xa40e937554418f9cc5949200ee64a434ece55b8e67f35d3c4c47a3dfbadaebbf\",\"urls\":[\"bzz-raw://87e1fb1b1c9ed2fe1948251ba5f839a33bb50ff5a1a6ef292aae6bbbeeb5f619\",\"dweb:/ipfs/QmUWTJPxqeHfciYT2kobif55CJLQaMHYtZFGju6LyWbv9D\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetConfig.sol\":{\"keccak256\":\"0x3d14de125bd1e4fa9dc3e20937fcc2aa666e0b9cfb63ff520189c5d27fea594a\",\"urls\":[\"bzz-raw://2c4a164ce0f4fce85e1c1d62be3497cd5d411c763d9582aad19901e9fb3c6c44\",\"dweb:/ipfs/QmXiCaWQD7NVMxE7JjuoXAEaFwKDSZtbf2beSh8mDiE1PN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetMetadata.sol\":{\"keccak256\":\"0xa19eb9f4c543da1d204589355040f68528dac2e021571a887b8a46397290786c\",\"urls\":[\"bzz-raw://edf57813fb0325d908a3cf67e6ddc3c894186591a4c13c496421928366bb359c\",\"dweb:/ipfs/QmP27aqG3ofA9Mzmk9JUp9gnSfuVfZfBWDv69jJWqeZm3F\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetWithMetadata.sol\":{\"keccak256\":\"0x1bcfadf20488f6df65227f8d4d0fbf9b7539456a2389567f7fe3900d23289bc3\",\"urls\":[\"bzz-raw://0a15c399a71e5373f8c0484c6d6b83521eda31e063a2c53e4c5cec4e74550343\",\"dweb:/ipfs/QmQwi8zkjoTVXbK89NeETYimWCacTrNsesJdpLSvGdqMPX\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplit.sol\":{\"keccak256\":\"0x0e1351e80cf9967caee90094712a4fc884a83f07df23a844d8cb33ebcd00721e\",\"urls\":[\"bzz-raw://19d5793c08834f2ec1d6942bd43d05042b0ecc351a57235d748a8f2ff74b6638\",\"dweb:/ipfs/QmUWjyNg7x62KsvMwAzNdpmwqCo5qK5ip9pLdshj9B2Kbf\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplitGroup.sol\":{\"keccak256\":\"0x8dc98fa9e730bee8bcc0a8acf1bc4db1c9b0edf307d969c9c9caa4d6b8d856d9\",\"urls\":[\"bzz-raw://66f4306e0e69c82033927952564fd617e7c4b29aa8b165d5b53a0ebe3109ea12\",\"dweb:/ipfs/QmQqN1u7FHAdEtEZNRcKvZwYtXEQVQnLd6FMzHESP7wDtx\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplitHookContext.sol\":{\"keccak256\":\"0x1cef82bf434f91d518092ea7e57db4a72ce7654f48a7db9bf44882900b6b6623\",\"urls\":[\"bzz-raw://cc5012008ab7e74cf766fe1c202a23e3a73365356bcf1e0b04ec01baf21b204b\",\"dweb:/ipfs/QmSwJvd6Yrg9XZMhjquBcak5sfUswbR5nPEuJBfpjM54VT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBTerminalConfig.sol\":{\"keccak256\":\"0x2da40b8ae2b6a6038da0ac17d3ccf083a8fb54ea12684242342e53811cca997c\",\"urls\":[\"bzz-raw://9ddb66e9f90ce3005bb1fedd06ec66e6d3e99c52afaf729cee0a23ae01b21fab\",\"dweb:/ipfs/QmPTD9ciAZqj5WWuE5W4Ufs1kBvVokntrfSdUcV6Egh7eQ\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBTokenAmount.sol\":{\"keccak256\":\"0xc61593d33d5ec30e695d382948a1b944d01e29a8f2bfd29f75ecebcdbc7816de\",\"urls\":[\"bzz-raw://8992c1e5fca0c2342ecc0e734dfba6a2a752e4c29184784931d0971e44305051\",\"dweb:/ipfs/QmYNcaW3qeCkgAExUaFTq238fgfJuoYCTwjCn7jm94U4dJ\"],\"license\":\"MIT\"},\"node_modules/@bananapus/permission-ids/src/JBPermissionIds.sol\":{\"keccak256\":\"0x1bd511f9cc46d134ab4743dba50ee25b1c67b5b5e30a27cbfebb1c3fcfedc876\",\"urls\":[\"bzz-raw://6d81d52f481c89832c9c61fa4ea513196c6c8182878d1fbef2038ca39a909192\",\"dweb:/ipfs/QmbaRR5ZXF9PRJwEGbwoAydQiYUoQLYiej7CVmHHbFG29z\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0xce41876e78d1badc0512229b4d14e4daf83bc1003d7f83978d18e0e56f965b9c\",\"urls\":[\"bzz-raw://a2608291cb038b388d80b79a06b6118a42f7894ff67b7da10ec0dbbf5b2973ba\",\"dweb:/ipfs/QmWohqcBLbcxmA4eGPhZDXe5RYMMEEpFq22nfkaUMvTfw1\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"urls\":[\"bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c\",\"dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"],\"license\":\"MIT\"},\"node_modules/@prb/math/src/Common.sol\":{\"keccak256\":\"0xaa374e2c26cc93e8c22a6953804ee05f811597ef5fa82f76824378b22944778b\",\"urls\":[\"bzz-raw://279c732e161d623cf4d8a9519ca4c42c0c2db99842d0eb2a20c10fde3fa722c9\",\"dweb:/ipfs/QmVViuUXbinQGqtG5M21SgVzKihiCbFUChd4tDhtvwRmxH\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IAllowanceTransfer.sol\":{\"keccak256\":\"0x37f0ac203b6ef605c9533e1a739477e8e9dcea90710b40e645a367f8a21ace29\",\"urls\":[\"bzz-raw://e0104d72aeaec1cd66cc232e7de7b7ead08608efcc179491b8a66387614670b0\",\"dweb:/ipfs/QmfAZDyuNC9FXXbnJUwqHNwmAK6uRrXxtWEytLsxjskPsN\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IEIP712.sol\":{\"keccak256\":\"0xfdccf2b9639070803cd0e4198427fb0df3cc452ca59bd3b8a0d957a9a4254138\",\"urls\":[\"bzz-raw://f7c936ac42ce89e827db905a1544397f8bdf46db34cdb6aa1b90dea42fdb4c72\",\"dweb:/ipfs/QmVgurxo1N31qZqkPBirw9Z7S9tLYmv6jSwQp8R8ur2cBk\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IPermit2.sol\":{\"keccak256\":\"0xaa631cc9f53e699301d94233007110a345e6779011def484e8dd97b8fe0af771\",\"urls\":[\"bzz-raw://fc0502cf19c9c18f320a3001201e89e350393b75837f6b7971de18b2de06f30d\",\"dweb:/ipfs/QmT9SfhdJ7VJNNrf94g4H5usyi7ShqWGx7Cqsz9jZTjX96\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/ISignatureTransfer.sol\":{\"keccak256\":\"0xe6df9966f8841dc3958ee86169c89de97e7f614c81c28b9dc947b12d732df64e\",\"urls\":[\"bzz-raw://3d4eafdee7f48c3be8350a94eb6edd0bfb2af2c105df65787a77174f356c0317\",\"dweb:/ipfs/QmY1j2adeeAhNpn6cUuthemxGCdLXHTfyMh9yTKsY4mZ2d\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol\":{\"keccak256\":\"0x4e64844c56061cd90e0a80de73534a9166704c43eed579eb83f90bc2780ce968\",\"urls\":[\"bzz-raw://cba4fab5cebdddf644b901994a7f0f52b98885d4c56012f4dc51d52c2bf9de0e\",\"dweb:/ipfs/QmVyyrRmqXrAiapewWunRVgiPVFJHpH2hKiE1py1svMSNV\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol\":{\"keccak256\":\"0x3f485fb1a44e8fbeadefb5da07d66edab3cfe809f0ac4074b1e54e3eb3c4cf69\",\"urls\":[\"bzz-raw://095ce0626b41318c772b3ebf19d548282607f6a8f3d6c41c13edfbd5370c8652\",\"dweb:/ipfs/QmVDZfJJ89UUCE1hMyzqpkZAtQ8jUsBgZNE5AMRG7RzRFS\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions.sol\":{\"keccak256\":\"0x9453dd0e7442188667d01d9b65de3f1e14e9511ff3e303179a15f6fc267f7634\",\"urls\":[\"bzz-raw://982f4328f956c3e60e67501e759eb292ac487f76460c774c50e9ae4fcc92aae5\",\"dweb:/ipfs/QmRnzEDsaqtd9PJEVcgQi7p5aV5pMSvRUoGZJAdwFUJxgZ\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState.sol\":{\"keccak256\":\"0xe603ac5b17ecdee73ba2b27efdf386c257a19c14206e87eee77e2017b742d9e5\",\"urls\":[\"bzz-raw://8febc9bdb399a4d94bb89f5377732652e2400e4a8dee808201ade6848f9004e7\",\"dweb:/ipfs/QmaKDqYYFU4d2W2iN77aDHptfbFmYZRrMYXHeGpJmM8C1c\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolErrors.sol\":{\"keccak256\":\"0xf80abf13fb1fafc127ba4e792f240dd8ea7c8c893978cdfd8439c27fae9a037b\",\"urls\":[\"bzz-raw://b04fc72a656bbf3631e9c2e67b9870a2d9d235185e833fe050e9606e6816a9aa\",\"dweb:/ipfs/QmUcz4bkEkJ9pwzFu1C3n97hBQ3st9U6qTAqCdyFwddKco\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents.sol\":{\"keccak256\":\"0x8071514d0fe5d17d6fbd31c191cdfb703031c24e0ece3621d88ab10e871375cd\",\"urls\":[\"bzz-raw://d0b571930cc7488b1d546a7e9cea7c52d8b3c4e207da657ed0e0db7343b8cd03\",\"dweb:/ipfs/QmaGK6vVwB95QSTR1XMYvrh7ivYAYZxi3fD7v6VMA4jZ39\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables.sol\":{\"keccak256\":\"0xf6e5d2cd1139c4c276bdbc8e1d2b256e456c866a91f1b868da265c6d2685c3f7\",\"urls\":[\"bzz-raw://b99c8c9ae8e27ee6559e5866bea82cbc9ffc8247f8d15b7422a4deb287d4d047\",\"dweb:/ipfs/QmfL8gaqt3ffAnm6nVj5ksuNpLygXuL3xq5VBqrkwC2JJ3\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions.sol\":{\"keccak256\":\"0x759b78a2918af9e99e246dc3af084f654e48ef32bb4e4cb8a966aa3dcaece235\",\"urls\":[\"bzz-raw://64144fb96e1c7fdba87305acadb98a198d26a3d46c097cb3a666e567f6f29735\",\"dweb:/ipfs/QmUnWVwN9FKB9uV5Pr8YfLpWZnYM2DENnRMaadZ492JS9u\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.sol\":{\"keccak256\":\"0x44fa2ce1182f6c2f6bead3d1737804bf7e112252ae86e0f2e92f9b8249603f43\",\"urls\":[\"bzz-raw://54154e8665b98d65f5dc91b256551852cb47882180b501b260657122d207c0ea\",\"dweb:/ipfs/QmcfemK1A2PXYrWB5SBFGERpMCderbFRb8BtTzQDj1sUBp\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/libraries/FullMath.sol\":{\"keccak256\":\"0x7825565a4bb2a34a1dc96bbfead755785dfb0df8ef81bd934c43023689685645\",\"urls\":[\"bzz-raw://8f44f4614d31e3d4864c7eb13620555253b84f6a69180f8745b7c6e246a9d125\",\"dweb:/ipfs/QmfNQUcXj3KL8h9u5PqbtEC6yRtwDbKNb48uMPjdwxsKnd\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v3-core/contracts/libraries/TickMath.sol\":{\"keccak256\":\"0x5c57de03a91cc2ec8939865dbbcb0197bb6c353b711075eefd8e0fca5e102129\",\"urls\":[\"bzz-raw://1e994c24fd891ef8a3f5dbf5eba42b34feaf05e0376a29f91322faa18054449c\",\"dweb:/ipfs/QmNdUJGUQxd1dPkMbnA5f5UNqakxRkQE5r7bTZJAuHeapS\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-periphery/contracts/libraries/OracleLibrary.sol\":{\"keccak256\":\"0xe313f89c69c0f1c91f0722868313b4ceb14479b3e7a0abf52a1b9bbd9c18e81b\",\"urls\":[\"bzz-raw://8ad09b061f3f533c116618c20cf01510108eebebb7ff8847b0f245b8ba368d53\",\"dweb:/ipfs/QmU6vdi5JjJfjK2KqonWvRg9NeuQWarj4B1YFN22Dh9VJM\"],\"license\":\"GPL-2.0-or-later\"},\"src/JBBuybackHook.sol\":{\"keccak256\":\"0x853030183c6b3b1cde459af63eef64091af5807a0475a9ef8e1c1bd79db72da8\",\"urls\":[\"bzz-raw://8173a685a0ad9b79745c0af675c52432a61431655f271f68b2493a284b23826e\",\"dweb:/ipfs/QmSkiaYnV7hsiqXrew6WYxu3SwWKCv5wg6mCGsAk3ARrhP\"],\"license\":\"MIT\"},\"src/interfaces/IJBBuybackHook.sol\":{\"keccak256\":\"0xbe5d7f3bf2e18b569676ba9194e248e6b1ed50022f5247b4f1fa124c91bfd418\",\"urls\":[\"bzz-raw://eb221d1570e8aad409c419b6a2f84351e818c3527f3f44b806cd64c84d7a8c86\",\"dweb:/ipfs/QmUPZstaKjPN7VTywg3Mt6bF75E53mQbmXhf3TxCggJbRR\"],\"license\":\"MIT\"},\"src/interfaces/external/IWETH9.sol\":{\"keccak256\":\"0x50083bcaca6c1a8d12c79116fab4f6d8cd452a510cb3f00c4a8bc3a54678efb7\",\"urls\":[\"bzz-raw://726f187112d0953c14bff8099a8c9ce1ead47eb25e90839f77b100feaaf16127\",\"dweb:/ipfs/QmTEnMENpLjcTQLMwz4kEUiQHfiTkaZT3TL37nQ8JiRYh5\"],\"license\":\"GPL-2.0-or-later\"}},\"version\":1}", + "metadata": "{\"compiler\":{\"version\":\"0.8.23+commit.f704f362\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IWETH9\",\"name\":\"weth\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"factory\",\"type\":\"address\"},{\"internalType\":\"contract IJBDirectory\",\"name\":\"directory\",\"type\":\"address\"},{\"internalType\":\"contract IJBController\",\"name\":\"controller\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InsufficientPayAmount\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InvalidTwapSlippageTolerance\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"InvalidTwapWindow\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"NoProjectToken\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"x\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"y\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"denominator\",\"type\":\"uint256\"}],\"type\":\"error\",\"name\":\"PRBMath_MulDiv_Overflow\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"PoolAlreadySet\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"SpecifiedSlippageExceeded\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"T\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"UNAUTHORIZED\"},{\"inputs\":[],\"type\":\"error\",\"name\":\"Unauthorized\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"tokenCount\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"Mint\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\",\"indexed\":true},{\"internalType\":\"address\",\"name\":\"newPool\",\"type\":\"address\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"PoolAdded\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"amountIn\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"pool\",\"type\":\"address\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"amountOut\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"Swap\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"oldTwapTolerance\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"newTwapTolerance\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"TwapSlippageToleranceChanged\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\",\"indexed\":true},{\"internalType\":\"uint256\",\"name\":\"oldSecondsAgo\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"uint256\",\"name\":\"newSecondsAgo\",\"type\":\"uint256\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"TwapWindowChanged\",\"anonymous\":false},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"CONTROLLER\",\"outputs\":[{\"internalType\":\"contract IJBController\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"DIRECTORY\",\"outputs\":[{\"internalType\":\"contract IJBDirectory\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MAX_TWAP_SLIPPAGE_TOLERANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MAX_TWAP_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MIN_TWAP_SLIPPAGE_TOLERANCE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"MIN_TWAP_WINDOW\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"PERMISSIONS\",\"outputs\":[{\"internalType\":\"contract IJBPermissions\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"PROJECTS\",\"outputs\":[{\"internalType\":\"contract IJBProjects\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"TWAP_SLIPPAGE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"UNISWAP_V3_FACTORY\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"WETH\",\"outputs\":[{\"internalType\":\"contract IWETH9\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"struct JBAfterPayRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"amount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"forwardedAmount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"projectTokenCount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"hookMetadata\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"payerMetadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"payable\",\"type\":\"function\",\"name\":\"afterPayRecordedWith\"},{\"inputs\":[{\"internalType\":\"struct JBBeforePayRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"terminal\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"amount\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"beneficiary\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reservedPercent\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"beforePayRecordedWith\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"weight\",\"type\":\"uint256\"},{\"internalType\":\"struct JBPayHookSpecification[]\",\"name\":\"hookSpecifications\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"contract IJBPayHook\",\"name\":\"hook\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}]},{\"inputs\":[{\"internalType\":\"struct JBBeforeRedeemRecordedContext\",\"name\":\"context\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"terminal\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"holder\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rulesetId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"redeemCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalSupply\",\"type\":\"uint256\"},{\"internalType\":\"struct JBTokenAmount\",\"name\":\"surplus\",\"type\":\"tuple\",\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"currency\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}]},{\"internalType\":\"bool\",\"name\":\"useTotalSurplus\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"redemptionRate\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"beforeRedeemRecordedWith\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"struct JBRedeemHookSpecification[]\",\"name\":\"hookSpecifications\",\"type\":\"tuple[]\",\"components\":[{\"internalType\":\"contract IJBRedeemHook\",\"name\":\"hook\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"metadata\",\"type\":\"bytes\"}]}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"hasMintPermissionFor\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"poolOf\",\"outputs\":[{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"projectTokenOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint24\",\"name\":\"fee\",\"type\":\"uint24\"},{\"internalType\":\"uint32\",\"name\":\"twapWindow\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"twapSlippageTolerance\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"terminalToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setPoolFor\",\"outputs\":[{\"internalType\":\"contract IUniswapV3Pool\",\"name\":\"newPool\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newSlippageTolerance\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setTwapSlippageToleranceOf\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"newWindow\",\"type\":\"uint32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"setTwapWindowOf\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\",\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"twapSlippageToleranceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}]},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"projectId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\",\"name\":\"twapWindowOf\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}]},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"amount0Delta\",\"type\":\"int256\"},{\"internalType\":\"int256\",\"name\":\"amount1Delta\",\"type\":\"int256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"uniswapV3SwapCallback\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"afterPayRecordedWith((address,uint256,uint256,(address,uint8,uint32,uint256),(address,uint8,uint32,uint256),uint256,uint256,address,bytes,bytes))\":{\"details\":\"This function is only called if the minimum return from the swap exceeds the return from minting by paying the project. If the swap reverts (due to slippage, insufficient liquidity, or something else), then the hook mints the number of tokens which a payment to the project would have minted.\",\"params\":{\"context\":\"The pay context passed in by the terminal.\"}},\"beforePayRecordedWith((address,address,(address,uint8,uint32,uint256),uint256,uint256,address,uint256,uint256,bytes))\":{\"params\":{\"context\":\"Payment context passed to the data hook by `terminalStore.recordPaymentFrom(...)`. `context.metadata` can specify a Uniswap quote and specify how much of the payment should be used to swap. If `context.metadata` does not specify a quote, one will be calculated based on the TWAP. If `context.metadata` does not specify how much of the payment should be used, the hook uses the full amount paid in.\"},\"returns\":{\"hookSpecifications\":\"Specifications containing pay hooks, as well as the amount and metadata to send to them. Fulfilled by the terminal. If tokens are only being minted, `hookSpecifications` will be empty.\",\"weight\":\"The weight to use. If tokens are being minted from the project, this is the original weight. If tokens are being bought from the pool, the weight is 0. If tokens are being minted AND bought from the pool, this weight is adjusted to take both into account.\"}},\"beforeRedeemRecordedWith((address,address,uint256,uint256,uint256,uint256,(address,uint8,uint32,uint256),bool,uint256,bytes))\":{\"details\":\"Pass redeem context back to the terminal without changes.\",\"params\":{\"context\":\"The redeem context passed in by the terminal.\"}},\"constructor\":{\"params\":{\"controller\":\"The controller used to mint and burn tokens.\",\"directory\":\"The directory of terminals and controllers.\",\"factory\":\"The address of the Uniswap v3 factory. Used to calculate pool addresses.\",\"weth\":\"The WETH contract.\"}},\"setPoolFor(uint256,uint24,uint32,uint256,address)\":{\"details\":\"Uses create2 for callback auth and to allow adding pools which haven't been deployed yet. This can be called by the project's owner or an address which has the `JBPermissionIds.SET_BUYBACK_POOL` permission from the owner.\",\"params\":{\"fee\":\"The fee used in the pool being set, as a fixed-point number of basis points with 2 decimals. A 0.01% fee is `100`, a 0.05% fee is `500`, a 0.3% fee is `3000`, and a 1% fee is `10000`.\",\"projectId\":\"The ID of the project to set the pool for.\",\"terminalToken\":\"The address of the terminal token that payments to the project are made in.\",\"twapSlippageTolerance\":\"The maximum spread allowed between the amount received and the TWAP.\",\"twapWindow\":\"The period of time over which the TWAP is computed.\"},\"returns\":{\"newPool\":\"The pool that was set for the project and terminal token.\"}},\"setTwapSlippageToleranceOf(uint256,uint256)\":{\"details\":\"This can be called by the project's owner or an address with `JBPermissionIds.SET_BUYBACK_TWAP` permission from the owner.\",\"params\":{\"newSlippageTolerance\":\"The new TWAP slippage tolerance, out of `TWAP_SLIPPAGE_DENOMINATOR`.\",\"projectId\":\"The ID of the project to set the TWAP slippage tolerance of.\"}},\"setTwapWindowOf(uint256,uint32)\":{\"details\":\"This can be called by the project's owner or an address with `JBPermissionIds.SET_BUYBACK_TWAP` permission from the owner.\",\"params\":{\"newWindow\":\"The new TWAP window.\",\"projectId\":\"The ID of the project to set the TWAP window of.\"}},\"supportsInterface(bytes4)\":{\"details\":\"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.\"},\"twapSlippageToleranceOf(uint256)\":{\"details\":\"The \\\"TWAP slippage tolerance\\\" is the maximum negative spread between the TWAP and the expected return from a swap. If the expected return unfavourably exceeds the TWAP slippage tolerance, the swap will revert.\",\"params\":{\"projectId\":\"The ID of the project which the TWAP slippage tolerance applies to.\"},\"returns\":{\"_0\":\"tolerance The maximum slippage allowed relative to the TWAP, as a percent out of `TWAP_SLIPPAGE_DENOMINATOR`.\"}},\"twapWindowOf(uint256)\":{\"details\":\"The \\\"TWAP window\\\" is the period over which the TWAP is computed.\",\"params\":{\"projectId\":\"The ID of the project which the TWAP window applies to.\"},\"returns\":{\"_0\":\"secondsAgo The TWAP window in seconds.\"}},\"uniswapV3SwapCallback(int256,int256,bytes)\":{\"params\":{\"amount0Delta\":\"The amount of token 0 being used for the swap.\",\"amount1Delta\":\"The amount of token 1 being used for the swap.\",\"data\":\"Data passed in by the swap operation.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"CONTROLLER()\":{\"notice\":\"The controller used to mint and burn tokens.\"},\"DIRECTORY()\":{\"notice\":\"The directory of terminals and controllers.\"},\"MAX_TWAP_SLIPPAGE_TOLERANCE()\":{\"notice\":\"Projects cannot specify a TWAP slippage tolerance larger than this constant (out of `MAX_SLIPPAGE`).\"},\"MAX_TWAP_WINDOW()\":{\"notice\":\"Projects cannot specify a TWAP window longer than this constant.\"},\"MIN_TWAP_SLIPPAGE_TOLERANCE()\":{\"notice\":\"Projects cannot specify a TWAP slippage tolerance smaller than this constant (out of `MAX_SLIPPAGE`).\"},\"MIN_TWAP_WINDOW()\":{\"notice\":\"Projects cannot specify a TWAP window shorter than this constant.\"},\"PERMISSIONS()\":{\"notice\":\"A contract storing permissions.\"},\"PROJECTS()\":{\"notice\":\"The project registry.\"},\"TWAP_SLIPPAGE_DENOMINATOR()\":{\"notice\":\"The denominator used when calculating TWAP slippage percent values.\"},\"UNISWAP_V3_FACTORY()\":{\"notice\":\"The address of the Uniswap v3 factory. Used to calculate pool addresses.\"},\"WETH()\":{\"notice\":\"The wETH contract.\"},\"afterPayRecordedWith((address,uint256,uint256,(address,uint8,uint32,uint256),(address,uint8,uint32,uint256),uint256,uint256,address,bytes,bytes))\":{\"notice\":\"Swap the specified amount of terminal tokens for project tokens, using any leftover terminal tokens to mint from the project.\"},\"beforePayRecordedWith((address,address,(address,uint8,uint32,uint256),uint256,uint256,address,uint256,uint256,bytes))\":{\"notice\":\"The `IJBRulesetDataHook` implementation which determines whether tokens should be minted from the project or bought from the pool.\"},\"beforeRedeemRecordedWith((address,address,uint256,uint256,uint256,uint256,(address,uint8,uint32,uint256),bool,uint256,bytes))\":{\"notice\":\"To fulfill the `IJBRulesetDataHook` interface.\"},\"hasMintPermissionFor(uint256,address)\":{\"notice\":\"Required by the `IJBRulesetDataHook` interfaces. Return false to not leak any permissions.\"},\"poolOf(uint256,address)\":{\"notice\":\"The Uniswap pool where a given project's token and terminal token pair are traded.\"},\"projectTokenOf(uint256)\":{\"notice\":\"The address of each project's token.\"},\"setPoolFor(uint256,uint24,uint32,uint256,address)\":{\"notice\":\"Set the pool to use for a given project and terminal token (the default for the project's token <-> terminal token pair).\"},\"setTwapSlippageToleranceOf(uint256,uint256)\":{\"notice\":\"Set the TWAP slippage tolerance for a project. The TWAP slippage tolerance is the maximum spread allowed between the amount received and the TWAP.\"},\"setTwapWindowOf(uint256,uint32)\":{\"notice\":\"Change the TWAP window for a project. The TWAP window is the period of time over which the TWAP is computed.\"},\"twapSlippageToleranceOf(uint256)\":{\"notice\":\"Get the TWAP slippage tolerance for a given project ID.\"},\"twapWindowOf(uint256)\":{\"notice\":\"Get the TWAP window for a given project ID.\"},\"uniswapV3SwapCallback(int256,int256,bytes)\":{\"notice\":\"The Uniswap v3 pool callback where the token transfer is expected to happen.\"}},\"version\":1}},\"settings\":{\"remappings\":[\"@bananapus/=node_modules/@bananapus/\",\"@chainlink/=node_modules/@chainlink/\",\"@eth-optimism/=node_modules/@eth-optimism/\",\"@exhausted-pigeon/=node_modules/@exhausted-pigeon/\",\"@openzeppelin/=node_modules/@openzeppelin/\",\"@prb/=node_modules/@prb/\",\"@scroll-tech/=node_modules/@scroll-tech/\",\"@sphinx-labs/contracts/=node_modules/@sphinx-labs/contracts/contracts/foundry/\",\"@uniswap/=node_modules/@uniswap/\",\"base64-sol/=node_modules/base64-sol/\",\"ds-test/=lib/forge-std/lib/ds-test/src/\",\"forge-std/=lib/forge-std/src/\",\"hardhat/=node_modules/hardhat/\",\"solmate/=node_modules/solmate/\",\"sphinx/=lib/sphinx/packages/contracts/contracts/forge-std/src/\"],\"optimizer\":{\"enabled\":true,\"runs\":100000000},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"compilationTarget\":{\"src/JBBuybackHook.sol\":\"JBBuybackHook\"},\"evmVersion\":\"paris\",\"libraries\":{}},\"sources\":{\"node_modules/@bananapus/core/src/abstract/JBPermissioned.sol\":{\"keccak256\":\"0x6486c11bff6384bfa938feb7aaacc977f457abff25b17b9aa094077d3fef71f8\",\"urls\":[\"bzz-raw://8b5190202326b6499391d5128cdb2d9ff44e91cd9ba6d8a5fe01e6f21259270d\",\"dweb:/ipfs/QmR2ufPwHtCAZYkJoyWyyag6BfdaWpaLk7VhuDc6BRLqVe\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/enums/JBApprovalStatus.sol\":{\"keccak256\":\"0x61c69b6bac7d24b566d87cda23a77e4ca9cdb87200b106aba8534cb9a0973e33\",\"urls\":[\"bzz-raw://6a9ca7249de76f77a8252eefe6bd1b63d47952f25a2acfa2c8db967cdff4470c\",\"dweb:/ipfs/QmaxSxptRQNj8bNy96EreENmrnRWdKmhyihBcxyWzBX5BN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBController.sol\":{\"keccak256\":\"0xfd338e99bf942083bbf2170a147786585a0f4bcf54815b78cc13ff68cc8d6ded\",\"urls\":[\"bzz-raw://cdcaf5d032173a02e75ba63b334e002347d7a7641f1ea208e6de91f416ac6780\",\"dweb:/ipfs/QmNqHwbBrpvYAGdbhhKvdpKn5nnZMRMUXX4N465Cj4TtAq\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBDirectory.sol\":{\"keccak256\":\"0x9cc380844aef60078ee47a61861e55a29c4a8c947efd556ebd36e6909f7b9d62\",\"urls\":[\"bzz-raw://9f5190ec8b6683d9781ee6e9eedcc91294753242748875d4a06349077e4cbaaf\",\"dweb:/ipfs/QmTQrPuXT9TCA4txwrperMeXSGvGxP8iokUK47f62F388i\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBDirectoryAccessControl.sol\":{\"keccak256\":\"0x1e67f56849320a46f834aaa9bd62b170ff8ada7b224b4a81136193740fa0be4d\",\"urls\":[\"bzz-raw://ea8fbcec44abfe49d137bcae129b67e5479d6b17879301f88534c8a7fab00be4\",\"dweb:/ipfs/QmT6wrtYX4GRpffHUzupNwYebJ1dqkkKZLEewWsoyunsqw\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFeeTerminal.sol\":{\"keccak256\":\"0xdb6f3349cbe2078faa8421dec892136693748d8a60b70a1dee3bce2cfc5274fc\",\"urls\":[\"bzz-raw://ccc6a67fc72726c6180c41523cc2a43562864347770a86ff54532fb6ca09e7c3\",\"dweb:/ipfs/QmZinV1LoRsmTq713YGvNShaPtGaxLqwJ6u2EwwGKEKCgu\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFeelessAddresses.sol\":{\"keccak256\":\"0xe5df42cfa71c5fa41b905c122de5825df13c2aab2f9cc4cf4bafa331dd69c27e\",\"urls\":[\"bzz-raw://3773bf3b42cc57d1e4086147e52135ff1dbff4309c45ca0398f821dfaa071563\",\"dweb:/ipfs/QmXUEJssHaxYKfV33tMZGf81JTR5a5yxEVshzNus84xLuT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBFundAccessLimits.sol\":{\"keccak256\":\"0xf5fd6bdd723b60d490ccbe22cdf1cfe43663d23e6ee48badcd1b71e3282cb16b\",\"urls\":[\"bzz-raw://fe692f0b843ea5fccdfcb68f4ec16e1c0add945bb74b303c9866342be0e31fbf\",\"dweb:/ipfs/QmSRmzpgp3DhNEhNDiLsSu7yEiTeywbzEFbwyGyDazjgKt\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBMultiTerminal.sol\":{\"keccak256\":\"0xc7b4f5043ec5733f5b303688f3dbf475ef5f6fe12364847a538c8b48a2137fb7\",\"urls\":[\"bzz-raw://fcd1b41a2acfd035e285e6f20f983b9b00a4e00c688a3072062dfb7f5c9c5afe\",\"dweb:/ipfs/QmYCfjakBGxWWTvb5Pk9UAeguwiWrnsNviQWMsaYz7Xq5N\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPayHook.sol\":{\"keccak256\":\"0x9438866782c652c2942f4d114e35f393cd3c8b0334abce8387eed90bca35e8b2\",\"urls\":[\"bzz-raw://cfd99daf57213f92325aad7d7d16e98476d38e870470e95ba01e3ae3cdecc95d\",\"dweb:/ipfs/QmUKKAVGf7ki8BHksr99tFcRW8APveeB5tNH63ctTbbCW8\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPayoutTerminal.sol\":{\"keccak256\":\"0xd0f9374470591c4afb2525c9c7b1bdad577765857c404b22ee5d8d2997a18fad\",\"urls\":[\"bzz-raw://4529c066b2014ee64b8fb16981a9fd5badf64dea7ac6c07dd1b1e7ab5cdc1d8a\",\"dweb:/ipfs/QmYxTdPjRAZ8iThUoNmJuivEaRaB3xXpyHdhCU7my1UHZy\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermissioned.sol\":{\"keccak256\":\"0x5b038d4dee116584e88b230920e56d48e135053e3f7e5642eaea14a775c1dad7\",\"urls\":[\"bzz-raw://19e43102f349fd4a1da1c0943ffb8f2950007fe4bb4bb7e8f74fc142575d091b\",\"dweb:/ipfs/QmXHAt4KzDTdDZgDDefEXH2WKi7NcfkJb9R7nxW5uDqsNp\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermissions.sol\":{\"keccak256\":\"0x49d2b91a866004af098a6770b28040071885b048b4b50744b12a1e5b212c5e5e\",\"urls\":[\"bzz-raw://089b4dda50be91412ffe1fbe333f78cc894f073c1a7afe469f10a2cee12fbf9e\",\"dweb:/ipfs/QmYPPBZ6HwBa1RNkNGqGcR2xgj4fnWBzrPHHoJG3kZA6AN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPermitTerminal.sol\":{\"keccak256\":\"0xd6bd30842273f5b794f82219fefdd4953f5343328d2cfdb684b7d826cc0c769c\",\"urls\":[\"bzz-raw://ca1195fd5572060b36fc7e45f46d59f974e3a908248edcfadeb8cb06247075f0\",\"dweb:/ipfs/QmYTpDXKTXqi8GQFsNqB8LiGFTZjSPY3PA8vKqZBraVdqD\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPriceFeed.sol\":{\"keccak256\":\"0x4bd84c0f1a5d4729ed709bcddd43f4c50ec4a165ece79780af8dce482ed07d4a\",\"urls\":[\"bzz-raw://62bac4bfb6982fb002f620c77e5c445e62d50241a5aa64a07e51d929f5a42180\",\"dweb:/ipfs/QmWgJUDreVY2BuMX38a1iUUR5kNbMwGnKG3VvurB7oZtuM\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBPrices.sol\":{\"keccak256\":\"0xa4988a8984774e9f9d355236e3c4ab67868503964747684d989ceb54a4176361\",\"urls\":[\"bzz-raw://7496393b49f8a594e6bc3393ffab118e4dc95f69233c77046cd552b1c52a533a\",\"dweb:/ipfs/QmavDESpty7XFmLgWKMHb3venZVPGwwKevWmYStM2mxcPH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBProjectUriRegistry.sol\":{\"keccak256\":\"0x2799475228987e4f8334ac33d3935f759c9b8133db7383b4f622dde7a5dc0502\",\"urls\":[\"bzz-raw://d751731740f45df74eea48c9667e847ee2cddb2980ab4939c86bd17e6c6ed89b\",\"dweb:/ipfs/QmXW8SLTuhdUpfn7pRpdsYdcyuim8RTyagU37ULcj5UZhT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBProjects.sol\":{\"keccak256\":\"0x735c2fb8f1fa827f054ee77f7a0ae4b312656217acb75b624d2c8fd9dc40151b\",\"urls\":[\"bzz-raw://ee7fc92299a8633a80693ae63ab494dcd125f1789487a54a39dc0e5696e5996f\",\"dweb:/ipfs/QmX7YJD4pS2XhgQb7p3JbBAXynT7YGPXcZe92BiWWRrsCL\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRedeemHook.sol\":{\"keccak256\":\"0x8ab46fcd7d0e739661eb76056ad93ff99106f38420ef0b4eb97fa9f4bb71a68a\",\"urls\":[\"bzz-raw://0ef96fcb7ad26281d444d8e0c677b25114fdd63b1c172d477e030dce8ba53b62\",\"dweb:/ipfs/Qmcx1jRQuwU4pZFuLxsSsx4oMbRaDfktHrPnXextgbWc5m\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRedeemTerminal.sol\":{\"keccak256\":\"0xd1b4aa38154e08f1474745ea6bc8f8823fe8aa68c124d596742597f2296ea16d\",\"urls\":[\"bzz-raw://9bd254e833702dfe5e28db5fee76478947ab45b501c966501f719e73bbf0397a\",\"dweb:/ipfs/QmZ3Ng7TmVxL6ozSUhx4kYdQdZhoYi4t43cYZVAMz7Fn5M\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesetApprovalHook.sol\":{\"keccak256\":\"0x592e95d159494421c6b1bcb362d0cee1df0132921697351304e9cd7af4fbd386\",\"urls\":[\"bzz-raw://5bebfd5fa67c1b6ea16fa2e76e9520e9dfe52a579f48dd94d0c2ec45f78ad178\",\"dweb:/ipfs/QmRUawEGtfYoYSHmHELGhvJoWuMsxLPKtqAXgsrb7fJboP\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesetDataHook.sol\":{\"keccak256\":\"0x13b4b9f4b847f62442da1c1a59b399f8f201b31a28edb96aa5a8a78ad57c24d0\",\"urls\":[\"bzz-raw://4fcd00b77d0f40cf6d5ee6590b6ef4ee1f606e89ae4c4faed3710fb462108f8e\",\"dweb:/ipfs/QmeoE54DQ3eGw9EDXfN7aTMmEjubAtirahmytDijo6GSeE\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBRulesets.sol\":{\"keccak256\":\"0x552a9bc990fa47026c89defa6dd112675ee4ef13a9e38f72577e3c0c222f2a8f\",\"urls\":[\"bzz-raw://4fc8638720bac7feb191b8b4ffb4fa08c56a951924fc058561663633973235e2\",\"dweb:/ipfs/QmawYWj5syRvZ2miLQ8WT42AXsuTCH5Fm9Gmq1Rege2mKF\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBSplitHook.sol\":{\"keccak256\":\"0xeb8dfac7a4b81897a1c3b5d0d853a406bcff33720fb187d5ca5bb3dcc0ba3a12\",\"urls\":[\"bzz-raw://36aaeef6107cfe5b0127e063ea215aac7200f8af02e28a48e61111abd3254688\",\"dweb:/ipfs/QmQ8yQANXnhQCAWBGKsKCDsJ3A8hnTKNg5tyo79GfWXTcV\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBSplits.sol\":{\"keccak256\":\"0xd8894cfc55560d914f413e40c981165e1e9dc845b35cdf0ecd13fd118733a483\",\"urls\":[\"bzz-raw://e03b8e5e34c924a91884e3ef79ea039292f8927241698db84a09a463ced4cc52\",\"dweb:/ipfs/QmSqhVX2LSStR7xEcc96zAiQpTPDSsZBn8YvH33CtiU1FN\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTerminal.sol\":{\"keccak256\":\"0x8981b96902125707c49c63867b718118fdfb04cb8fd42b038d93ef87ea56f85c\",\"urls\":[\"bzz-raw://7b172c6924a10431652eab136758953a51af8d709a55afff1533d13e687be60c\",\"dweb:/ipfs/QmWczAk48Jw8qNgrUn4EFRK25CrmCp7MmEaJsGtTXueaEb\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTerminalStore.sol\":{\"keccak256\":\"0x140159d66d729f6aeed0fe1f7c655619985146ec00e8c68cbd9b5d30d4dc7d23\",\"urls\":[\"bzz-raw://f972ecb52bcfcd2852c9e7264b1ecc504ce94bd6e12c034b93c1768cd372954e\",\"dweb:/ipfs/QmRu7in5iJSWHLTcFPbJmiK1rCHFbwNY7qzY4cG6kgfYcr\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBToken.sol\":{\"keccak256\":\"0x71b1f9c3a0edd41910f77396e0be2c65596571176d53eb87e887c3c0da56c0fb\",\"urls\":[\"bzz-raw://6e956f0582f4525e83d845ee9b4a89959abc4f821414f6accbbee5b38960482d\",\"dweb:/ipfs/QmbSvjgmCgnfVmcCTGu8XwrV1Rufsf3M8hB8unFq6fTMdH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTokenUriResolver.sol\":{\"keccak256\":\"0xfa5cb00dcd6085d1ef912d071fe73c63f9478a2cd0f9d8bddaf659b6af2d0967\",\"urls\":[\"bzz-raw://282e4e7c342d65f77cde0e9a08fcaf20ef5cf379c7a48b639842c0ffd0b2afb8\",\"dweb:/ipfs/QmbnN3PEQeZaXdPLT75V1J79kMg7KqSMru37RHrL3z8Yf2\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/interfaces/IJBTokens.sol\":{\"keccak256\":\"0x6fd67af915dd541d9547c8297aa9ae269690e4ee23531db43f021bcacec6076f\",\"urls\":[\"bzz-raw://2e5e11954e9ab2319fffccb6563f3db400b8f7760d4ffe2165048a02c9c37fa6\",\"dweb:/ipfs/QmbDXtV83dK8EfiTjsTRf55R2XqPZzDKcjtYbW8sxQ5CFm\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/libraries/JBConstants.sol\":{\"keccak256\":\"0x822bef715c9d5803208a2e02f8d14e0ffdb1fb2ea84698c30fd801103be4a3d2\",\"urls\":[\"bzz-raw://476c87d74e31cd43419cce01551158993c311ac47ba5fad5768e26054b3c8a91\",\"dweb:/ipfs/QmdpxoGU6suZAm9FS7R47AwSmHEFjwmf6v56WrfZM4QkJc\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/libraries/JBMetadataResolver.sol\":{\"keccak256\":\"0xdf32038c5e7f65725e2ef87d09fe04972d7da6a63b60c066d4616b2c2ada5149\",\"urls\":[\"bzz-raw://50582c41ee196ead31d13dcc5a468436d524891d7873743ba92d1d64a0b5783a\",\"dweb:/ipfs/QmPiJMbA1oQnVKQTjqYvUvtWaaiFCeKic8NJtu2crrAznW\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAccountingContext.sol\":{\"keccak256\":\"0x9c47e048a719f784f601df69a583505432217b9868a0244876d277f84dd1ebdf\",\"urls\":[\"bzz-raw://8565f194b87914da9a02af2e760ae2ed2a9d185c6f11229f7035140776d2fec9\",\"dweb:/ipfs/QmPs2fic8W3F5e5zNRwmGmJFjb3JWGPWJ3YUe5o82nQgEn\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAfterPayRecordedContext.sol\":{\"keccak256\":\"0xd26c3a774ff38be79064085970454fe2603a23a638c76270d5b1b3829206c3e8\",\"urls\":[\"bzz-raw://3b55dbe3bf1ef625b7ca04efab3de35406e6041d5b3d82c7265469c500e2b702\",\"dweb:/ipfs/QmUdBDo4Lt3mcsFcsXT2mqq3czFwZjQJFPLM89YA2VtD7k\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBAfterRedeemRecordedContext.sol\":{\"keccak256\":\"0x521f5d23a36f0da72362cd84890cc867bd83baa8dc836ba6c5066d51dba2f163\",\"urls\":[\"bzz-raw://6cc461313286dde62d045d6288e87bae5032e035796326f5b1ed6218e58aa9da\",\"dweb:/ipfs/QmQS2AkQwf2ANQieDuaUnpJEdXChoLv4CCbZqHkfywYPSR\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBBeforePayRecordedContext.sol\":{\"keccak256\":\"0xbc98b968d84be2f0ddbb24240723c7179ec9c5e02e5fbd5843dd0e76623a3ea5\",\"urls\":[\"bzz-raw://1310e522696a9fc6f7f96b04c293fab3b4cf1e722bdbb7aa1eec7b3ecc25402f\",\"dweb:/ipfs/QmTYiijDJRuQcMhLrmpbHzHAQFPq6jurPP5HjyYtnzbpnK\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBBeforeRedeemRecordedContext.sol\":{\"keccak256\":\"0x73eadaf6827e82f6ccbe3a1e2b2b7fc6c59cef471f73335041b30ddcc000989d\",\"urls\":[\"bzz-raw://2f3ee84662eed565dbdaed406ef836fffaf55cccd417575578152e5085d0b1f2\",\"dweb:/ipfs/QmaJGFS7hxJsiUdKvbv5BKhSwceDEzKBnt7t5YeNWvYgMK\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBCurrencyAmount.sol\":{\"keccak256\":\"0x7f321bbcbd13abfbc8f0d08a5adaaf8ef312db5bb899012fcffb6170fbb962a9\",\"urls\":[\"bzz-raw://bf9301ef1dbb3abda7b492585377617508ba048c6170f21a5e7d2b3c034eb384\",\"dweb:/ipfs/QmcetEFxSYLLNSZzPBpNn3Fc8sFcrFE8A8h12ZSj2tLgxD\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBFee.sol\":{\"keccak256\":\"0xffacd6dcce11a5cdd54aba7a5d8f9b28b9b36b87771dea746a117b616519bbd0\",\"urls\":[\"bzz-raw://c278d6efa1dd694c8aceba43b2cb3f2b49a52d9b15fc23089def526e4ba23778\",\"dweb:/ipfs/QmVHEGGAfsUVE791aGeYZBiymU6aJ278PoGmH9SRLY1U4N\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBFundAccessLimitGroup.sol\":{\"keccak256\":\"0x9fdaa8d017b72da25f583700a444a86849df053f7fb8eac874ec5139bcf651e5\",\"urls\":[\"bzz-raw://c8e44c49ee444a98424a0dbeb6897a76a0bf00d88a613f62ac2012afdac754ee\",\"dweb:/ipfs/QmdYkAiRi5bXM1YYNkc7BiqimHSFodMGn1cjHR5hcpm4xH\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBPayHookSpecification.sol\":{\"keccak256\":\"0x955f0bfca97300b9e5927dc181753830ee362f83fa9ca32a90daade32aa0cfd5\",\"urls\":[\"bzz-raw://f517af1597c7c40f8d3da53f7a6684a3e162950a16559d6bf6ea3b727bb11546\",\"dweb:/ipfs/QmRWo2ZTYXmVZTzNJDYhsJNsEaHphjpUfx9eNz2cciyz86\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBPermissionsData.sol\":{\"keccak256\":\"0xd5a5fe65b1deb40b5cd9c8e05bc1352d0e95f3a18b4986fab7abdc621beb19c7\",\"urls\":[\"bzz-raw://a6141eaa414d3d61de671ae3584b87e98044bf6392cb94d2acd1bb5cc7c19db4\",\"dweb:/ipfs/QmbtvALmburKLRC5fHXscoeZii1N2qQrJAdqarfvSKaKEk\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRedeemHookSpecification.sol\":{\"keccak256\":\"0x673d16ee1a91bf8de3b37e57284e60451b70a9c2d748c9cdc7a151f5624af18f\",\"urls\":[\"bzz-raw://ceeb5e81effa0f076c5630c756dfcf1548d09f822b255a0a6ee01e54de8c8ae2\",\"dweb:/ipfs/QmSMoMNPRhPMnuJNvWa6S59XRfycGz9o2ApNp63bUW6TdX\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRuleset.sol\":{\"keccak256\":\"0x03ad7bd257d4ac55ecc42b85156dce1c70eec8572dbf8feb093c033912f305e7\",\"urls\":[\"bzz-raw://9665b4c018cd469f94bec4471222cc9e5fd58ac421a0959f70e72618fe37d55b\",\"dweb:/ipfs/QmSUf6HQv2Ckcoy5tSH1UPdD8vDMerfK29G8kaxmxB3Kow\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetConfig.sol\":{\"keccak256\":\"0x7a57ed3d73bd9457d8e1fb40f5204c364df87cbfdbf42412d5bbc08beabb49c9\",\"urls\":[\"bzz-raw://8b9a83916ee67d32b5f434b35b171c6122bbc4efeaa4fabb8dec2ca4e9e32c6e\",\"dweb:/ipfs/QmNquzUQn6ZvE2wBcMCgru3resV9UNvBWPPetyDChoh8vM\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetMetadata.sol\":{\"keccak256\":\"0xfb3601c74af59891c7a22eb33110170bbd57e3958130961704ea20cede4202cc\",\"urls\":[\"bzz-raw://fbebf88cdf5fe93aa6eae665e5a5ea277dd3d5b703afbc732fb20e3d3a1d3f0a\",\"dweb:/ipfs/QmWMBjpmNVUePZZaBPKLUP7zX1f49re55ruhLCeFx1zx9A\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBRulesetWithMetadata.sol\":{\"keccak256\":\"0x1bcfadf20488f6df65227f8d4d0fbf9b7539456a2389567f7fe3900d23289bc3\",\"urls\":[\"bzz-raw://0a15c399a71e5373f8c0484c6d6b83521eda31e063a2c53e4c5cec4e74550343\",\"dweb:/ipfs/QmQwi8zkjoTVXbK89NeETYimWCacTrNsesJdpLSvGdqMPX\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplit.sol\":{\"keccak256\":\"0x0e1351e80cf9967caee90094712a4fc884a83f07df23a844d8cb33ebcd00721e\",\"urls\":[\"bzz-raw://19d5793c08834f2ec1d6942bd43d05042b0ecc351a57235d748a8f2ff74b6638\",\"dweb:/ipfs/QmUWjyNg7x62KsvMwAzNdpmwqCo5qK5ip9pLdshj9B2Kbf\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplitGroup.sol\":{\"keccak256\":\"0x8dc98fa9e730bee8bcc0a8acf1bc4db1c9b0edf307d969c9c9caa4d6b8d856d9\",\"urls\":[\"bzz-raw://66f4306e0e69c82033927952564fd617e7c4b29aa8b165d5b53a0ebe3109ea12\",\"dweb:/ipfs/QmQqN1u7FHAdEtEZNRcKvZwYtXEQVQnLd6FMzHESP7wDtx\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBSplitHookContext.sol\":{\"keccak256\":\"0x1cef82bf434f91d518092ea7e57db4a72ce7654f48a7db9bf44882900b6b6623\",\"urls\":[\"bzz-raw://cc5012008ab7e74cf766fe1c202a23e3a73365356bcf1e0b04ec01baf21b204b\",\"dweb:/ipfs/QmSwJvd6Yrg9XZMhjquBcak5sfUswbR5nPEuJBfpjM54VT\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBTerminalConfig.sol\":{\"keccak256\":\"0x2da40b8ae2b6a6038da0ac17d3ccf083a8fb54ea12684242342e53811cca997c\",\"urls\":[\"bzz-raw://9ddb66e9f90ce3005bb1fedd06ec66e6d3e99c52afaf729cee0a23ae01b21fab\",\"dweb:/ipfs/QmPTD9ciAZqj5WWuE5W4Ufs1kBvVokntrfSdUcV6Egh7eQ\"],\"license\":\"MIT\"},\"node_modules/@bananapus/core/src/structs/JBTokenAmount.sol\":{\"keccak256\":\"0xc61593d33d5ec30e695d382948a1b944d01e29a8f2bfd29f75ecebcdbc7816de\",\"urls\":[\"bzz-raw://8992c1e5fca0c2342ecc0e734dfba6a2a752e4c29184784931d0971e44305051\",\"dweb:/ipfs/QmYNcaW3qeCkgAExUaFTq238fgfJuoYCTwjCn7jm94U4dJ\"],\"license\":\"MIT\"},\"node_modules/@bananapus/permission-ids/src/JBPermissionIds.sol\":{\"keccak256\":\"0x1bd511f9cc46d134ab4743dba50ee25b1c67b5b5e30a27cbfebb1c3fcfedc876\",\"urls\":[\"bzz-raw://6d81d52f481c89832c9c61fa4ea513196c6c8182878d1fbef2038ca39a909192\",\"dweb:/ipfs/QmbaRR5ZXF9PRJwEGbwoAydQiYUoQLYiej7CVmHHbFG29z\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0xce41876e78d1badc0512229b4d14e4daf83bc1003d7f83978d18e0e56f965b9c\",\"urls\":[\"bzz-raw://a2608291cb038b388d80b79a06b6118a42f7894ff67b7da10ec0dbbf5b2973ba\",\"dweb:/ipfs/QmWohqcBLbcxmA4eGPhZDXe5RYMMEEpFq22nfkaUMvTfw1\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xc6a8ff0ea489379b61faa647490411b80102578440ab9d84e9a957cc12164e70\",\"urls\":[\"bzz-raw://0ea104e577e63faea3b69c415637e99e755dcbf64c5833d7140c35a714d6d90c\",\"dweb:/ipfs/Qmau6x4Ns9XdyynRCNNp3RhLqijJjFm7z5fyZazfYFGYdq\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5ef46daa3b58ef2702279d514780316efaa952915ee1aa3396f041ee2982b0b4\",\"urls\":[\"bzz-raw://2f8f2a76e23b02fc69e8cd24c3cb47da6c7af3a2d6c3a382f8ac25c6e094ade7\",\"dweb:/ipfs/QmPV4ZS4tPVv4mTCf9ejyZ1ai57EEibDRj7mN2ARDCLV5n\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0x9e8778b14317ba9e256c30a76fd6c32b960af621987f56069e1e819c77c6a133\",\"urls\":[\"bzz-raw://1777404f1dcd0fac188e55a288724ec3c67b45288e49cc64723e95e702b49ab8\",\"dweb:/ipfs/QmZFdC626GButBApwDUvvTnUzdinevC3B24d7yyh57XkiA\"],\"license\":\"MIT\"},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x4296879f55019b23e135000eb36896057e7101fb7fb859c5ef690cf14643757b\",\"urls\":[\"bzz-raw://87b3541437c8c443ccd36795e56a338ed12855eec17f8da624511b8d1a7e14df\",\"dweb:/ipfs/QmeJQCtZrQjtJLr6u7ZHWeH3pBnjtLWzvRrKViAi7UZqxL\"],\"license\":\"MIT\"},\"node_modules/@prb/math/src/Common.sol\":{\"keccak256\":\"0xaa374e2c26cc93e8c22a6953804ee05f811597ef5fa82f76824378b22944778b\",\"urls\":[\"bzz-raw://279c732e161d623cf4d8a9519ca4c42c0c2db99842d0eb2a20c10fde3fa722c9\",\"dweb:/ipfs/QmVViuUXbinQGqtG5M21SgVzKihiCbFUChd4tDhtvwRmxH\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IAllowanceTransfer.sol\":{\"keccak256\":\"0x37f0ac203b6ef605c9533e1a739477e8e9dcea90710b40e645a367f8a21ace29\",\"urls\":[\"bzz-raw://e0104d72aeaec1cd66cc232e7de7b7ead08608efcc179491b8a66387614670b0\",\"dweb:/ipfs/QmfAZDyuNC9FXXbnJUwqHNwmAK6uRrXxtWEytLsxjskPsN\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IEIP712.sol\":{\"keccak256\":\"0xfdccf2b9639070803cd0e4198427fb0df3cc452ca59bd3b8a0d957a9a4254138\",\"urls\":[\"bzz-raw://f7c936ac42ce89e827db905a1544397f8bdf46db34cdb6aa1b90dea42fdb4c72\",\"dweb:/ipfs/QmVgurxo1N31qZqkPBirw9Z7S9tLYmv6jSwQp8R8ur2cBk\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/IPermit2.sol\":{\"keccak256\":\"0xaa631cc9f53e699301d94233007110a345e6779011def484e8dd97b8fe0af771\",\"urls\":[\"bzz-raw://fc0502cf19c9c18f320a3001201e89e350393b75837f6b7971de18b2de06f30d\",\"dweb:/ipfs/QmT9SfhdJ7VJNNrf94g4H5usyi7ShqWGx7Cqsz9jZTjX96\"],\"license\":\"MIT\"},\"node_modules/@uniswap/permit2/src/interfaces/ISignatureTransfer.sol\":{\"keccak256\":\"0xe6df9966f8841dc3958ee86169c89de97e7f614c81c28b9dc947b12d732df64e\",\"urls\":[\"bzz-raw://3d4eafdee7f48c3be8350a94eb6edd0bfb2af2c105df65787a77174f356c0317\",\"dweb:/ipfs/QmY1j2adeeAhNpn6cUuthemxGCdLXHTfyMh9yTKsY4mZ2d\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol\":{\"keccak256\":\"0x4e64844c56061cd90e0a80de73534a9166704c43eed579eb83f90bc2780ce968\",\"urls\":[\"bzz-raw://cba4fab5cebdddf644b901994a7f0f52b98885d4c56012f4dc51d52c2bf9de0e\",\"dweb:/ipfs/QmVyyrRmqXrAiapewWunRVgiPVFJHpH2hKiE1py1svMSNV\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol\":{\"keccak256\":\"0x3f485fb1a44e8fbeadefb5da07d66edab3cfe809f0ac4074b1e54e3eb3c4cf69\",\"urls\":[\"bzz-raw://095ce0626b41318c772b3ebf19d548282607f6a8f3d6c41c13edfbd5370c8652\",\"dweb:/ipfs/QmVDZfJJ89UUCE1hMyzqpkZAtQ8jUsBgZNE5AMRG7RzRFS\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions.sol\":{\"keccak256\":\"0x9453dd0e7442188667d01d9b65de3f1e14e9511ff3e303179a15f6fc267f7634\",\"urls\":[\"bzz-raw://982f4328f956c3e60e67501e759eb292ac487f76460c774c50e9ae4fcc92aae5\",\"dweb:/ipfs/QmRnzEDsaqtd9PJEVcgQi7p5aV5pMSvRUoGZJAdwFUJxgZ\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState.sol\":{\"keccak256\":\"0xe603ac5b17ecdee73ba2b27efdf386c257a19c14206e87eee77e2017b742d9e5\",\"urls\":[\"bzz-raw://8febc9bdb399a4d94bb89f5377732652e2400e4a8dee808201ade6848f9004e7\",\"dweb:/ipfs/QmaKDqYYFU4d2W2iN77aDHptfbFmYZRrMYXHeGpJmM8C1c\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolErrors.sol\":{\"keccak256\":\"0xf80abf13fb1fafc127ba4e792f240dd8ea7c8c893978cdfd8439c27fae9a037b\",\"urls\":[\"bzz-raw://b04fc72a656bbf3631e9c2e67b9870a2d9d235185e833fe050e9606e6816a9aa\",\"dweb:/ipfs/QmUcz4bkEkJ9pwzFu1C3n97hBQ3st9U6qTAqCdyFwddKco\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents.sol\":{\"keccak256\":\"0x8071514d0fe5d17d6fbd31c191cdfb703031c24e0ece3621d88ab10e871375cd\",\"urls\":[\"bzz-raw://d0b571930cc7488b1d546a7e9cea7c52d8b3c4e207da657ed0e0db7343b8cd03\",\"dweb:/ipfs/QmaGK6vVwB95QSTR1XMYvrh7ivYAYZxi3fD7v6VMA4jZ39\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables.sol\":{\"keccak256\":\"0xf6e5d2cd1139c4c276bdbc8e1d2b256e456c866a91f1b868da265c6d2685c3f7\",\"urls\":[\"bzz-raw://b99c8c9ae8e27ee6559e5866bea82cbc9ffc8247f8d15b7422a4deb287d4d047\",\"dweb:/ipfs/QmfL8gaqt3ffAnm6nVj5ksuNpLygXuL3xq5VBqrkwC2JJ3\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions.sol\":{\"keccak256\":\"0x759b78a2918af9e99e246dc3af084f654e48ef32bb4e4cb8a966aa3dcaece235\",\"urls\":[\"bzz-raw://64144fb96e1c7fdba87305acadb98a198d26a3d46c097cb3a666e567f6f29735\",\"dweb:/ipfs/QmUnWVwN9FKB9uV5Pr8YfLpWZnYM2DENnRMaadZ492JS9u\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.sol\":{\"keccak256\":\"0x44fa2ce1182f6c2f6bead3d1737804bf7e112252ae86e0f2e92f9b8249603f43\",\"urls\":[\"bzz-raw://54154e8665b98d65f5dc91b256551852cb47882180b501b260657122d207c0ea\",\"dweb:/ipfs/QmcfemK1A2PXYrWB5SBFGERpMCderbFRb8BtTzQDj1sUBp\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-core/contracts/libraries/FullMath.sol\":{\"keccak256\":\"0x7825565a4bb2a34a1dc96bbfead755785dfb0df8ef81bd934c43023689685645\",\"urls\":[\"bzz-raw://8f44f4614d31e3d4864c7eb13620555253b84f6a69180f8745b7c6e246a9d125\",\"dweb:/ipfs/QmfNQUcXj3KL8h9u5PqbtEC6yRtwDbKNb48uMPjdwxsKnd\"],\"license\":\"MIT\"},\"node_modules/@uniswap/v3-core/contracts/libraries/TickMath.sol\":{\"keccak256\":\"0x5c57de03a91cc2ec8939865dbbcb0197bb6c353b711075eefd8e0fca5e102129\",\"urls\":[\"bzz-raw://1e994c24fd891ef8a3f5dbf5eba42b34feaf05e0376a29f91322faa18054449c\",\"dweb:/ipfs/QmNdUJGUQxd1dPkMbnA5f5UNqakxRkQE5r7bTZJAuHeapS\"],\"license\":\"GPL-2.0-or-later\"},\"node_modules/@uniswap/v3-periphery/contracts/libraries/OracleLibrary.sol\":{\"keccak256\":\"0xe313f89c69c0f1c91f0722868313b4ceb14479b3e7a0abf52a1b9bbd9c18e81b\",\"urls\":[\"bzz-raw://8ad09b061f3f533c116618c20cf01510108eebebb7ff8847b0f245b8ba368d53\",\"dweb:/ipfs/QmU6vdi5JjJfjK2KqonWvRg9NeuQWarj4B1YFN22Dh9VJM\"],\"license\":\"GPL-2.0-or-later\"},\"src/JBBuybackHook.sol\":{\"keccak256\":\"0x6ce52f5d43175b4b3c1b3ce4490aefbbf97f6bb047d01f9196e27fe934339231\",\"urls\":[\"bzz-raw://fb974d5ca3ca338841891368af57f612a1aa92c8ae600a3e25113603dc4d139d\",\"dweb:/ipfs/QmNWg3epg1Rqk8Tj5uRMxsLJEXcLdfe9wQ5u4nFH7qSSjz\"],\"license\":\"MIT\"},\"src/interfaces/IJBBuybackHook.sol\":{\"keccak256\":\"0xbe5d7f3bf2e18b569676ba9194e248e6b1ed50022f5247b4f1fa124c91bfd418\",\"urls\":[\"bzz-raw://eb221d1570e8aad409c419b6a2f84351e818c3527f3f44b806cd64c84d7a8c86\",\"dweb:/ipfs/QmUPZstaKjPN7VTywg3Mt6bF75E53mQbmXhf3TxCggJbRR\"],\"license\":\"MIT\"},\"src/interfaces/external/IWETH9.sol\":{\"keccak256\":\"0x50083bcaca6c1a8d12c79116fab4f6d8cd452a510cb3f00c4a8bc3a54678efb7\",\"urls\":[\"bzz-raw://726f187112d0953c14bff8099a8c9ce1ead47eb25e90839f77b100feaaf16127\",\"dweb:/ipfs/QmTEnMENpLjcTQLMwz4kEUiQHfiTkaZT3TL37nQ8JiRYh5\"],\"license\":\"GPL-2.0-or-later\"}},\"version\":1}", "args": [ "0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9", "0x0227628f3F023bb0B980b67D528571c95c6DaC1c", - "0x877e8e31eD1Bf9F628EfA25636c5bC9Dd83BAA77", - "0x64c30002444321C4504c8f1b9B04C95DE3731Fd2" + "0x992f9e3a81c77Cb940A29311558343E1AC66c40F", + "0x1e4c8DFfE8D72aeB63e8dDbE9eF89bc368cbbE99" ], - "bytecode": "0x6101406040523480156200001257600080fd5b5060405162003e4938038062003e49833981016040819052620000359162000156565b806001600160a01b031663f434c9146040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009a9190620001be565b6001600160a01b039081166080528481166101205282811660c05281811660e081905290841660a0526040805163293c499960e01b8152905163293c4999916004808201926020929091908290030181865afa158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001259190620001be565b6001600160a01b03166101005250620001e592505050565b6001600160a01b03811681146200015357600080fd5b50565b600080600080608085870312156200016d57600080fd5b84516200017a816200013d565b60208601519094506200018d816200013d565b6040860151909350620001a0816200013d565b6060860151909250620001b3816200013d565b939692955090935050565b600060208284031215620001d157600080fd5b8151620001de816200013d565b9392505050565b60805160a05160c05160e0516101005161012051613bb262000297600039600081816104660152818161133801528181611857015281816119cf01528181611aae0152611d550152600081816102970152818161072c01528181610f49015261109001526000818161051e01528181610e14015281816111a20152611f390152600081816103d401526108df01526000818161058601526113780152600081816105520152611c5b0152613bb26000f3fe60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561054c57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000000000000000000000000000000000000000000092505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000000000000000000000000000000000000000000000816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f00000000000000000000000000000000000000000000000000000000000000005b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f00000000000000000000000000000000000000000000000000000000000000005b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f0000000000000000000000000000000000000000000000000000000000000000169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f00000000000000000000000000000000000000000000000000000000000000005b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220f82d6708b7e9d1d8e4803189749615db1f512283aff91b9bb51a552854f72e7c64736f6c63430008170033", - "deployedBytecode": "0x60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000f8ea7ba8d990646420123feaa2447b534ab2f53c81565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000877e8e31ed1bf9f628efa25636c5bc9dd83baa7781565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f0000000000000000000000007b79995e5f793a07bc00c21412e50ecae098e7f981565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f00000000000000000000000064c30002444321c4504c8f1b9b04c95de3731fd281565b34801561054c57600080fd5b506102607f000000000000000000000000cfba13b8dcb2bb4f84c5d2704882009a539bee9a81565b34801561058057600080fd5b506102607f0000000000000000000000000227628f3f023bb0b980b67d528571c95c6dac1c81565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000f8ea7ba8d990646420123feaa2447b534ab2f53c73ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000877e8e31ed1bf9f628efa25636c5bc9dd83baa7773ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000064c30002444321c4504c8f1b9b04c95de3731fd21663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000f8ea7ba8d990646420123feaa2447b534ab2f53c73ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000f8ea7ba8d990646420123feaa2447b534ab2f53c1690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f00000000000000000000000064c30002444321c4504c8f1b9b04c95de3731fd273ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f0000000000000000000000007b79995e5f793a07bc00c21412e50ecae098e7f992505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000000227628f3f023bb0b980b67d528571c95c6dac1c816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f0000000000000000000000007b79995e5f793a07bc00c21412e50ecae098e7f95b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f0000000000000000000000007b79995e5f793a07bc00c21412e50ecae098e7f95b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f0000000000000000000000007b79995e5f793a07bc00c21412e50ecae098e7f973ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f000000000000000000000000cfba13b8dcb2bb4f84c5d2704882009a539bee9a169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f0000000000000000000000007b79995e5f793a07bc00c21412e50ecae098e7f95b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f00000000000000000000000064c30002444321c4504c8f1b9b04c95de3731fd273ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220f82d6708b7e9d1d8e4803189749615db1f512283aff91b9bb51a552854f72e7c64736f6c63430008170033", + "bytecode": "0x6101406040523480156200001257600080fd5b5060405162003e4938038062003e49833981016040819052620000359162000156565b806001600160a01b031663f434c9146040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009a9190620001be565b6001600160a01b039081166080528481166101205282811660c05281811660e081905290841660a0526040805163293c499960e01b8152905163293c4999916004808201926020929091908290030181865afa158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001259190620001be565b6001600160a01b03166101005250620001e592505050565b6001600160a01b03811681146200015357600080fd5b50565b600080600080608085870312156200016d57600080fd5b84516200017a816200013d565b60208601519094506200018d816200013d565b6040860151909350620001a0816200013d565b6060860151909250620001b3816200013d565b939692955090935050565b600060208284031215620001d157600080fd5b8151620001de816200013d565b9392505050565b60805160a05160c05160e0516101005161012051613bb262000297600039600081816104660152818161133801528181611857015281816119cf01528181611aae0152611d550152600081816102970152818161072c01528181610f49015261109001526000818161051e01528181610e14015281816111a20152611f390152600081816103d401526108df01526000818161058601526113780152600081816105520152611c5b0152613bb26000f3fe60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561054c57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000000000000000000000000000000000000000000092505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000000000000000000000000000000000000000000000816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f00000000000000000000000000000000000000000000000000000000000000005b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f00000000000000000000000000000000000000000000000000000000000000005b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f0000000000000000000000000000000000000000000000000000000000000000169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f00000000000000000000000000000000000000000000000000000000000000005b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220673ba775a9e9027f7796ba830c6cc31583ba0bdffbfd7ffbf013c44b6ee8d08b64736f6c63430008170033", + "deployedBytecode": "0x60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000e802b15a90a8aed41797cf535c6aee697f18e0b181565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000992f9e3a81c77cb940a29311558343e1ac66c40f81565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f0000000000000000000000007b79995e5f793a07bc00c21412e50ecae098e7f981565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe9981565b34801561054c57600080fd5b506102607f0000000000000000000000009ca9bc9d5e7e20fc2f1d750807fa30c86b7989f881565b34801561058057600080fd5b506102607f0000000000000000000000000227628f3f023bb0b980b67d528571c95c6dac1c81565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000e802b15a90a8aed41797cf535c6aee697f18e0b173ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000992f9e3a81c77cb940a29311558343e1ac66c40f73ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe991663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000e802b15a90a8aed41797cf535c6aee697f18e0b173ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000e802b15a90a8aed41797cf535c6aee697f18e0b11690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe9973ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f0000000000000000000000007b79995e5f793a07bc00c21412e50ecae098e7f992505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000000227628f3f023bb0b980b67d528571c95c6dac1c816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f0000000000000000000000007b79995e5f793a07bc00c21412e50ecae098e7f95b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f0000000000000000000000007b79995e5f793a07bc00c21412e50ecae098e7f95b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f0000000000000000000000007b79995e5f793a07bc00c21412e50ecae098e7f973ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f0000000000000000000000009ca9bc9d5e7e20fc2f1d750807fa30c86b7989f8169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f0000000000000000000000007b79995e5f793a07bc00c21412e50ecae098e7f95b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe9973ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220673ba775a9e9027f7796ba830c6cc31583ba0bdffbfd7ffbf013c44b6ee8d08b64736f6c63430008170033", "devdoc": { "kind": "dev", "methods": { @@ -1212,7 +1212,7 @@ }, "version": 1 }, - "gitCommit": "74088a01fb7bb1c33e8e306744b5ecf4edb1b5a2", + "gitCommit": "9caaedd7d4d116463c4ceecb3147a8863f806dab", "sourceName": "src/JBBuybackHook.sol", "chainId": "11155111", "linkReferences": {}, diff --git a/deployments/nana-buyback-hook-testnet/sepolia/execution/97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1.json b/deployments/nana-buyback-hook-testnet/sepolia/execution/97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1.json new file mode 100644 index 0000000..4c11cb4 --- /dev/null +++ b/deployments/nana-buyback-hook-testnet/sepolia/execution/97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1.json @@ -0,0 +1,221 @@ +{ + "_format": "sphinx-sol-execution-artifact-1", + "transactions": [ + { + "receipt": { + "blockHash": "0xcb2d41302059dd61d0815cd787ce2cdcf2b438328904b58de26c4d7261565ae0", + "blockNumber": 6352014, + "contractAddress": null, + "cumulativeGasUsed": "8856644", + "from": "0x0c1c9049564269275059032Fb484Aa2e7Ab779af", + "gasPrice": "172136566", + "gasUsed": "176655", + "hash": "0xcc836caae3fd4623e049a672bb8aa19232ad05463ef0ee11bbb92b3aa5cdbf3c", + "index": 69, + "logs": [ + { + "address": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", + "blockHash": "0xcb2d41302059dd61d0815cd787ce2cdcf2b438328904b58de26c4d7261565ae0", + "blockNumber": 6352014, + "data": "0x0000000000000000000000000000000000000000000000000000000000000000", + "index": 125, + "topics": [ + "0x572f161235911da04685a68c06adf558fc7e4a36909dca394650e0adc19cc93d", + "0x0000000000000000000000000c1c9049564269275059032fb484aa2e7ab779af", + "0x000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4", + "0xe863df3a773bc60b8efcf89ade906a722a6ded78685535da452267470fb85833" + ], + "transactionHash": "0xcc836caae3fd4623e049a672bb8aa19232ad05463ef0ee11bbb92b3aa5cdbf3c", + "transactionIndex": 69 + }, + { + "address": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", + "blockHash": "0xcb2d41302059dd61d0815cd787ce2cdcf2b438328904b58de26c4d7261565ae0", + "blockNumber": 6352014, + "data": "0x000000000000000000000000a2ea7657440875bf916cbfc0cfa88f13e38ad463000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "index": 126, + "topics": [ + "0x382c7aec02462c9b086aba9a7f8dbb1fb8bf336e7b624b0149eeca6726d0fb4a", + "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1", + "0x0000000000000000000000000000000000000000000000000000000000000001" + ], + "transactionHash": "0xcc836caae3fd4623e049a672bb8aa19232ad05463ef0ee11bbb92b3aa5cdbf3c", + "transactionIndex": 69 + } + ], + "logsBloom": "0x000000000000000000000000000000000000000000000140000000000040000000800000000000000000000000400200000000000000000000000000000c00000040000000000000000000000000000400000000000400000000001200000000000000000000000080000000000000000040000000000000000000000000000000000000000000000001000000000000000008000000000000000000000000000040000000010000000000000020000020000000000000001000000000000000000000020000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000a0100000000000000000", + "status": 1, + "to": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463" + }, + "response": { + "accessList": [], + "blockNumber": 6352014, + "blockHash": "0xcb2d41302059dd61d0815cd787ce2cdcf2b438328904b58de26c4d7261565ae0", + "chainId": "11155111", + "data": "0xbe6002c2000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003448f38f83597d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000aa36a700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000001000000000000000000000000004bdf5a13e7a25f88dd5321a979e0e54c13df83e8000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a400000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000a2ea7657440875bf916cbfc0cfa88f13e38ad46300000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003554e5ca9e07b0b596d36ec535da5f0868a1d64a75b5bd20626e7795ac4f44cafe28f828145784c36c0c665c8ab6dde53c8bd0cbe5da65e3f33b51fea7a4da4ecbaec3e0ec4cdaab86d67f8057f9491828210cbd617743ede1cc69e518e61331700000000000000000000000000000000000000000000000000000000000000414f02428220e87325aeb28468cc7ff8c84bb867601c5f91ee314a0d5c8393e2154f13f593e420a8883384f73ad73e7658068ced56f435dd9a2447df0f88795f6b1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "from": "0x0c1c9049564269275059032Fb484Aa2e7Ab779af", + "gasLimit": "188948", + "gasPrice": "172136566", + "hash": "0xcc836caae3fd4623e049a672bb8aa19232ad05463ef0ee11bbb92b3aa5cdbf3c", + "maxFeePerGas": "200098353", + "maxPriorityFeePerGas": "143049547", + "nonce": 65, + "signature": { + "networkV": null, + "r": "0x9e8d83e7c6e7e79eecfc9392551cfa226e7e446050a7c655e7a352321b150394", + "s": "0x5ec4b5f31cfda022179361f9b0d0d25cb34c46b4cafc7775965b4e27cf7e6372", + "v": 28 + }, + "to": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", + "type": 2, + "value": "0" + } + }, + { + "receipt": { + "blockHash": "0xc6d3628b007961aa29034b74598c174b05ac8ec53e1919df282bc97ca2d9d95a", + "blockNumber": 6352015, + "contractAddress": null, + "cumulativeGasUsed": "13953457", + "from": "0x0c1c9049564269275059032Fb484Aa2e7Ab779af", + "gasPrice": "170969085", + "gasUsed": "3569272", + "hash": "0x30ef079f088329b2831dc1cacc5e5524735849da2ced6741969131e62ec70df8", + "index": 75, + "logs": [ + { + "address": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", + "blockHash": "0xc6d3628b007961aa29034b74598c174b05ac8ec53e1919df282bc97ca2d9d95a", + "blockNumber": 6352015, + "data": "0x0000000000000000000000000000000000000000000000000000000000000000", + "index": 154, + "topics": [ + "0x572f161235911da04685a68c06adf558fc7e4a36909dca394650e0adc19cc93d", + "0x0000000000000000000000000c1c9049564269275059032fb484aa2e7ab779af", + "0x000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4", + "0xa02f90f5a4f5b5bcecf85cff120e7271ba5c0b1cf871817e7bd478ddae0a02d6" + ], + "transactionHash": "0x30ef079f088329b2831dc1cacc5e5524735849da2ced6741969131e62ec70df8", + "transactionIndex": 75 + }, + { + "address": "0x4bDf5A13e7a25F88dd5321a979e0E54c13DF83E8", + "blockHash": "0xc6d3628b007961aa29034b74598c174b05ac8ec53e1919df282bc97ca2d9d95a", + "blockNumber": 6352015, + "data": "0x", + "index": 155, + "topics": [ + "0x6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8", + "0x000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4" + ], + "transactionHash": "0x30ef079f088329b2831dc1cacc5e5524735849da2ced6741969131e62ec70df8", + "transactionIndex": 75 + }, + { + "address": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", + "blockHash": "0xc6d3628b007961aa29034b74598c174b05ac8ec53e1919df282bc97ca2d9d95a", + "blockNumber": 6352015, + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "index": 156, + "topics": [ + "0xa65fb05c5808f5f389d72edeaf719ce38f4cc55c1f69ca3cbfb31c21501caa07", + "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1" + ], + "transactionHash": "0x30ef079f088329b2831dc1cacc5e5524735849da2ced6741969131e62ec70df8", + "transactionIndex": 75 + }, + { + "address": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", + "blockHash": "0xc6d3628b007961aa29034b74598c174b05ac8ec53e1919df282bc97ca2d9d95a", + "blockNumber": 6352015, + "data": "0x", + "index": 157, + "topics": [ + "0x4383d976757d67ca920616be0b6430a681ea9d3dcce8d6d61d4603ca4a9bff63", + "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1" + ], + "transactionHash": "0x30ef079f088329b2831dc1cacc5e5524735849da2ced6741969131e62ec70df8", + "transactionIndex": 75 + } + ], + "logsBloom": "0x00000000000010000000000000080000000000000000010000000000004000000080000000000000000000000040020000000000000000000000000000080000000000000000200000000000000000040000000000000000800000000000000000000000000000008000000000000000004000000400000000000000000000000000000000000000000100000000000000000800000000000000000000000000004000800001000000000000000000002200000000000000100000000004000000000002100000000000000000000000000000000008000000000000000000000100000000000008000000000000000200000000000080100000000008000200", + "status": 1, + "to": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463" + }, + "response": { + "accessList": [], + "blockNumber": 6352015, + "blockHash": "0xc6d3628b007961aa29034b74598c174b05ac8ec53e1919df282bc97ca2d9d95a", + "chainId": "11155111", + "data": "0xbe6002c2000000000000000000000000b94181c4b64724fc4924aeece5e55cc7cedfd1a4000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000041a4e65ec46d000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000040c00000000000000000000000000000000000000000000000000000000000aa36a70000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000003fe00000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003bd22c00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000003ee94a424275796261636b486f6f6b000000000000000000000000000000000000006101406040523480156200001257600080fd5b5060405162003e4938038062003e49833981016040819052620000359162000156565b806001600160a01b031663f434c9146040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009a9190620001be565b6001600160a01b039081166080528481166101205282811660c05281811660e081905290841660a0526040805163293c499960e01b8152905163293c4999916004808201926020929091908290030181865afa158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001259190620001be565b6001600160a01b03166101005250620001e592505050565b6001600160a01b03811681146200015357600080fd5b50565b600080600080608085870312156200016d57600080fd5b84516200017a816200013d565b60208601519094506200018d816200013d565b6040860151909350620001a0816200013d565b6060860151909250620001b3816200013d565b939692955090935050565b600060208284031215620001d157600080fd5b8151620001de816200013d565b9392505050565b60805160a05160c05160e0516101005161012051613bb262000297600039600081816104660152818161133801528181611857015281816119cf01528181611aae0152611d550152600081816102970152818161072c01528181610f49015261109001526000818161051e01528181610e14015281816111a20152611f390152600081816103d401526108df01526000818161058601526113780152600081816105520152611c5b0152613bb26000f3fe60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561054c57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000000000000000000000000000000000000000000092505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000000000000000000000000000000000000000000000816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f00000000000000000000000000000000000000000000000000000000000000005b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f00000000000000000000000000000000000000000000000000000000000000005b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f0000000000000000000000000000000000000000000000000000000000000000169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f00000000000000000000000000000000000000000000000000000000000000005b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220673ba775a9e9027f7796ba830c6cc31583ba0bdffbfd7ffbf013c44b6ee8d08b64736f6c634300081700330000000000000000000000007b79995e5f793a07bc00c21412e50ecae098e7f90000000000000000000000000227628f3f023bb0b980b67d528571c95c6dac1c000000000000000000000000992f9e3a81c77cb940a29311558343e1ac66c40f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe9900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003a59da821b3c548d237997f012a42cbe229eff612a2f9ff4d22ad5d4154cec4d9c5449df3ba697aaf32c23a1149a3f43cb2d269a822306adb6ce1bffeaea92947baec3e0ec4cdaab86d67f8057f9491828210cbd617743ede1cc69e518e61331700000000000000000000000000000000000000000000000000000000", + "from": "0x0c1c9049564269275059032Fb484Aa2e7Ab779af", + "gasLimit": "4548535", + "gasPrice": "170969085", + "hash": "0x30ef079f088329b2831dc1cacc5e5524735849da2ced6741969131e62ec70df8", + "maxFeePerGas": "201223585", + "maxPriorityFeePerGas": "143049547", + "nonce": 66, + "signature": { + "networkV": null, + "r": "0x37ce64951dad7ab5895cb15fee2e20be27f9d2ed8f94b357e5ac60738585eb6c", + "s": "0x0fb4b914809bd4c7ad30444917a1c5b58d622ad7d574b1eb3de882f9eeca1e8d", + "v": 27 + }, + "to": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", + "type": 2, + "value": "0" + } + } + ], + "merkleRoot": "0x97d2d3eb869860a4901ccc2eb48f9bda4d4f86c553caf5e597066a6491a0b2f1", + "solcInputHashes": [ + "f096d2968ac6c775921975b16cb0c91e" + ], + "safeAddress": "0x4bDf5A13e7a25F88dd5321a979e0E54c13DF83E8", + "moduleAddress": "0xb94181c4B64724FC4924aeECE5E55cc7CedfD1a4", + "executorAddress": "0xA2eA7657440875bF916CBFC0cfA88F13e38aD463", + "nonce": "1", + "chainId": "11155111", + "actions": [ + { + "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", + "value": "0", + "txData": "0x4a424275796261636b486f6f6b000000000000000000000000000000000000006101406040523480156200001257600080fd5b5060405162003e4938038062003e49833981016040819052620000359162000156565b806001600160a01b031663f434c9146040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009a9190620001be565b6001600160a01b039081166080528481166101205282811660c05281811660e081905290841660a0526040805163293c499960e01b8152905163293c4999916004808201926020929091908290030181865afa158015620000ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001259190620001be565b6001600160a01b03166101005250620001e592505050565b6001600160a01b03811681146200015357600080fd5b50565b600080600080608085870312156200016d57600080fd5b84516200017a816200013d565b60208601519094506200018d816200013d565b6040860151909350620001a0816200013d565b6060860151909250620001b3816200013d565b939692955090935050565b600060208284031215620001d157600080fd5b8151620001de816200013d565b9392505050565b60805160a05160c05160e0516101005161012051613bb262000297600039600081816104660152818161133801528181611857015281816119cf01528181611aae0152611d550152600081816102970152818161072c01528181610f49015261109001526000818161051e01528181610e14015281816111a20152611f390152600081816103d401526108df01526000818161058601526113780152600081816105520152611c5b0152613bb26000f3fe60806040526004361061018b5760003560e01c806388bc2ef3116100d6578063cd817cd01161007f578063f434c91411610059578063f434c91414610540578063f73e5aab14610574578063fa461e33146105a857600080fd5b8063cd817cd0146104b4578063db312fae146104f6578063ee0fc1211461050c57600080fd5b8063ad5c4648116100b0578063ad5c464814610454578063af47188014610488578063b88a92b41461049d57600080fd5b806388bc2ef3146103c25780638cc35846146103f65780639c9d43611461042457600080fd5b80633717fba711610138578063754baf9611610112578063754baf961461033e5780637b621d3a14610354578063889eedb41461037457600080fd5b80633717fba7146102b957806355135de0146102fb578063677ce0881461031b57600080fd5b80631a65893b116101695780631a65893b146101fa57806327e514111461021d578063293c49991461028557600080fd5b806301ffc9a714610190578063132893eb146101c55780631337f986146101e7575b600080fd5b34801561019c57600080fd5b506101b06101ab366004612da3565b6105c8565b60405190151581526020015b60405180910390f35b3480156101d157600080fd5b506101e56101e0366004612dfe565b6106f9565b005b6101e56101f5366004612e2a565b6108a7565b34801561020657600080fd5b5061020f607881565b6040519081526020016101bc565b34801561022957600080fd5b50610260610238366004612e66565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b34801561029157600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156102c557600080fd5b506102e66102d4366004612e66565b60009081526020819052604090205490565b60405163ffffffff90911681526020016101bc565b34801561030757600080fd5b506101e5610316366004612e7f565b610f16565b34801561032757600080fd5b506101b0610336366004612ec6565b600092915050565b34801561034a57600080fd5b5061020f61232881565b34801561036057600080fd5b5061026061036f366004612ef6565b611045565b34801561038057600080fd5b5061026061038f366004612ec6565b600160209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b3480156103ce57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561040257600080fd5b50610416610411366004612f5b565b6116b9565b6040516101bc929190612ffb565b34801561043057600080fd5b5061020f61043f366004612e66565b60009081526020819052604090205460801c90565b34801561046057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561049457600080fd5b5061020f606481565b3480156104a957600080fd5b5061020f6202a30081565b3480156104c057600080fd5b506104e66104cf3660046130b7565b6101608101359160808201359160a0013590606090565b6040516101bc94939291906130f3565b34801561050257600080fd5b5061020f61271081565b34801561051857600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561054c57600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b506102607f000000000000000000000000000000000000000000000000000000000000000081565b3480156105b457600080fd5b506101e56105c33660046131be565b611992565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f263ec41e00000000000000000000000000000000000000000000000000000000148061065b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f1337f98600000000000000000000000000000000000000000000000000000000145b806106a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f8f97abcd00000000000000000000000000000000000000000000000000000000145b806106f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018390526107b5907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e906024015b602060405180830381865afa158015610789573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ad919061323e565b836017611bd0565b60788163ffffffff1610806107d257506202a3008163ffffffff16115b15610809576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526020818152604091829020805463ffffffff85167fffffffffffffffffffffffffffffffff000000000000000000000000000000008216811790925583516fffffffffffffffffffffffffffffffff821680825293810192909252339382019390935284907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce906060015b60405180910390a250505050565b6040517f6e49181f000000000000000000000000000000000000000000000000000000008152602082013560048201523360248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636e49181f90604401602060405180830381865afa15801561093b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095f9190613269565b610995576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080806109a76101c0850185613286565b8101906109b491906132eb565b9194509250905061eeee6109cf610100860160e08701613320565b73ffffffffffffffffffffffffffffffffffffffff1614610aa0576109fb610100850160e08601613320565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152610140860135604482015273ffffffffffffffffffffffffffffffffffffffff91909116906323b872dd906064016020604051808303816000875af1158015610a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9e9190613269565b505b6000610aac8585611d05565b905081811015610ae8576040517f1d9e022400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061eeee610afe610100880160e08901613320565b73ffffffffffffffffffffffffffffffffffffffff1614610bbf57610b2a610100870160e08801613320565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa158015610b96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bba919061333d565b610bc1565b475b905060008115610dd757610bf582610160890135610be560a08b0160808c01613365565b610bf090600a6134d1565b612019565b905061eeee610c0b610100890160e08a01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610cd257610c37610100880160e08901613320565b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081523360048201526024810184905273ffffffffffffffffffffffffffffffffffffffff919091169063095ea7b3906044016020604051808303816000875af1158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190613269565b505b600061eeee610ce86101008a0160e08b01613320565b73ffffffffffffffffffffffffffffffffffffffff1614610d0a576000610d0c565b825b905033639e6eec058260208b0135610d2b6101008d0160e08e01613320565b876000604051806020016040528060008152506040518763ffffffff1660e01b8152600401610d5e9594939291906134e0565b6000604051808303818588803b158015610d7757600080fd5b505af1158015610d8b573d6000803e3d6000fd5b505060408051878152602080820188905233828401529151918d013594507faacef1bbb194eac329f8f247fbe8cce3eca2ed1f2e0a45a0488c2dd8afe6e51693508190036060019150a2505b610df185610160890135610be560a08b0160808c01613365565b610dfb908261353c565b905073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663c7fb92de6020890135610e48848761353c565b610e5a6101c08c016101a08d01613320565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526004810193909352602483019190915273ffffffffffffffffffffffffffffffffffffffff16604482015260a06064820152600060a48201526001608482015260c4016020604051808303816000875af1158015610ee8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0c919061333d565b5050505050505050565b6040517f6352211e00000000000000000000000000000000000000000000000000000000815260048101839052610f8d907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690636352211e9060240161076c565b6064811080610f9d575061232881115b15610fd4576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260208181526040918290208054608085811b6fffffffffffffffffffffffffffffffff83161790925583519181901c808352928201859052339382019390935284907faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db535390606001610899565b6040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526000906111039073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa1580156110d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fb919061323e565b876018611bd0565b6064831080611113575061232883115b1561114a576040517fa7149b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60788463ffffffff16108061116757506202a3008463ffffffff16115b1561119e576040517fbbedb50a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16631d831d5c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122f919061323e565b73ffffffffffffffffffffffffffffffffffffffff1663ea78803f886040518263ffffffff1660e01b815260040161126991815260200190565b602060405180830381865afa158015611286573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112aa919061323e565b905073ffffffffffffffffffffffffffffffffffffffff81166112f9576040517fc0a8a55b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff84160161135a577f000000000000000000000000000000000000000000000000000000000000000092505b73ffffffffffffffffffffffffffffffffffffffff808416908216107f0000000000000000000000000000000000000000000000000000000000000000816113a257846113a4565b825b826113af57836113b1565b855b6040805173ffffffffffffffffffffffffffffffffffffffff9384166020820152929091169082015262ffffff89166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905280516020918201206114ac939290917fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5491017fff00000000000000000000000000000000000000000000000000000000000000815260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830191909152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152815160209283012060008b81526001845282812073ffffffffffffffffffffffffffffffffffffffff898116835294529190912054909450161561154a576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855290835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116898416179091558c855284845282852063ffffffff8c1660808c901b8117909155600285528386208054909216928816929092179055815193845291830191909152339082015288907fa8d6b20cd05f07d50e9855ce0fc6de3517f3df2e890a5ec6357892b3808a53ce9060600160405180910390a26040805160008152602081018790523381830152905189917faafe2470cbfb11a09f9b45d6a795226e93cc251e30fdcabddbabb157a1db5353919081900360600190a26040805173ffffffffffffffffffffffffffffffffffffffff85811682523360208301528616918a917fe694de883385e30d535f625d68df4b2b5e866e8e86fe9d15554480c8d1812e60910160405180910390a3505095945050505050565b60408051808201909152600581527f71756f746500000000000000000000000000000000000000000000000000000060208201526101208201359060609060a0840135906000908190819061170d9061212f565b905060008061175e836117246101608c018c613286565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061214392505050565b915091508115611781578080602001905181019061177c919061354f565b955093505b505050828111156117be576040517f1f89071e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000036117c95750815b60006117e08287610be560808b0160608c01613365565b60c08801356000908152600260205260408082205492935073ffffffffffffffffffffffffffffffffffffffff9092169161eeee906118259060608c01908c01613320565b73ffffffffffffffffffffffffffffffffffffffff16146118555761185060608a0160408b01613320565b611877565b7f00000000000000000000000000000000000000000000000000000000000000005b905084600003611894576118918960c00135838684612331565b94505b848310156119875760408051600180825281830190925273ffffffffffffffffffffffffffffffffffffffff8381169085161091816020015b604080516060808201835260008083526020830152918101919091528152602001906001900390816118cd575050604080516060810182523081526020810188905291995081018289881461192b57611926888b6135a2565b61192e565b60005b604080519215156020840152820152606081018990526080016040516020818303038152906040528152508860008151811061196c5761196c6135b5565b60200260200101819052506000985050505050505050915091565b505050505050915091565b6000806119a183850185612ec6565b9092509050600073ffffffffffffffffffffffffffffffffffffffff821661eeee146119cd57816119ef565b7f00000000000000000000000000000000000000000000000000000000000000005b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8581168552925290912054919250163314611a5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808812611a6b5787611a6d565b865b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff111273ffffffffffffffffffffffffffffffffffffffff841601611b2e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050505b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526024810182905273ffffffffffffffffffffffffffffffffffffffff83169063a9059cbb906044016020604051808303816000875af1158015611ba1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc59190613269565b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff84168114801590611cc857506040517f348b684e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301528581166024830152604482018590526064820184905260016084830181905260a48301527f0000000000000000000000000000000000000000000000000000000000000000169063348b684e9060c401602060405180830381865afa158015611ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc69190613269565b155b15611cff576040517f075fd2b100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b60006101408301358161eeee611d22610100870160e08801613320565b73ffffffffffffffffffffffffffffffffffffffff1614611d5357611d4e610100860160e08701613320565b611d75565b7f00000000000000000000000000000000000000000000000000000000000000005b602080870135600090815260018252604080822073ffffffffffffffffffffffffffffffffffffffff80861684529352902054919250168063128acb083087158689611dd057611dcb6401000276a360016135e4565b611def565b611def600173fffd8963efd1fc6a506488495d951d5263988d26613618565b60208c0135611e056101008e0160e08f01613320565b604051602001611e3592919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611e64959493929190613645565b60408051808303816000875af1925050508015611ebc575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611eb99181019061354f565b60015b611ecc57600093505050506106f3565b86611ed75780611ed9565b815b611ee29061368c565b955050508315611fab576040517fa2d532e6000000000000000000000000000000000000000000000000000000008152306004820152602087013560248201526044810185905260806064820152600060848201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a2d532e69060a401600060405180830381600087803b158015611f9257600080fd5b505af1158015611fa6573d6000803e3d6000fd5b505050505b6040805184815273ffffffffffffffffffffffffffffffffffffffff831660208281019190915291810186905233606082015290870135907f6a212efdcd471836edcfe424121fc9048d3a7cd0458b1218a71aa915300e0e579060800160405180910390a250505092915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8587098587029250828110838203039150508060000361207157838281612067576120676136c4565b0492505050612128565b8381106120c0576040517f63a057780000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064015b60405180910390fd5b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b805160208201206000903060601b186106f3565b600060606025835111612168575050604080516020810190915260008082529061232a565b6000836121776004602061353c565b81518110612187576121876135b5565b0160209081015160f81c91505b6000856121a260048461353c565b815181106121b2576121b26135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016148015906121f057506121ed6020836136f3565b81105b156123275760008561220360048461353c565b81518110612213576122136135b5565b016020908101518784019091015160f89190911c91507fffffffff000000000000000000000000000000000000000000000000000000008089169082160361231d5760006122626020866136f3565b61226d60098661353c565b1015806122ba57508761228160098661353c565b81518110612291576122916135b5565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016155b6122f3576020886122cc60098761353c565b815181106122dc576122dc6135b5565b01602001516122ee919060f81c6136f3565b6122f6565b87515b9050600161230f896123096020876136f3565b84612488565b96509650505050505061232a565b5050600501612194565b50505b9250929050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8086168552925282205416803b8203612374576000915050612480565b8073ffffffffffffffffffffffffffffffffffffffff16633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa9250505080156123f9575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526123f69181019061371c565b60015b612407576000915050612480565b8061241d57600098505050505050505050612480565b50505050505050600086815260208190526040812054908190608082901c9061244685846124ce565b5090506124558189898c612792565b955061271061246483886136f3565b61246e91906137b5565b61247890876135a2565b955050505050505b949350505050565b60608282036040519150602081830101604052808252508260208501016020820160005b848110156124c45782810151828201526020016124ac565b5050509392505050565b6000808263ffffffff16600003612541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f425000000000000000000000000000000000000000000000000000000000000060448201526064016120b7565b6040805160028082526060820183526000926020830190803683370190505090508381600081518110612576576125766135b5565b602002602001019063ffffffff16908163ffffffff16815250506000816001815181106125a5576125a56135b5565b602002602001019063ffffffff16908163ffffffff16815250506000808673ffffffffffffffffffffffffffffffffffffffff1663883bdbfd846040518263ffffffff1660e01b81526004016125fb91906137c9565b600060405180830381865afa158015612618573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261265e91908101906138fe565b91509150600082600081518110612677576126776135b5565b602002602001015183600181518110612692576126926135b5565b60200260200101516126a491906139ca565b90506000826000815181106126bb576126bb6135b5565b6020026020010151836001815181106126d6576126d66135b5565b60200260200101516126e89190613618565b90506126fa63ffffffff891683613a0f565b965060008260060b128015612720575061271a63ffffffff891683613a83565b60060b15155b15612733578661272f81613aa5565b9750505b600061275973ffffffffffffffffffffffffffffffffffffffff63ffffffff8b16613b02565b905061278377ffffffffffffffffffffffffffffffffffffffff00000000602084901b1682613b45565b96505050505050509250929050565b60008061279e8661296c565b90506fffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff82161161289d5760006127ef73ffffffffffffffffffffffffffffffffffffffff8316806136f3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161061285f5761285a7801000000000000000000000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b612895565b61289581876fffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000612cd3565b925050612963565b60006128c973ffffffffffffffffffffffffffffffffffffffff83168068010000000000000000612cd3565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16106129315761292c700100000000000000000000000000000000876fffffffffffffffffffffffffffffffff1683612cd3565b61295f565b61295f81876fffffffffffffffffffffffffffffffff16700100000000000000000000000000000000612cd3565b9250505b50949350505050565b60008060008360020b12612983578260020b61298b565b8260020b6000035b9050620d89e88111156129ca576040517f2bc80f3a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000816001166000036129ee57700100000000000000000000000000000000612a00565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612a34576ffff97272373d413259a46990580e213a0260801c5b6004821615612a53576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612a72576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612a91576fffcb9843d60f6159c9db58835c9266440260801c5b6020821615612ab0576fff973b41fa98c081472e6896dfb254c00260801c5b6040821615612acf576fff2ea16466c96a3843ec78b326b528610260801c5b6080821615612aee576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615612b0e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612b2e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612b4e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612b6e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612b8e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612bae576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612bce576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612bee576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612c0f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612c2f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612c4e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612c6b576b048a170391f7dc42444e8fa20260801c5b60008460020b1315612caa57807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81612ca657612ca66136c4565b0490505b640100000000810615612cbe576001612cc1565b60005b60ff16602082901c0192505050919050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003612d2a5760008411612d1f57600080fd5b508290049050612128565b808411612d3657600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060208284031215612db557600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461212857600080fd5b803563ffffffff81168114612df957600080fd5b919050565b60008060408385031215612e1157600080fd5b82359150612e2160208401612de5565b90509250929050565b600060208284031215612e3c57600080fd5b813567ffffffffffffffff811115612e5357600080fd5b8201610200818503121561212857600080fd5b600060208284031215612e7857600080fd5b5035919050565b60008060408385031215612e9257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114612ec357600080fd5b50565b60008060408385031215612ed957600080fd5b823591506020830135612eeb81612ea1565b809150509250929050565b600080600080600060a08688031215612f0e57600080fd5b85359450602086013562ffffff81168114612f2857600080fd5b9350612f3660408701612de5565b9250606086013591506080860135612f4d81612ea1565b809150509295509295909350565b600060208284031215612f6d57600080fd5b813567ffffffffffffffff811115612f8457600080fd5b8201610180818503121561212857600080fd5b6000815180845260005b81811015612fbd57602081850181015186830182015201612fa1565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6000604080830185845260206040818601528186518084526060935060608701915060608160051b88010183890160005b838110156130a7578983037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa00185528151805173ffffffffffffffffffffffffffffffffffffffff168452868101518785015288015188840188905261309488850182612f97565b958701959350509085019060010161302c565b50909a9950505050505050505050565b6000602082840312156130c957600080fd5b813567ffffffffffffffff8111156130e057600080fd5b82016101a0818503121561212857600080fd5b60006080820186835260208681850152604086604086015260606080606087015283875180865260a08801915060a08160051b890101955084890160005b828110156131ac578988037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600184528151805173ffffffffffffffffffffffffffffffffffffffff16895287810151888a0152860151868901869052613199868a0182612f97565b9850509286019290860190600101613131565b50959c9b505050505050505050505050565b600080600080606085870312156131d457600080fd5b8435935060208501359250604085013567ffffffffffffffff808211156131fa57600080fd5b818701915087601f83011261320e57600080fd5b81358181111561321d57600080fd5b88602082850101111561322f57600080fd5b95989497505060200194505050565b60006020828403121561325057600080fd5b815161212881612ea1565b8015158114612ec357600080fd5b60006020828403121561327b57600080fd5b81516121288161325b565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126132bb57600080fd5b83018035915067ffffffffffffffff8211156132d657600080fd5b60200191503681900382131561232a57600080fd5b60008060006060848603121561330057600080fd5b833561330b8161325b565b95602085013595506040909401359392505050565b60006020828403121561333257600080fd5b813561212881612ea1565b60006020828403121561334f57600080fd5b5051919050565b60ff81168114612ec357600080fd5b60006020828403121561337757600080fd5b813561212881613356565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b8085111561340a57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156133f0576133f0613382565b808516156133fd57918102915b93841c93908002906133b6565b509250929050565b600082613421575060016106f3565b8161342e575060006106f3565b8160018114613444576002811461344e5761346a565b60019150506106f3565b60ff84111561345f5761345f613382565b50506001821b6106f3565b5060208310610133831016604e8410600b841016171561348d575081810a6106f3565b61349783836133b1565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156134c9576134c9613382565b029392505050565b600061212860ff841683613412565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260c06080820152600060c082015260e060a0820152600061353160e0830184612f97565b979650505050505050565b808201808211156106f3576106f3613382565b6000806040838503121561356257600080fd5b505080516020909101519092909150565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b818103818111156106f3576106f3613382565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81811683821601908082111561361157613611613382565b5092915050565b73ffffffffffffffffffffffffffffffffffffffff82811682821603908082111561361157613611613382565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a0608083015261353160a0830184612f97565b60007f800000000000000000000000000000000000000000000000000000000000000082036136bd576136bd613382565b5060000390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b80820281158282048414176106f3576106f3613382565b805161ffff81168114612df957600080fd5b600080600080600080600060e0888a03121561373757600080fd5b875161374281612ea1565b8097505060208801518060020b811461375a57600080fd5b95506137686040890161370a565b94506137766060890161370a565b93506137846080890161370a565b925060a088015161379481613356565b60c08901519092506137a58161325b565b8091505092959891949750929550565b6000826137c4576137c46136c4565b500490565b6020808252825182820181905260009190848201906040850190845b8181101561380757835163ffffffff16835292840192918401916001016137e5565b50909695505050505050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561385a5761385a613573565b604052919050565b600067ffffffffffffffff82111561387c5761387c613573565b5060051b60200190565b600082601f83011261389757600080fd5b815160206138ac6138a783613862565b613813565b8083825260208201915060208460051b8701019350868411156138ce57600080fd5b602086015b848110156138f35780516138e681612ea1565b83529183019183016138d3565b509695505050505050565b6000806040838503121561391157600080fd5b825167ffffffffffffffff8082111561392957600080fd5b818501915085601f83011261393d57600080fd5b8151602061394d6138a783613862565b82815260059290921b8401810191818101908984111561396c57600080fd5b948201945b8386101561399a5785518060060b811461398b5760008081fd5b82529482019490820190613971565b918801519196509093505050808211156139b357600080fd5b506139c085828601613886565b9150509250929050565b600682810b9082900b037fffffffffffffffffffffffffffffffffffffffffffffffffff800000000000008112667fffffffffffff821317156106f3576106f3613382565b60008160060b8360060b80613a2657613a266136c4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81147fffffffffffffffffffffffffffffffffffffffffffffffffff8000000000000083141615613a7a57613a7a613382565b90059392505050565b60008260060b80613a9657613a966136c4565b808360060b0791505092915050565b60008160020b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8000008103613ada57613ada613382565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b77ffffffffffffffffffffffffffffffffffffffffffffffff828116828216818102831692918115828504821417613b3c57613b3c613382565b50505092915050565b600077ffffffffffffffffffffffffffffffffffffffffffffffff80841680613b7057613b706136c4565b9216919091049291505056fea2646970667358221220673ba775a9e9027f7796ba830c6cc31583ba0bdffbfd7ffbf013c44b6ee8d08b64736f6c634300081700330000000000000000000000007b79995e5f793a07bc00c21412e50ecae098e7f90000000000000000000000000227628f3f023bb0b980b67d528571c95c6dac1c000000000000000000000000992f9e3a81c77cb940a29311558343e1ac66c40f0000000000000000000000001e4c8dffe8d72aeb63e8ddbe9ef89bc368cbbe99", + "gas": "3920428", + "operation": 0, + "requireSuccess": true + } + ], + "sphinxConfig": { + "projectName": "nana-buyback-hook-testnet", + "orgId": "my-org-id", + "owners": [ + "0xba5ed94ab173e1242638F28d1449b24F1A883292" + ], + "mainnets": [ + "ethereum", + "optimism", + "base", + "arbitrum" + ], + "testnets": [ + "ethereum_sepolia", + "optimism_sepolia", + "base_sepolia", + "arbitrum_sepolia" + ], + "threshold": "1", + "saltNonce": "15" + }, + "executionMode": 2, + "initialState": { + "isSafeDeployed": true, + "isModuleDeployed": true, + "isExecuting": false + }, + "unlabeledContracts": [], + "arbitraryChain": false, + "libraries": [], + "gitCommit": "9caaedd7d4d116463c4ceecb3147a8863f806dab", + "safeInitData": null +} \ No newline at end of file diff --git a/lib/sphinx b/lib/sphinx index 97885f0..5fb24a8 160000 --- a/lib/sphinx +++ b/lib/sphinx @@ -1 +1 @@ -Subproject commit 97885f07476808154864abdc8ea961e6163054d0 +Subproject commit 5fb24a825f46bd6ae0b5359fe0da1d2346126b09 diff --git a/package-lock.json b/package-lock.json index b14bd5e..779ee44 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,15 @@ { "name": "@bananapus/buyback-hook", - "version": "0.0.16", + "version": "0.0.18", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@bananapus/buyback-hook", - "version": "0.0.16", + "version": "0.0.18", "license": "MIT", "dependencies": { - "@bananapus/core": "^0.0.24", + "@bananapus/core": "^0.0.25", "@bananapus/permission-ids": "^0.0.11", "@exhausted-pigeon/uniswap-v3-forge-quoter": "^1.0.1", "@openzeppelin/contracts": "^5.0.2", @@ -238,14 +238,14 @@ } }, "node_modules/@bananapus/core": { - "version": "0.0.24", - "resolved": "https://registry.npmjs.org/@bananapus/core/-/core-0.0.24.tgz", - "integrity": "sha512-T2780FbyIT5fum6H6GNPZyYjK/Jb1oGagN1alkJgiRooHsBByJGqSZGmPzz1mND+RoBEqfZmG2weHHoLV+Z55Q==", + "version": "0.0.25", + "resolved": "https://registry.npmjs.org/@bananapus/core/-/core-0.0.25.tgz", + "integrity": "sha512-0bY58vMIxqLvr9Q3rir486ERE5/tZ1jwmqGX4YYIzJ8q3kIGDsg7nFx9z5P3leyu7ml4ROyBrrHtzprRsIV57w==", "dependencies": { "@bananapus/permission-ids": "^0.0.11", "@chainlink/contracts": "^1.1.1", "@openzeppelin/contracts": "^5.0.2", - "@prb/math": "^4.0.2", + "@prb/math": "^4.0.3", "@uniswap/permit2": "github:Uniswap/permit2" }, "engines": { @@ -2830,9 +2830,9 @@ } }, "node_modules/@prb/math": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@prb/math/-/math-4.0.2.tgz", - "integrity": "sha512-kJgqvXR6iyU7+N959RzggSFhBdnRuSDnc/bs8u6MzdWw7aYIUaAr+uMVdpP6Dheypjerd7sfJgFOs19FRFhscg==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@prb/math/-/math-4.0.3.tgz", + "integrity": "sha512-/RSt3VU1k2m3ox6U6kUL1MrktnAHr8vhydXu4eDtqFAms1gm3XnGpoZIPaK1lm2zdJQmKBwJ4EXALPARsuOlaA==" }, "node_modules/@scroll-tech/contracts": { "version": "0.1.0", diff --git a/package.json b/package.json index 9f36aac..dcd409b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@bananapus/buyback-hook", - "version": "0.0.17", + "version": "0.0.18", "license": "MIT", "repository": { "type": "git", @@ -18,7 +18,7 @@ "artifacts": "source ./.env && npx sphinx artifacts --org-id 'my-org-id' --project-name 'nana-buyback-hook-testnet'" }, "dependencies": { - "@bananapus/core": "^0.0.24", + "@bananapus/core": "^0.0.25", "@bananapus/permission-ids": "^0.0.11", "@exhausted-pigeon/uniswap-v3-forge-quoter": "^1.0.1", "@openzeppelin/contracts": "^5.0.2", @@ -28,4 +28,4 @@ "devDependencies": { "@sphinx-labs/plugins": "^0.33.0" } -} \ No newline at end of file +} diff --git a/sphinx.lock b/sphinx.lock index 811aa0b..0894b54 100644 --- a/sphinx.lock +++ b/sphinx.lock @@ -62,6 +62,54 @@ "threshold": "1", "saltNonce": "15" } + }, + "croptop-core-testnet": { + "projectId": "clyuky6v0000a67s7aowica7c", + "projectName": "croptop-core-testnet", + "defaultSafe": { + "safeName": "croptop-core-testnet", + "owners": [ + "0xba5ed94ab173e1242638F28d1449b24F1A883292" + ], + "threshold": "1", + "saltNonce": "16" + } + }, + "revnet-core-testnet": { + "projectId": "clyumk10p000c67s7afwg4uaj", + "projectName": "revnet-core-testnet", + "defaultSafe": { + "safeName": "revnet-core-testnet", + "owners": [ + "0xba5ed94ab173e1242638F28d1449b24F1A883292" + ], + "threshold": "1", + "saltNonce": "17" + } + }, + "nana-fee-project": { + "projectId": "clyupado1000e67s7ayg92n30", + "projectName": "nana-fee-project", + "defaultSafe": { + "safeName": "nana-fee-project", + "owners": [ + "0xba5ed94ab173e1242638F28d1449b24F1A883292" + ], + "threshold": "1", + "saltNonce": "18" + } + }, + "bannyverse-core-testnet": { + "projectId": "clyuqpudp000g67s78c926yd8", + "projectName": "bannyverse-core-testnet", + "defaultSafe": { + "safeName": "bannyverse-core-testnet", + "owners": [ + "0xba5ed94ab173e1242638F28d1449b24F1A883292" + ], + "threshold": "1", + "saltNonce": "19" + } } } } \ No newline at end of file