ETH Price: $1,882.51 (-0.58%)
Gas: 0.51 Gwei

Transaction Decoder

Block:
22031281 at Mar-12-2025 02:07:35 PM +UTC
Transaction Fee:
0.000328485740504664 ETH $0.62
Gas Used:
172,824 Gas / 1.900695161 Gwei

Emitted Events:

569 0xca9de1f80df74331c5fcb7eee2d05e746d47bfb2.0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef( 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef, 0x0000000000000000000000007d6ab2127e06e339af0f306b7878fa32c62a81ed, 0x0000000000000000000000000000000000000000000000000000000000000000, 000000000000000000000000000000000000000000000000018a59e972118000 )
570 Diamond.0x8455ae6be5d92f1df1c3c1484388e247a36c7e60d72055ae216dbc258f257d4b( 0x8455ae6be5d92f1df1c3c1484388e247a36c7e60d72055ae216dbc258f257d4b, 0x0000000000000000000000007d6ab2127e06e339af0f306b7878fa32c62a81ed, 000000000000000000000000000000000000000000000000018d2dd2c2c1620f )

Account State Difference:

  Address   Before After State Difference Code
0x4315990D...03FA1126f 194.687642703073308115 Eth194.575846754085342148 Eth0.111795948987965967
0x7D6aB212...2c62A81eD
0.011665988124007351 Eth
Nonce: 295
0.123133451371468654 Eth
Nonce: 296
0.111467463247461303
(beaverbuild)
13.301911604413580803 Eth13.302040975739293243 Eth0.00012937132571244
0xCA9de1F8...46d47BFb2

Execution Trace

Diamond.735fd189( )
  • 0x92ecc5deacb14937867686ca8b85dd8a65b74704.735fd189( )
    • 0xca9de1f80df74331c5fcb7eee2d05e746d47bfb2.70a08231( )
    • 0xca9de1f80df74331c5fcb7eee2d05e746d47bfb2.STATICCALL( )
    • Diamond.13ef789e( )
      • InvestmentManagerFacet.getTotalAssetBalance( asset=0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE ) => ( totalBalance=821398329788494098264 )
        • Diamond.b0549676( )
          • InvestmentManagerFacet.delegateBySelf( providerAddress=0x23310B0523843c290bBaDAF0B8bBD321c3E39c62, callData=0x5373433F000000000000000000000000EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE ) => ( 0x000000000000000000000000000000000000000000000021F95BA172DB7EC185 )
            • LidoProvider.getAssetBalance( asset=0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE ) => ( 626710687085420790149 )
            • Diamond.001bf8f6( )
              • InvestmentManagerFacet.getRemainingBalance( asset=0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE ) => ( 194687642703073308115 )
              • 0xca9de1f80df74331c5fcb7eee2d05e746d47bfb2.9dc29fac( )
              • ETH 0.111795948987965967 0x7d6ab2127e06e339af0f306b7878fa32c62a81ed.CALL( )
                File 1 of 3: Diamond
                // SPDX-License-Identifier: Apache-2.0.
                pragma solidity ^0.8.24;
                import {LibDiamond} from "./libraries/LibDiamond.sol";
                import {IDiamondCut} from "./interfaces/IDiamondCut.sol";
                contract Diamond {
                  constructor(address _contractOwner, address _diamondCutFacet) payable {
                    LibDiamond.setContractOwner(_contractOwner);
                    // Add the diamondCut external function from the diamondCutFacet
                    IDiamondCut.FacetCut[] memory cut = new IDiamondCut.FacetCut[](1);
                    bytes4[] memory functionSelectors = new bytes4[](1);
                    functionSelectors[0] = IDiamondCut.diamondCut.selector;
                    cut[0] = IDiamondCut.FacetCut({
                      facetAddress: _diamondCutFacet,
                      action: IDiamondCut.FacetCutAction.Add,
                      functionSelectors: functionSelectors
                    });
                    LibDiamond.diamondCut(cut, address(0), "");
                  }
                  // Find facet for function that is called and execute the
                  // function if a facet is found and return any value.
                  fallback() external payable {
                    LibDiamond.DiamondStorage storage ds;
                    bytes32 position = LibDiamond.DIAMOND_STORAGE_POSITION;
                    // get diamond storage
                    assembly {
                      ds.slot := position
                    }
                    // get facet from function selector
                    address facet = ds.selectorToFacetAndPosition[msg.sig].facetAddress;
                    require(facet != address(0), "Diamond: Function does not exist");
                    // Execute external function from facet using delegatecall and return any value.
                    assembly {
                      // copy function selector and any arguments
                      calldatacopy(0, 0, calldatasize())
                      // execute function call using the facet
                      let result := delegatecall(gas(), facet, 0, calldatasize(), 0, 0)
                      // get any return value
                      returndatacopy(0, 0, returndatasize())
                      // return any return value or error back to the caller
                      switch result
                      case 0 {
                        revert(0, returndatasize())
                      }
                      default {
                        return(0, returndatasize())
                      }
                    }
                  }
                  receive() external payable {}
                }
                // SPDX-License-Identifier: Apache-2.0.
                pragma solidity ^0.8.24;
                /******************************************************************************\\
                * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen)
                * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
                /******************************************************************************/
                interface IDiamondCut {
                  enum FacetCutAction {
                    Add,
                    Replace,
                    Remove
                  }
                  // Add=0, Replace=1, Remove=2
                  struct FacetCut {
                    address facetAddress;
                    FacetCutAction action;
                    bytes4[] functionSelectors;
                  }
                  /// @notice Add/replace/remove any number of functions and optionally execute
                  ///         a function with delegatecall
                  /// @param _diamondCut Contains the facet addresses and function selectors
                  /// @param _init The address of the contract or facet to execute _calldata
                  /// @param _calldata A function call, including function selector and arguments
                  ///                  _calldata is executed with delegatecall on _init
                  function diamondCut(
                    FacetCut[] calldata _diamondCut,
                    address _init,
                    bytes calldata _calldata
                  ) external;
                  event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);
                }
                // SPDX-License-Identifier: Apache-2.0.
                pragma solidity ^0.8.24;
                /******************************************************************************\\
                * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen)
                * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
                /******************************************************************************/
                import {IDiamondCut} from "../interfaces/IDiamondCut.sol";
                // Remember to add the loupe functions from DiamondLoupeFacet to the diamond.
                // The loupe functions are required by the EIP2535 Diamonds standard
                error InitializationFunctionReverted(
                  address _initializationContractAddress,
                  bytes _calldata
                );
                library LibDiamond {
                  bytes32 constant DIAMOND_STORAGE_POSITION =
                    keccak256("diamond.standard.diamond.storage");
                  struct FacetAddressAndPosition {
                    address facetAddress;
                    uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array
                  }
                  struct FacetFunctionSelectors {
                    bytes4[] functionSelectors;
                    uint256 facetAddressPosition; // position of facetAddress in facetAddresses array
                  }
                  struct DiamondStorage {
                    // maps function selector to the facet address and
                    // the position of the selector in the facetFunctionSelectors.selectors array
                    mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition;
                    // maps facet addresses to function selectors
                    mapping(address => FacetFunctionSelectors) facetFunctionSelectors;
                    // facet addresses
                    address[] facetAddresses;
                    // Used to query if a contract implements an interface.
                    // Used to implement ERC-165.
                    mapping(bytes4 => bool) supportedInterfaces;
                    // owner of the contract
                    address contractOwner;
                  }
                  function diamondStorage() internal pure returns (DiamondStorage storage ds) {
                    bytes32 position = DIAMOND_STORAGE_POSITION;
                    assembly {
                      ds.slot := position
                    }
                  }
                  event OwnershipTransferred(
                    address indexed previousOwner,
                    address indexed newOwner
                  );
                  function setContractOwner(address _newOwner) internal {
                    DiamondStorage storage ds = diamondStorage();
                    address previousOwner = ds.contractOwner;
                    ds.contractOwner = _newOwner;
                    emit OwnershipTransferred(previousOwner, _newOwner);
                  }
                  function contractOwner() internal view returns (address contractOwner_) {
                    contractOwner_ = diamondStorage().contractOwner;
                  }
                  function enforceIsContractOwner() internal view {
                    require(
                      msg.sender == diamondStorage().contractOwner,
                      "LibDiamond: Must be contract owner"
                    );
                  }
                  event DiamondCut(
                    IDiamondCut.FacetCut[] _diamondCut,
                    address _init,
                    bytes _calldata
                  );
                  // Internal function version of diamondCut
                  function diamondCut(
                    IDiamondCut.FacetCut[] memory _diamondCut,
                    address _init,
                    bytes memory _calldata
                  ) internal {
                    for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) {
                      IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action;
                      if (action == IDiamondCut.FacetCutAction.Add) {
                        addFunctions(
                          _diamondCut[facetIndex].facetAddress,
                          _diamondCut[facetIndex].functionSelectors
                        );
                      } else if (action == IDiamondCut.FacetCutAction.Replace) {
                        replaceFunctions(
                          _diamondCut[facetIndex].facetAddress,
                          _diamondCut[facetIndex].functionSelectors
                        );
                      } else if (action == IDiamondCut.FacetCutAction.Remove) {
                        removeFunctions(
                          _diamondCut[facetIndex].facetAddress,
                          _diamondCut[facetIndex].functionSelectors
                        );
                      } else {
                        revert("LibDiamondCut: Incorrect FacetCutAction");
                      }
                    }
                    emit DiamondCut(_diamondCut, _init, _calldata);
                    initializeDiamondCut(_init, _calldata);
                  }
                  function addFunctions(
                    address _facetAddress,
                    bytes4[] memory _functionSelectors
                  ) internal {
                    require(
                      _functionSelectors.length > 0,
                      "LibDiamondCut: No selectors in facet to cut"
                    );
                    DiamondStorage storage ds = diamondStorage();
                    require(
                      _facetAddress != address(0),
                      "LibDiamondCut: Add facet can't be address(0)"
                    );
                    uint96 selectorPosition = uint96(
                      ds.facetFunctionSelectors[_facetAddress].functionSelectors.length
                    );
                    // add new facet address if it does not exist
                    if (selectorPosition == 0) {
                      addFacet(ds, _facetAddress);
                    }
                    for (
                      uint256 selectorIndex;
                      selectorIndex < _functionSelectors.length;
                      selectorIndex++
                    ) {
                      bytes4 selector = _functionSelectors[selectorIndex];
                      address oldFacetAddress = ds
                        .selectorToFacetAndPosition[selector]
                        .facetAddress;
                      require(
                        oldFacetAddress == address(0),
                        "LibDiamondCut: Can't add function that already exists"
                      );
                      addFunction(ds, selector, selectorPosition, _facetAddress);
                      selectorPosition++;
                    }
                  }
                  function replaceFunctions(
                    address _facetAddress,
                    bytes4[] memory _functionSelectors
                  ) internal {
                    require(
                      _functionSelectors.length > 0,
                      "LibDiamondCut: No selectors in facet to cut"
                    );
                    DiamondStorage storage ds = diamondStorage();
                    require(
                      _facetAddress != address(0),
                      "LibDiamondCut: Add facet can't be address(0)"
                    );
                    uint96 selectorPosition = uint96(
                      ds.facetFunctionSelectors[_facetAddress].functionSelectors.length
                    );
                    // add new facet address if it does not exist
                    if (selectorPosition == 0) {
                      addFacet(ds, _facetAddress);
                    }
                    for (
                      uint256 selectorIndex;
                      selectorIndex < _functionSelectors.length;
                      selectorIndex++
                    ) {
                      bytes4 selector = _functionSelectors[selectorIndex];
                      address oldFacetAddress = ds
                        .selectorToFacetAndPosition[selector]
                        .facetAddress;
                      require(
                        oldFacetAddress != _facetAddress,
                        "LibDiamondCut: Can't replace function with same function"
                      );
                      removeFunction(ds, oldFacetAddress, selector);
                      addFunction(ds, selector, selectorPosition, _facetAddress);
                      selectorPosition++;
                    }
                  }
                  function removeFunctions(
                    address _facetAddress,
                    bytes4[] memory _functionSelectors
                  ) internal {
                    require(
                      _functionSelectors.length > 0,
                      "LibDiamondCut: No selectors in facet to cut"
                    );
                    DiamondStorage storage ds = diamondStorage();
                    // if function does not exist then do nothing and return
                    require(
                      _facetAddress == address(0),
                      "LibDiamondCut: Remove facet address must be address(0)"
                    );
                    for (
                      uint256 selectorIndex;
                      selectorIndex < _functionSelectors.length;
                      selectorIndex++
                    ) {
                      bytes4 selector = _functionSelectors[selectorIndex];
                      address oldFacetAddress = ds
                        .selectorToFacetAndPosition[selector]
                        .facetAddress;
                      removeFunction(ds, oldFacetAddress, selector);
                    }
                  }
                  function addFacet(DiamondStorage storage ds, address _facetAddress) internal {
                    enforceHasContractCode(
                      _facetAddress,
                      "LibDiamondCut: New facet has no code"
                    );
                    ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds
                      .facetAddresses
                      .length;
                    ds.facetAddresses.push(_facetAddress);
                  }
                  function addFunction(
                    DiamondStorage storage ds,
                    bytes4 _selector,
                    uint96 _selectorPosition,
                    address _facetAddress
                  ) internal {
                    ds
                      .selectorToFacetAndPosition[_selector]
                      .functionSelectorPosition = _selectorPosition;
                    ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector);
                    ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress;
                  }
                  function removeFunction(
                    DiamondStorage storage ds,
                    address _facetAddress,
                    bytes4 _selector
                  ) internal {
                    require(
                      _facetAddress != address(0),
                      "LibDiamondCut: Can't remove function that doesn't exist"
                    );
                    // an immutable function is a function defined directly in a diamond
                    require(
                      _facetAddress != address(this),
                      "LibDiamondCut: Can't remove immutable function"
                    );
                    // replace selector with last selector, then delete last selector
                    uint256 selectorPosition = ds
                      .selectorToFacetAndPosition[_selector]
                      .functionSelectorPosition;
                    uint256 lastSelectorPosition = ds
                      .facetFunctionSelectors[_facetAddress]
                      .functionSelectors
                      .length - 1;
                    // if not the same then replace _selector with lastSelector
                    if (selectorPosition != lastSelectorPosition) {
                      bytes4 lastSelector = ds
                        .facetFunctionSelectors[_facetAddress]
                        .functionSelectors[lastSelectorPosition];
                      ds.facetFunctionSelectors[_facetAddress].functionSelectors[
                        selectorPosition
                      ] = lastSelector;
                      ds
                        .selectorToFacetAndPosition[lastSelector]
                        .functionSelectorPosition = uint96(selectorPosition);
                    }
                    // delete the last selector
                    ds.facetFunctionSelectors[_facetAddress].functionSelectors.pop();
                    delete ds.selectorToFacetAndPosition[_selector];
                    // if no more selectors for facet address then delete the facet address
                    if (lastSelectorPosition == 0) {
                      // replace facet address with last facet address and delete last facet address
                      uint256 lastFacetAddressPosition = ds.facetAddresses.length - 1;
                      uint256 facetAddressPosition = ds
                        .facetFunctionSelectors[_facetAddress]
                        .facetAddressPosition;
                      if (facetAddressPosition != lastFacetAddressPosition) {
                        address lastFacetAddress = ds.facetAddresses[lastFacetAddressPosition];
                        ds.facetAddresses[facetAddressPosition] = lastFacetAddress;
                        ds
                          .facetFunctionSelectors[lastFacetAddress]
                          .facetAddressPosition = facetAddressPosition;
                      }
                      ds.facetAddresses.pop();
                      delete ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;
                    }
                  }
                  function initializeDiamondCut(
                    address _init,
                    bytes memory _calldata
                  ) internal {
                    if (_init == address(0)) {
                      return;
                    }
                    enforceHasContractCode(_init, "LibDiamondCut: _init address has no code");
                    (bool success, bytes memory error) = _init.delegatecall(_calldata);
                    if (!success) {
                      if (error.length > 0) {
                        // bubble up error
                        /// @solidity memory-safe-assembly
                        assembly {
                          let returndata_size := mload(error)
                          revert(add(32, error), returndata_size)
                        }
                      } else {
                        revert InitializationFunctionReverted(_init, _calldata);
                      }
                    }
                  }
                  function enforceHasContractCode(
                    address _contract,
                    string memory _errorMessage
                  ) internal view {
                    uint256 contractSize;
                    assembly {
                      contractSize := extcodesize(_contract)
                    }
                    require(contractSize > 0, _errorMessage);
                  }
                }
                

                File 2 of 3: InvestmentManagerFacet
                // SPDX-License-Identifier: MIT
                // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
                pragma solidity ^0.8.20;
                /**
                 * @dev Interface of the ERC20 standard as defined in the EIP.
                 */
                interface IERC20 {
                    /**
                     * @dev Emitted when `value` tokens are moved from one account (`from`) to
                     * another (`to`).
                     *
                     * Note that `value` may be zero.
                     */
                    event Transfer(address indexed from, address indexed to, uint256 value);
                    /**
                     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
                     * a call to {approve}. `value` is the new allowance.
                     */
                    event Approval(address indexed owner, address indexed spender, uint256 value);
                    /**
                     * @dev Returns the value of tokens in existence.
                     */
                    function totalSupply() external view returns (uint256);
                    /**
                     * @dev Returns the value of tokens owned by `account`.
                     */
                    function balanceOf(address account) external view returns (uint256);
                    /**
                     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
                     *
                     * Returns a boolean value indicating whether the operation succeeded.
                     *
                     * Emits a {Transfer} event.
                     */
                    function transfer(address to, uint256 value) external returns (bool);
                    /**
                     * @dev Returns the remaining number of tokens that `spender` will be
                     * allowed to spend on behalf of `owner` through {transferFrom}. This is
                     * zero by default.
                     *
                     * This value changes when {approve} or {transferFrom} are called.
                     */
                    function allowance(address owner, address spender) external view returns (uint256);
                    /**
                     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
                     * caller's tokens.
                     *
                     * Returns a boolean value indicating whether the operation succeeded.
                     *
                     * IMPORTANT: Beware that changing an allowance with this method brings the risk
                     * that someone may use both the old and the new allowance by unfortunate
                     * transaction ordering. One possible solution to mitigate this race
                     * condition is to first reduce the spender's allowance to 0 and set the
                     * desired value afterwards:
                     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
                     *
                     * Emits an {Approval} event.
                     */
                    function approve(address spender, uint256 value) external returns (bool);
                    /**
                     * @dev Moves a `value` amount of tokens from `from` to `to` using the
                     * allowance mechanism. `value` is then deducted from the caller's
                     * allowance.
                     *
                     * Returns a boolean value indicating whether the operation succeeded.
                     *
                     * Emits a {Transfer} event.
                     */
                    function transferFrom(address from, address to, uint256 value) external returns (bool);
                }
                // SPDX-License-Identifier: Apache-2.0.
                pragma solidity ^0.8.24;
                import {Ownable} from "../../utils/Ownable.sol";
                import {LibAddress} from "../../libraries/LibAddress.sol";
                import {IERC20Detailed} from "../../interfaces/IERC20Detailed.sol";
                import {ILiquidityProvider} from "../../interfaces/ILiquidityProvider.sol";
                import {IInvestmentManagerDelegated} from "../../interfaces/IInvestmentManagerDelegated.sol";
                import "hardhat/console.sol";
                contract InvestmentManagerFacet is Ownable {
                  using LibAddress for address;
                  address constant NATIVE_ETH_ADDRESS =
                    0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
                  event OperatorRegistered(address indexed operator);
                  event OperatorRemoved(address indexed operator);
                  event ProviderAdded(address indexed provider);
                  event ProviderRemoved(address indexed provider);
                  event AssetPoolsEnabled(address indexed provider, address[] assets);
                  event AssetPoolsDisabled(address indexed provider, address[] assets);
                  event MinimumReserveRatioUpdated(uint256 minimumReserveRatio);
                  event investmentReserveRatioUpdated(uint256 investmentReserveRatio);
                  bytes32 constant INVESTMENTMANAGERFACET_STORAGE_POSITION =
                    keccak256("diamond.standard.investmentManagerFacet.storage");
                  struct IMStorage {
                    uint256 minimumReserveRatio;
                    uint256 investmentReserveRatio;
                    bool isInitialized;
                    mapping(address => bool) isOperator;
                    mapping(address => uint256) providerIndexPlusOne;
                    address[] providers;
                    mapping(address => mapping(address => bool)) isAssetPoolEnabled;
                  }
                  function _iMStorage() internal pure returns (IMStorage storage ds) {
                    bytes32 position = INVESTMENTMANAGERFACET_STORAGE_POSITION;
                    assembly {
                      ds.slot := position
                    }
                  }
                  function minimumReserveRatio() public view returns (uint256) {
                    return _iMStorage().minimumReserveRatio;
                  }
                  function investmentReserveRatio() public view returns (uint256) {
                    return _iMStorage().investmentReserveRatio;
                  }
                  function isInitialized() public view returns (bool) {
                    return _iMStorage().isInitialized;
                  }
                  function isOperator(address operator) public view returns (bool) {
                    return _iMStorage().isOperator[operator];
                  }
                  function providerIndexPlusOne(
                    address providerAddress
                  ) public view returns (uint) {
                    return _iMStorage().providerIndexPlusOne[providerAddress];
                  }
                  function providers() public view returns (address[] memory) {
                    return _iMStorage().providers;
                  }
                  function providerByIndex(uint256 index) public view returns (address) {
                    return _iMStorage().providers[index];
                  }
                  function isAssetPoolEnabled(
                    address providerAddress,
                    address asset
                  ) public view returns (bool) {
                    return _iMStorage().isAssetPoolEnabled[providerAddress][asset];
                  }
                  function investmentManagerInit(
                    address operator,
                    uint256 _minimumReserveRatio,
                    uint256 _investmentReserveRatio
                  ) external onlyOwner {
                    IMStorage storage ds = _iMStorage();
                    require(!ds.isInitialized, "InvestmentManagerInit: Already initialized");
                    require(_investmentReserveRatio >= _minimumReserveRatio, "Invalid ratios");
                    ds.minimumReserveRatio = _minimumReserveRatio;
                    ds.investmentReserveRatio = _investmentReserveRatio;
                    ds.isOperator[operator] = true;
                    ds.isInitialized = true;
                  }
                  modifier onlyOperator() {
                    require(isOperator(msg.sender), "Caller is not an operator");
                    _;
                  }
                  modifier onlyAssetPoolEnabled(address providerAddress, address asset) {
                    require(
                      isAssetPoolEnabled(providerAddress, asset),
                      "Asset pool not enabled"
                    );
                    _;
                  }
                  function registerOperator(address operator) external onlyOwner {
                    IMStorage storage ds = _iMStorage();
                    ds.isOperator[operator] = true;
                    emit OperatorRegistered(operator);
                  }
                  function unregisterOperator(address operator) external onlyOwner {
                    IMStorage storage ds = _iMStorage();
                    ds.isOperator[operator] = false;
                    emit OperatorRemoved(operator);
                  }
                  function updateMinimumReserveRatio(
                    uint256 _minimumReserveRatio
                  ) external onlyOwner {
                    IMStorage storage ds = _iMStorage();
                    require(
                      ds.investmentReserveRatio >= _minimumReserveRatio,
                      "Invalid ratios"
                    );
                    ds.minimumReserveRatio = _minimumReserveRatio;
                    emit MinimumReserveRatioUpdated(_minimumReserveRatio);
                  }
                  function updateInvestmentReserveRatio(
                    uint256 _investmentReserveRatio
                  ) external onlyOwner {
                    IMStorage storage ds = _iMStorage();
                    require(
                      _investmentReserveRatio >= ds.minimumReserveRatio,
                      "Invalid ratios"
                    );
                    ds.investmentReserveRatio = _investmentReserveRatio;
                    emit investmentReserveRatioUpdated(_investmentReserveRatio);
                  }
                  function addProvider(
                    address providerAddress,
                    bytes[] memory params
                  ) external onlyOwner {
                    IMStorage storage ds = _iMStorage();
                    require(
                      ds.providerIndexPlusOne[providerAddress] == 0,
                      "Provider already added"
                    );
                    bytes memory providerIsInitializedCallData = abi.encodeWithSelector(
                      ILiquidityProvider.isInitialized.selector
                    );
                    bool providerIsInitialized = abi.decode(
                      _delegateToProvider(providerAddress, providerIsInitializedCallData),
                      (bool)
                    );
                    if (!providerIsInitialized) {
                      bytes memory providerInitializeCallData = abi.encodeWithSelector(
                        ILiquidityProvider.initialize.selector,
                        params
                      );
                      _delegateToProvider(providerAddress, providerInitializeCallData);
                    }
                    ds.providers.push(providerAddress); // Add address to the array
                    ds.providerIndexPlusOne[providerAddress] = ds.providers.length; // Map to its index plus one
                    emit ProviderAdded(providerAddress);
                  }
                  function removeProvider(address providerAddress) external onlyOwner {
                    IMStorage storage ds = _iMStorage();
                    uint256 indexPlusOne = ds.providerIndexPlusOne[providerAddress];
                    require(indexPlusOne != 0, "Provider does not exist");
                    uint256 index = indexPlusOne - 1; // Subtract one to get the actual array index
                    if (index != ds.providers.length - 1) {
                      // If it is not the last element in the array
                      address lastProvider = ds.providers[ds.providers.length - 1];
                      ds.providers[index] = lastProvider; // Move the last element to the deleted element's position
                      ds.providerIndexPlusOne[lastProvider] = index + 1; // Update the mapping, adding one because we store index plus one
                    }
                    ds.providers.pop(); // Remove the last element of the array
                    delete ds.providerIndexPlusOne[providerAddress]; // Remove the element from the mapping
                    emit ProviderRemoved(providerAddress);
                  }
                  function isProvider(address providerAddress) public view returns (bool) {
                    return providerIndexPlusOne(providerAddress) != 0;
                  }
                  function enableAssetPoolsForProvider(
                    address providerAddress,
                    address[] memory assets
                  ) external onlyOwner {
                    IMStorage storage ds = _iMStorage();
                    for (uint256 i = 0; i < assets.length; i++) {
                      ds.isAssetPoolEnabled[providerAddress][assets[i]] = true;
                    }
                    emit AssetPoolsEnabled(providerAddress, assets);
                  }
                  function disableAssetPoolsForProvider(
                    address providerAddress,
                    address[] memory assets
                  ) external onlyOwner {
                    IMStorage storage ds = _iMStorage();
                    for (uint256 i = 0; i < assets.length; i++) {
                      ds.isAssetPoolEnabled[providerAddress][assets[i]] = false;
                    }
                    emit AssetPoolsDisabled(providerAddress, assets);
                  }
                  function getRemainingBalance(address asset) public view returns (uint256) {
                    if (asset == NATIVE_ETH_ADDRESS) {
                      return address(this).balance;
                    } else {
                      return IERC20Detailed(asset).balanceOf(address(this));
                    }
                  }
                  function _delegateToProvider(
                    address providerAddress,
                    bytes memory callData
                  ) internal returns (bytes memory) {
                    (bool success, bytes memory returndata) = providerAddress.delegatecall(
                      callData
                    );
                    if (!success) {
                      if (returndata.length > 0) {
                        assembly {
                          let returndata_size := mload(returndata)
                          revert(add(32, returndata), returndata_size)
                        }
                      } else {
                        revert("delegatecall failed with no data");
                      }
                    }
                    return returndata;
                  }
                  function delegateBySelf(
                    address providerAddress,
                    bytes memory callData
                  ) public returns (bytes memory) {
                    require(msg.sender == address(this), "Only InvestmentManager can call");
                    bytes memory returndata = _delegateToProvider(providerAddress, callData);
                    return returndata;
                  }
                  function _staticToProvider(
                    address providerAddress,
                    bytes memory callData
                  ) internal view returns (bytes memory) {
                    bytes memory combinedData = abi.encodeWithSelector(
                      IInvestmentManagerDelegated.delegateBySelf.selector,
                      providerAddress,
                      callData
                    );
                    (bool success, bytes memory returndata) = address(this).staticcall(
                      combinedData
                    );
                    require(success, "Staticcall failed");
                    return abi.decode(returndata, (bytes));
                  }
                  function supportedAssets(
                    address providerAddress
                  ) external view returns (address[] memory) {
                    ILiquidityProvider provider = ILiquidityProvider(providerAddress);
                    bytes memory callData = abi.encodeWithSelector(
                      provider.supportedAssets.selector
                    );
                    return
                      abi.decode(_staticToProvider(providerAddress, callData), (address[]));
                  }
                  function canDirectlyWithdraw(
                    address providerAddress,
                    address asset
                  ) public view returns (bool) {
                    bytes memory callData = abi.encodeWithSelector(
                      ILiquidityProvider.canDirectlyWithdraw.selector,
                      asset
                    );
                    return abi.decode(_staticToProvider(providerAddress, callData), (bool));
                  }
                  function getWithdrawalData(
                    address providerAddress,
                    address asset
                  ) public view returns (ILiquidityProvider.WithdrawalData memory) {
                    if (isAssetPoolEnabled(providerAddress, asset)) {
                      bytes memory callData = abi.encodeWithSelector(
                        ILiquidityProvider.getWithdrawalData.selector,
                        asset
                      );
                      return
                        abi.decode(
                          _staticToProvider(providerAddress, callData),
                          (ILiquidityProvider.WithdrawalData)
                        );
                    } else {
                      return ILiquidityProvider.WithdrawalData(0, 0);
                    }
                  }
                  function getAssetBalance(
                    address providerAddress,
                    address asset
                  ) public view returns (uint256) {
                    if (isAssetPoolEnabled(providerAddress, asset)) {
                      bytes memory callData = abi.encodeWithSelector(
                        ILiquidityProvider.getAssetBalance.selector,
                        asset
                      );
                      return
                        abi.decode(_staticToProvider(providerAddress, callData), (uint256));
                    } else {
                      return 0;
                    }
                  }
                  // Function to get the total asset balance for all providers for a specific asset
                  function getTotalAssetBalance(
                    address asset
                  ) public view returns (uint256 totalBalance) {
                    uint256 totalInProviders = 0;
                    for (uint256 i = 0; i < providers().length; i++) {
                      address providerAddress = providerByIndex(i);
                      totalInProviders += getAssetBalance(providerAddress, asset);
                    }
                    return totalInProviders + getRemainingBalance(asset);
                  }
                  function invest(
                    address providerAddress,
                    address asset,
                    uint256 amount
                  ) public onlyOperator onlyAssetPoolEnabled(providerAddress, asset) {
                    require(
                      getRemainingBalance(asset) >=
                        amount + (minimumReserveRatio() * getTotalAssetBalance(asset)) / 10000,
                      "Investment limit reached"
                    );
                    bytes memory data = abi.encodeWithSelector(
                      ILiquidityProvider.invest.selector,
                      asset,
                      amount
                    );
                    _delegateToProvider(providerAddress, data);
                  }
                  function prepareWithdrawal(
                    address providerAddress,
                    address asset,
                    uint256 amount
                  ) public onlyOperator onlyAssetPoolEnabled(providerAddress, asset) {
                    require(
                      !canDirectlyWithdraw(providerAddress, asset),
                      "Should direct withdraw"
                    );
                    bytes memory data = abi.encodeWithSelector(
                      ILiquidityProvider.prepareWithdrawal.selector,
                      asset,
                      amount
                    );
                    _delegateToProvider(providerAddress, data);
                  }
                  function finishWithdrawal(
                    address providerAddress,
                    address asset
                  ) public onlyOperator onlyAssetPoolEnabled(providerAddress, asset) {
                    require(
                      !canDirectlyWithdraw(providerAddress, asset),
                      "Should direct withdraw"
                    );
                    bytes memory data = abi.encodeWithSelector(
                      ILiquidityProvider.finishWithdrawal.selector,
                      asset
                    );
                    _delegateToProvider(providerAddress, data);
                  }
                  function directlyWithdraw(
                    address providerAddress,
                    address asset,
                    uint256 amount
                  ) public onlyOperator onlyAssetPoolEnabled(providerAddress, asset) {
                    require(
                      canDirectlyWithdraw(providerAddress, asset),
                      "Direct withdraw not supported"
                    );
                    bytes memory data = abi.encodeWithSelector(
                      ILiquidityProvider.directlyWithdraw.selector,
                      asset,
                      amount
                    );
                    _delegateToProvider(providerAddress, data);
                  }
                  function emergencyWithdraw(
                    address providerAddress,
                    address asset,
                    uint256 amount
                  ) external onlyOwner onlyAssetPoolEnabled(providerAddress, asset) {
                    require(
                      supportsEmergencyWithdraw(providerAddress, asset),
                      "Emergency withdraw not supported"
                    );
                    bytes memory data = abi.encodeWithSelector(
                      ILiquidityProvider.emergencyWithdraw.selector,
                      asset,
                      amount
                    );
                    _delegateToProvider(providerAddress, data);
                  }
                  function getEarnings(
                    address providerAddress,
                    address asset
                  ) public view onlyAssetPoolEnabled(providerAddress, asset) returns (uint256) {
                    require(supportsEarnings(providerAddress, asset), "Earnings not supported");
                    bytes memory callData = abi.encodeWithSelector(
                      ILiquidityProvider.getEarnings.selector,
                      asset
                    );
                    return abi.decode(_staticToProvider(providerAddress, callData), (uint256));
                  }
                  function reinvest(
                    address providerAddress,
                    address asset,
                    uint256 amount
                  ) external onlyOperator onlyAssetPoolEnabled(providerAddress, asset) {
                    require(supportsEarnings(providerAddress, asset), "Earnings not supported");
                    bytes memory data = abi.encodeWithSelector(
                      ILiquidityProvider.reinvest.selector,
                      asset,
                      amount
                    );
                    _delegateToProvider(providerAddress, data);
                  }
                  function reinvestAllEarnings(
                    address providerAddress,
                    address asset
                  ) public onlyOperator onlyAssetPoolEnabled(providerAddress, asset) {
                    require(supportsEarnings(providerAddress, asset), "Earnings not supported");
                    bytes memory data = abi.encodeWithSelector(
                      ILiquidityProvider.reinvestAllEarnings.selector,
                      asset
                    );
                    _delegateToProvider(providerAddress, data);
                  }
                  function rebalance(
                    address providerAddress,
                    address asset
                  ) external onlyAssetPoolEnabled(providerAddress, asset) {
                    uint256 totalBalance = getTotalAssetBalance(asset);
                    uint256 minimumReserve = (minimumReserveRatio() * totalBalance) / 10000;
                    uint256 investmentReserve = (investmentReserveRatio() * totalBalance) /
                      10000;
                    uint256 investmentThreshold = investmentReserve +
                      (investmentReserve - minimumReserve);
                    uint256 remainingBalance = getRemainingBalance(asset);
                    if (remainingBalance > investmentThreshold) {
                      uint256 amount = remainingBalance - investmentReserve;
                      invest(providerAddress, asset, amount);
                    } else if (remainingBalance < minimumReserve) {
                      uint256 amount = investmentReserve - remainingBalance;
                      if (canDirectlyWithdraw(providerAddress, asset)) {
                        directlyWithdraw(providerAddress, asset, amount);
                      } else {
                        ILiquidityProvider.WithdrawalData
                          memory withdrawalData = getWithdrawalData(providerAddress, asset);
                        uint256 preparingAmount = withdrawalData.preparingAmount;
                        uint256 preparedAmount = withdrawalData.preparedAmount;
                        if (preparedAmount > 0) {
                          amount -= preparedAmount;
                          finishWithdrawal(providerAddress, asset);
                        }
                        if (amount > preparingAmount) {
                          amount -= getWithdrawalData(providerAddress, asset).preparingAmount;
                          prepareWithdrawal(providerAddress, asset, amount);
                        }
                      }
                    }
                  }
                  function supportsEmergencyWithdraw(
                    address providerAddress,
                    address asset
                  ) public view onlyAssetPoolEnabled(providerAddress, asset) returns (bool) {
                    bytes memory callData = abi.encodeWithSelector(
                      ILiquidityProvider.supportsEmergencyWithdraw.selector,
                      asset
                    );
                    return abi.decode(_staticToProvider(providerAddress, callData), (bool));
                  }
                  function supportsEarnings(
                    address providerAddress,
                    address asset
                  ) public view returns (bool) {
                    bytes memory callData = abi.encodeWithSelector(
                      ILiquidityProvider.supportsEarnings.selector,
                      asset
                    );
                    return abi.decode(_staticToProvider(providerAddress, callData), (bool));
                  }
                }
                // SPDX-License-Identifier: Apache-2.0.
                pragma solidity ^0.8.24;
                /******************************************************************************\\
                * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen)
                * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
                /******************************************************************************/
                interface IDiamondCut {
                  enum FacetCutAction {
                    Add,
                    Replace,
                    Remove
                  }
                  // Add=0, Replace=1, Remove=2
                  struct FacetCut {
                    address facetAddress;
                    FacetCutAction action;
                    bytes4[] functionSelectors;
                  }
                  /// @notice Add/replace/remove any number of functions and optionally execute
                  ///         a function with delegatecall
                  /// @param _diamondCut Contains the facet addresses and function selectors
                  /// @param _init The address of the contract or facet to execute _calldata
                  /// @param _calldata A function call, including function selector and arguments
                  ///                  _calldata is executed with delegatecall on _init
                  function diamondCut(
                    FacetCut[] calldata _diamondCut,
                    address _init,
                    bytes calldata _calldata
                  ) external;
                  event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);
                }
                // SPDX-License-Identifier: Apache-2.0.
                pragma solidity ^0.8.24;
                import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
                interface IERC20Detailed is IERC20 {
                  function name() external view returns (string memory);
                  function symbol() external view returns (string memory);
                  function decimals() external view returns (uint8);
                  function allowance(
                    address owner,
                    address spender
                  ) external view returns (uint256);
                }
                // SPDX-License-Identifier: Apache-2.0.
                pragma solidity ^0.8.24;
                import {ILiquidityProvider} from "./ILiquidityProvider.sol";
                interface IInvestmentManagerDelegated {
                  function delegateBySelf(
                    address providerAddress,
                    bytes memory callData
                  ) external returns (bytes memory);
                }
                // SPDX-License-Identifier: Apache-2.0.
                pragma solidity ^0.8.24;
                interface ILiquidityProvider {
                  struct WithdrawalData {
                    uint256 preparingAmount;
                    uint256 preparedAmount;
                  }
                  event Invested(
                    address indexed liquidity,
                    address indexed asset,
                    uint256 amount
                  );
                  event WithdrawalPrepared(
                    address indexed liquidity,
                    address indexed asset,
                    uint256 amount
                  );
                  event WithdrawalFinished(
                    address indexed liquidity,
                    address indexed asset,
                    uint256 amount
                  );
                  event Withdrawed(
                    address indexed liquidity,
                    address indexed asset,
                    uint256 amount
                  );
                  function isInitialized() external view returns (bool);
                  function lidoLocatorAddress() external view returns (address);
                  function initialize(bytes[] memory params) external;
                  function supportedAssets() external view returns (address[] memory);
                  function canDirectlyWithdraw(address asset) external pure returns (bool);
                  // NATIVE_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
                  function getWithdrawalData(
                    address asset
                  ) external view returns (WithdrawalData memory);
                  function getAssetBalance(address asset) external view returns (uint256);
                  function invest(address asset, uint256 amount) external payable;
                  // Some liquidity pools require prepareWithdrawal before withdrawing funds.
                  function prepareWithdrawal(address asset, uint256 amount) external;
                  function finishWithdrawal(address asset) external;
                  function directlyWithdraw(address asset, uint256 amount) external;
                  function supportsEmergencyWithdraw(
                    address asset
                  ) external pure returns (bool);
                  function emergencyWithdraw(address asset, uint256 amount) external;
                  // Only supported in some liquidity pools
                  event Reinvest(address indexed investor, address asset, uint256 amount);
                  function getEarnings(address asset) external view returns (uint256);
                  function supportsEarnings(address asset) external pure returns (bool);
                  function reinvest(address asset, uint256 amount) external;
                  function reinvestAllEarnings(address asset) external;
                }
                // SPDX-License-Identifier: Apache-2.0.
                pragma solidity ^0.8.24;
                import {IERC20Detailed} from "../interfaces/IERC20Detailed.sol";
                library LibAddress {
                  function isContract(address account) internal view returns (bool) {
                    uint256 size;
                    assembly {
                      size := extcodesize(account)
                    }
                    return size > 0;
                  }
                  function performEthTransfer(address recipient, uint256 amount) internal {
                    (bool success, ) = recipient.call{value: amount}(""); // NOLINT: low-level-calls.
                    require(success, "ETH_TRANSFER_FAILED");
                  }
                  /*
                      Safe wrapper around ERC20/ERC721 calls.
                      This is required because many deployed ERC20 contracts don't return a value.
                      See https://github.com/ethereum/solidity/issues/4116.
                    */
                  function safeTokenContractCall(
                    address tokenAddress,
                    bytes memory callData
                  ) internal {
                    require(isContract(tokenAddress), "BAD_TOKEN_ADDRESS");
                    // NOLINTNEXTLINE: low-level-calls.
                    (bool success, bytes memory returndata) = tokenAddress.call(callData);
                    require(success, string(returndata));
                    if (returndata.length > 0) {
                      require(abi.decode(returndata, (bool)), "TOKEN_OPERATION_FAILED");
                    }
                  }
                  function safeTokenTransfer(
                    address tokenAddress,
                    address recipient,
                    uint256 amount
                  ) internal {
                    IERC20Detailed erc20Token = IERC20Detailed(tokenAddress);
                    bytes memory callData = abi.encodeWithSelector(
                      erc20Token.transfer.selector,
                      recipient,
                      amount
                    );
                    uint256 balanceBefore = erc20Token.balanceOf(recipient);
                    safeTokenContractCall(tokenAddress, callData);
                    uint256 balanceAfter = erc20Token.balanceOf(recipient);
                    require(
                      balanceAfter == balanceBefore + amount,
                      "SAFE_TOKEN_TRANSFER_FAILED"
                    );
                  }
                  function safeTokenTransferFrom(
                    address tokenAddress,
                    address sender,
                    address recipient,
                    uint256 amount
                  ) internal {
                    IERC20Detailed erc20Token = IERC20Detailed(tokenAddress);
                    bytes memory callData = abi.encodeWithSelector(
                      erc20Token.transferFrom.selector,
                      sender,
                      recipient,
                      amount
                    );
                    uint256 balanceBefore = erc20Token.balanceOf(recipient);
                    safeTokenContractCall(tokenAddress, callData);
                    uint256 balanceAfter = erc20Token.balanceOf(recipient);
                    require(
                      balanceAfter == balanceBefore + amount,
                      "SAFE_TOKEN_TRANSFER_FAILED"
                    );
                  }
                  /*
                      Validates that the passed contract address is of a real contract,
                      and that its id hash (as infered fromn identify()) matched the expected one.
                    */
                  function validateContractId(
                    address contractAddress,
                    bytes32 expectedIdHash
                  ) internal {
                    require(isContract(contractAddress), "ADDRESS_NOT_CONTRACT");
                    (bool success, bytes memory returndata) = contractAddress.call( // NOLINT: low-level-calls.
                        abi.encodeWithSignature("identify()")
                      );
                    require(success, "FAILED_TO_IDENTIFY_CONTRACT");
                    string memory realContractId = abi.decode(returndata, (string));
                    require(
                      keccak256(abi.encodePacked(realContractId)) == expectedIdHash,
                      "UNEXPECTED_CONTRACT_IDENTIFIER"
                    );
                  }
                }
                // SPDX-License-Identifier: Apache-2.0.
                pragma solidity ^0.8.24;
                /******************************************************************************\\
                * Author: Nick Mudge <[email protected]> (https://twitter.com/mudgen)
                * EIP-2535 Diamonds: https://eips.ethereum.org/EIPS/eip-2535
                /******************************************************************************/
                import {IDiamondCut} from "../interfaces/IDiamondCut.sol";
                // Remember to add the loupe functions from DiamondLoupeFacet to the diamond.
                // The loupe functions are required by the EIP2535 Diamonds standard
                error InitializationFunctionReverted(
                  address _initializationContractAddress,
                  bytes _calldata
                );
                library LibDiamond {
                  bytes32 constant DIAMOND_STORAGE_POSITION =
                    keccak256("diamond.standard.diamond.storage");
                  struct FacetAddressAndPosition {
                    address facetAddress;
                    uint96 functionSelectorPosition; // position in facetFunctionSelectors.functionSelectors array
                  }
                  struct FacetFunctionSelectors {
                    bytes4[] functionSelectors;
                    uint256 facetAddressPosition; // position of facetAddress in facetAddresses array
                  }
                  struct DiamondStorage {
                    // maps function selector to the facet address and
                    // the position of the selector in the facetFunctionSelectors.selectors array
                    mapping(bytes4 => FacetAddressAndPosition) selectorToFacetAndPosition;
                    // maps facet addresses to function selectors
                    mapping(address => FacetFunctionSelectors) facetFunctionSelectors;
                    // facet addresses
                    address[] facetAddresses;
                    // Used to query if a contract implements an interface.
                    // Used to implement ERC-165.
                    mapping(bytes4 => bool) supportedInterfaces;
                    // owner of the contract
                    address contractOwner;
                  }
                  function diamondStorage() internal pure returns (DiamondStorage storage ds) {
                    bytes32 position = DIAMOND_STORAGE_POSITION;
                    assembly {
                      ds.slot := position
                    }
                  }
                  event OwnershipTransferred(
                    address indexed previousOwner,
                    address indexed newOwner
                  );
                  function setContractOwner(address _newOwner) internal {
                    DiamondStorage storage ds = diamondStorage();
                    address previousOwner = ds.contractOwner;
                    ds.contractOwner = _newOwner;
                    emit OwnershipTransferred(previousOwner, _newOwner);
                  }
                  function contractOwner() internal view returns (address contractOwner_) {
                    contractOwner_ = diamondStorage().contractOwner;
                  }
                  function enforceIsContractOwner() internal view {
                    require(
                      msg.sender == diamondStorage().contractOwner,
                      "LibDiamond: Must be contract owner"
                    );
                  }
                  event DiamondCut(
                    IDiamondCut.FacetCut[] _diamondCut,
                    address _init,
                    bytes _calldata
                  );
                  // Internal function version of diamondCut
                  function diamondCut(
                    IDiamondCut.FacetCut[] memory _diamondCut,
                    address _init,
                    bytes memory _calldata
                  ) internal {
                    for (uint256 facetIndex; facetIndex < _diamondCut.length; facetIndex++) {
                      IDiamondCut.FacetCutAction action = _diamondCut[facetIndex].action;
                      if (action == IDiamondCut.FacetCutAction.Add) {
                        addFunctions(
                          _diamondCut[facetIndex].facetAddress,
                          _diamondCut[facetIndex].functionSelectors
                        );
                      } else if (action == IDiamondCut.FacetCutAction.Replace) {
                        replaceFunctions(
                          _diamondCut[facetIndex].facetAddress,
                          _diamondCut[facetIndex].functionSelectors
                        );
                      } else if (action == IDiamondCut.FacetCutAction.Remove) {
                        removeFunctions(
                          _diamondCut[facetIndex].facetAddress,
                          _diamondCut[facetIndex].functionSelectors
                        );
                      } else {
                        revert("LibDiamondCut: Incorrect FacetCutAction");
                      }
                    }
                    emit DiamondCut(_diamondCut, _init, _calldata);
                    initializeDiamondCut(_init, _calldata);
                  }
                  function addFunctions(
                    address _facetAddress,
                    bytes4[] memory _functionSelectors
                  ) internal {
                    require(
                      _functionSelectors.length > 0,
                      "LibDiamondCut: No selectors in facet to cut"
                    );
                    DiamondStorage storage ds = diamondStorage();
                    require(
                      _facetAddress != address(0),
                      "LibDiamondCut: Add facet can't be address(0)"
                    );
                    uint96 selectorPosition = uint96(
                      ds.facetFunctionSelectors[_facetAddress].functionSelectors.length
                    );
                    // add new facet address if it does not exist
                    if (selectorPosition == 0) {
                      addFacet(ds, _facetAddress);
                    }
                    for (
                      uint256 selectorIndex;
                      selectorIndex < _functionSelectors.length;
                      selectorIndex++
                    ) {
                      bytes4 selector = _functionSelectors[selectorIndex];
                      address oldFacetAddress = ds
                        .selectorToFacetAndPosition[selector]
                        .facetAddress;
                      require(
                        oldFacetAddress == address(0),
                        "LibDiamondCut: Can't add function that already exists"
                      );
                      addFunction(ds, selector, selectorPosition, _facetAddress);
                      selectorPosition++;
                    }
                  }
                  function replaceFunctions(
                    address _facetAddress,
                    bytes4[] memory _functionSelectors
                  ) internal {
                    require(
                      _functionSelectors.length > 0,
                      "LibDiamondCut: No selectors in facet to cut"
                    );
                    DiamondStorage storage ds = diamondStorage();
                    require(
                      _facetAddress != address(0),
                      "LibDiamondCut: Add facet can't be address(0)"
                    );
                    uint96 selectorPosition = uint96(
                      ds.facetFunctionSelectors[_facetAddress].functionSelectors.length
                    );
                    // add new facet address if it does not exist
                    if (selectorPosition == 0) {
                      addFacet(ds, _facetAddress);
                    }
                    for (
                      uint256 selectorIndex;
                      selectorIndex < _functionSelectors.length;
                      selectorIndex++
                    ) {
                      bytes4 selector = _functionSelectors[selectorIndex];
                      address oldFacetAddress = ds
                        .selectorToFacetAndPosition[selector]
                        .facetAddress;
                      require(
                        oldFacetAddress != _facetAddress,
                        "LibDiamondCut: Can't replace function with same function"
                      );
                      removeFunction(ds, oldFacetAddress, selector);
                      addFunction(ds, selector, selectorPosition, _facetAddress);
                      selectorPosition++;
                    }
                  }
                  function removeFunctions(
                    address _facetAddress,
                    bytes4[] memory _functionSelectors
                  ) internal {
                    require(
                      _functionSelectors.length > 0,
                      "LibDiamondCut: No selectors in facet to cut"
                    );
                    DiamondStorage storage ds = diamondStorage();
                    // if function does not exist then do nothing and return
                    require(
                      _facetAddress == address(0),
                      "LibDiamondCut: Remove facet address must be address(0)"
                    );
                    for (
                      uint256 selectorIndex;
                      selectorIndex < _functionSelectors.length;
                      selectorIndex++
                    ) {
                      bytes4 selector = _functionSelectors[selectorIndex];
                      address oldFacetAddress = ds
                        .selectorToFacetAndPosition[selector]
                        .facetAddress;
                      removeFunction(ds, oldFacetAddress, selector);
                    }
                  }
                  function addFacet(DiamondStorage storage ds, address _facetAddress) internal {
                    enforceHasContractCode(
                      _facetAddress,
                      "LibDiamondCut: New facet has no code"
                    );
                    ds.facetFunctionSelectors[_facetAddress].facetAddressPosition = ds
                      .facetAddresses
                      .length;
                    ds.facetAddresses.push(_facetAddress);
                  }
                  function addFunction(
                    DiamondStorage storage ds,
                    bytes4 _selector,
                    uint96 _selectorPosition,
                    address _facetAddress
                  ) internal {
                    ds
                      .selectorToFacetAndPosition[_selector]
                      .functionSelectorPosition = _selectorPosition;
                    ds.facetFunctionSelectors[_facetAddress].functionSelectors.push(_selector);
                    ds.selectorToFacetAndPosition[_selector].facetAddress = _facetAddress;
                  }
                  function removeFunction(
                    DiamondStorage storage ds,
                    address _facetAddress,
                    bytes4 _selector
                  ) internal {
                    require(
                      _facetAddress != address(0),
                      "LibDiamondCut: Can't remove function that doesn't exist"
                    );
                    // an immutable function is a function defined directly in a diamond
                    require(
                      _facetAddress != address(this),
                      "LibDiamondCut: Can't remove immutable function"
                    );
                    // replace selector with last selector, then delete last selector
                    uint256 selectorPosition = ds
                      .selectorToFacetAndPosition[_selector]
                      .functionSelectorPosition;
                    uint256 lastSelectorPosition = ds
                      .facetFunctionSelectors[_facetAddress]
                      .functionSelectors
                      .length - 1;
                    // if not the same then replace _selector with lastSelector
                    if (selectorPosition != lastSelectorPosition) {
                      bytes4 lastSelector = ds
                        .facetFunctionSelectors[_facetAddress]
                        .functionSelectors[lastSelectorPosition];
                      ds.facetFunctionSelectors[_facetAddress].functionSelectors[
                        selectorPosition
                      ] = lastSelector;
                      ds
                        .selectorToFacetAndPosition[lastSelector]
                        .functionSelectorPosition = uint96(selectorPosition);
                    }
                    // delete the last selector
                    ds.facetFunctionSelectors[_facetAddress].functionSelectors.pop();
                    delete ds.selectorToFacetAndPosition[_selector];
                    // if no more selectors for facet address then delete the facet address
                    if (lastSelectorPosition == 0) {
                      // replace facet address with last facet address and delete last facet address
                      uint256 lastFacetAddressPosition = ds.facetAddresses.length - 1;
                      uint256 facetAddressPosition = ds
                        .facetFunctionSelectors[_facetAddress]
                        .facetAddressPosition;
                      if (facetAddressPosition != lastFacetAddressPosition) {
                        address lastFacetAddress = ds.facetAddresses[lastFacetAddressPosition];
                        ds.facetAddresses[facetAddressPosition] = lastFacetAddress;
                        ds
                          .facetFunctionSelectors[lastFacetAddress]
                          .facetAddressPosition = facetAddressPosition;
                      }
                      ds.facetAddresses.pop();
                      delete ds.facetFunctionSelectors[_facetAddress].facetAddressPosition;
                    }
                  }
                  function initializeDiamondCut(
                    address _init,
                    bytes memory _calldata
                  ) internal {
                    if (_init == address(0)) {
                      return;
                    }
                    enforceHasContractCode(_init, "LibDiamondCut: _init address has no code");
                    (bool success, bytes memory error) = _init.delegatecall(_calldata);
                    if (!success) {
                      if (error.length > 0) {
                        // bubble up error
                        /// @solidity memory-safe-assembly
                        assembly {
                          let returndata_size := mload(error)
                          revert(add(32, error), returndata_size)
                        }
                      } else {
                        revert InitializationFunctionReverted(_init, _calldata);
                      }
                    }
                  }
                  function enforceHasContractCode(
                    address _contract,
                    string memory _errorMessage
                  ) internal view {
                    uint256 contractSize;
                    assembly {
                      contractSize := extcodesize(_contract)
                    }
                    require(contractSize > 0, _errorMessage);
                  }
                }
                // SPDX-License-Identifier: Apache-2.0.
                pragma solidity ^0.8.24;
                import "../libraries/LibDiamond.sol";
                contract Ownable {
                  modifier onlyOwner() {
                    LibDiamond.enforceIsContractOwner();
                    _;
                  }
                }
                // SPDX-License-Identifier: MIT
                pragma solidity >=0.4.22 <0.9.0;
                library console {
                    address constant CONSOLE_ADDRESS =
                        0x000000000000000000636F6e736F6c652e6c6f67;
                    function _sendLogPayloadImplementation(bytes memory payload) internal view {
                        address consoleAddress = CONSOLE_ADDRESS;
                        /// @solidity memory-safe-assembly
                        assembly {
                            pop(
                                staticcall(
                                    gas(),
                                    consoleAddress,
                                    add(payload, 32),
                                    mload(payload),
                                    0,
                                    0
                                )
                            )
                        }
                    }
                    function _castToPure(
                      function(bytes memory) internal view fnIn
                    ) internal pure returns (function(bytes memory) pure fnOut) {
                        assembly {
                            fnOut := fnIn
                        }
                    }
                    function _sendLogPayload(bytes memory payload) internal pure {
                        _castToPure(_sendLogPayloadImplementation)(payload);
                    }
                    function log() internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log()"));
                    }
                    function logInt(int256 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
                    }
                    function logUint(uint256 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
                    }
                    function logString(string memory p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
                    }
                    function logBool(bool p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
                    }
                    function logAddress(address p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
                    }
                    function logBytes(bytes memory p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
                    }
                    function logBytes1(bytes1 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
                    }
                    function logBytes2(bytes2 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
                    }
                    function logBytes3(bytes3 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
                    }
                    function logBytes4(bytes4 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
                    }
                    function logBytes5(bytes5 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
                    }
                    function logBytes6(bytes6 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
                    }
                    function logBytes7(bytes7 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
                    }
                    function logBytes8(bytes8 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
                    }
                    function logBytes9(bytes9 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
                    }
                    function logBytes10(bytes10 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
                    }
                    function logBytes11(bytes11 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
                    }
                    function logBytes12(bytes12 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
                    }
                    function logBytes13(bytes13 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
                    }
                    function logBytes14(bytes14 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
                    }
                    function logBytes15(bytes15 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
                    }
                    function logBytes16(bytes16 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
                    }
                    function logBytes17(bytes17 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
                    }
                    function logBytes18(bytes18 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
                    }
                    function logBytes19(bytes19 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
                    }
                    function logBytes20(bytes20 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
                    }
                    function logBytes21(bytes21 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
                    }
                    function logBytes22(bytes22 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
                    }
                    function logBytes23(bytes23 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
                    }
                    function logBytes24(bytes24 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
                    }
                    function logBytes25(bytes25 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
                    }
                    function logBytes26(bytes26 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
                    }
                    function logBytes27(bytes27 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
                    }
                    function logBytes28(bytes28 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
                    }
                    function logBytes29(bytes29 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
                    }
                    function logBytes30(bytes30 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
                    }
                    function logBytes31(bytes31 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
                    }
                    function logBytes32(bytes32 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
                    }
                    function log(uint256 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
                    }
                    function log(string memory p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
                    }
                    function log(bool p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
                    }
                    function log(address p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
                    }
                    function log(uint256 p0, uint256 p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
                    }
                    function log(uint256 p0, string memory p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
                    }
                    function log(uint256 p0, bool p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
                    }
                    function log(uint256 p0, address p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
                    }
                    function log(string memory p0, uint256 p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
                    }
                    function log(string memory p0, string memory p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
                    }
                    function log(string memory p0, bool p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
                    }
                    function log(string memory p0, address p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
                    }
                    function log(bool p0, uint256 p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
                    }
                    function log(bool p0, string memory p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
                    }
                    function log(bool p0, bool p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
                    }
                    function log(bool p0, address p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
                    }
                    function log(address p0, uint256 p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
                    }
                    function log(address p0, string memory p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
                    }
                    function log(address p0, bool p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
                    }
                    function log(address p0, address p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
                    }
                    function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
                    }
                    function log(uint256 p0, uint256 p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
                    }
                    function log(uint256 p0, uint256 p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
                    }
                    function log(uint256 p0, uint256 p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
                    }
                    function log(uint256 p0, string memory p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
                    }
                    function log(uint256 p0, string memory p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
                    }
                    function log(uint256 p0, string memory p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
                    }
                    function log(uint256 p0, string memory p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
                    }
                    function log(uint256 p0, bool p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
                    }
                    function log(uint256 p0, bool p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
                    }
                    function log(uint256 p0, bool p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
                    }
                    function log(uint256 p0, bool p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
                    }
                    function log(uint256 p0, address p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
                    }
                    function log(uint256 p0, address p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
                    }
                    function log(uint256 p0, address p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
                    }
                    function log(uint256 p0, address p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
                    }
                    function log(string memory p0, uint256 p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
                    }
                    function log(string memory p0, uint256 p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
                    }
                    function log(string memory p0, uint256 p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
                    }
                    function log(string memory p0, uint256 p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
                    }
                    function log(string memory p0, string memory p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
                    }
                    function log(string memory p0, string memory p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
                    }
                    function log(string memory p0, string memory p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
                    }
                    function log(string memory p0, string memory p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
                    }
                    function log(string memory p0, bool p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
                    }
                    function log(string memory p0, bool p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
                    }
                    function log(string memory p0, bool p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
                    }
                    function log(string memory p0, bool p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
                    }
                    function log(string memory p0, address p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
                    }
                    function log(string memory p0, address p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
                    }
                    function log(string memory p0, address p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
                    }
                    function log(string memory p0, address p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
                    }
                    function log(bool p0, uint256 p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
                    }
                    function log(bool p0, uint256 p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
                    }
                    function log(bool p0, uint256 p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
                    }
                    function log(bool p0, uint256 p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
                    }
                    function log(bool p0, string memory p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
                    }
                    function log(bool p0, string memory p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
                    }
                    function log(bool p0, string memory p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
                    }
                    function log(bool p0, string memory p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
                    }
                    function log(bool p0, bool p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
                    }
                    function log(bool p0, bool p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
                    }
                    function log(bool p0, bool p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
                    }
                    function log(bool p0, bool p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
                    }
                    function log(bool p0, address p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
                    }
                    function log(bool p0, address p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
                    }
                    function log(bool p0, address p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
                    }
                    function log(bool p0, address p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
                    }
                    function log(address p0, uint256 p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
                    }
                    function log(address p0, uint256 p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
                    }
                    function log(address p0, uint256 p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
                    }
                    function log(address p0, uint256 p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
                    }
                    function log(address p0, string memory p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
                    }
                    function log(address p0, string memory p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
                    }
                    function log(address p0, string memory p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
                    }
                    function log(address p0, string memory p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
                    }
                    function log(address p0, bool p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
                    }
                    function log(address p0, bool p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
                    }
                    function log(address p0, bool p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
                    }
                    function log(address p0, bool p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
                    }
                    function log(address p0, address p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
                    }
                    function log(address p0, address p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
                    }
                    function log(address p0, address p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
                    }
                    function log(address p0, address p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
                    }
                    function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
                    }
                }
                

                File 3 of 3: LidoProvider
                // SPDX-License-Identifier: Apache-2.0.
                pragma solidity ^0.8.24;
                interface ILido {
                  function allowance(
                    address _owner,
                    address _spender
                  ) external view returns (uint256);
                  function approve(address _spender, uint256 _amount) external returns (bool);
                  function balanceOf(address _account) external view returns (uint256);
                  function isStakingPaused() external view returns (bool);
                  function getCurrentStakeLimit() external view returns (uint256);
                  function submit(address _referral) external payable returns (uint256);
                  function getPooledEthByShares(
                    uint256 _sharesAmount
                  ) external view returns (uint256);
                  function getSharesByPooledEth(
                    uint256 _ethAmount
                  ) external view returns (uint256);
                }
                // SPDX-License-Identifier: Apache-2.0.
                pragma solidity ^0.8.24;
                interface ILidoLocator {
                  function lido() external view returns (address);
                  function withdrawalQueue() external view returns (address);
                }
                // SPDX-License-Identifier: Apache-2.0.
                pragma solidity ^0.8.24;
                interface IWithdrawalQueue {
                  struct WithdrawalRequestStatus {
                    uint256 amountOfStETH;
                    uint256 amountOfShares;
                    address owner;
                    uint256 timestamp;
                    bool isFinalized;
                    bool isClaimed;
                  }
                  function getWithdrawalRequests(
                    address _owner
                  ) external view returns (uint256[] memory requestsIds);
                  function getWithdrawalStatus(
                    uint256[] calldata _requestIds
                  ) external view returns (WithdrawalRequestStatus[] memory statuses);
                  function requestWithdrawals(
                    uint256[] calldata _amounts,
                    address _owner
                  ) external returns (uint256[] memory requestIds);
                  function getClaimableEther(
                    uint256[] calldata _requestIds,
                    uint256[] calldata _hints
                  ) external view returns (uint256[] memory claimableEthValues);
                  function claimWithdrawal(uint256 _requestId) external;
                }
                // SPDX-License-Identifier: Apache-2.0.
                pragma solidity ^0.8.24;
                import {ILido} from "../interfaces/lido/ILido.sol";
                import {ILidoLocator} from "../interfaces/lido/ILidoLocator.sol";
                import {IWithdrawalQueue} from "../interfaces/lido/IWithdrawalQueue.sol";
                import "hardhat/console.sol";
                interface IWstETH {
                  function wrap(uint256 _stETHAmount) external returns (uint256);
                  function unwrap(uint256 _wstETHAmount) external returns (uint256);
                }
                contract LidoProvider {
                  address constant NATIVE_ETH_ADDRESS =
                    0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
                  bytes32 constant LIDO_PROVIDER_STORAGE_POSITION =
                    keccak256("diamond.standard.lidoProvider.storage");
                  uint256 constant MAX_WITHDRAWAL_SIZE = 1000 ether;
                  struct LidoProviderStorage {
                    address lidoLocatorAddress;
                    bool isLidoProviderInitialized;
                  }
                  function _lidoProviderStorage()
                    internal
                    pure
                    returns (LidoProviderStorage storage ds)
                  {
                    bytes32 position = LIDO_PROVIDER_STORAGE_POSITION;
                    assembly {
                      ds.slot := position
                    }
                  }
                  struct WithdrawalData {
                    uint256 preparingAmount;
                    uint256 preparedAmount;
                  }
                  event Invested(
                    address indexed liquidity,
                    address indexed asset,
                    uint256 amount
                  );
                  event WithdrawalPrepared(
                    address indexed liquidity,
                    address indexed asset,
                    uint256 amount
                  );
                  event WithdrawalFinished(
                    address indexed liquidity,
                    address indexed asset,
                    uint256 amount
                  );
                  function isInitialized() external view returns (bool) {
                    return _lidoProviderStorage().isLidoProviderInitialized;
                  }
                  function initialize(bytes[] memory params) external {
                    require(params.length > 0, "No params provided");
                    require(
                      !_lidoProviderStorage().isLidoProviderInitialized,
                      "Already initialized"
                    );
                    _lidoProviderStorage().lidoLocatorAddress = abi.decode(
                      params[0],
                      (address)
                    );
                    _lidoProviderStorage().isLidoProviderInitialized = true;
                  }
                  function lidoLocatorAddress() public view returns (address) {
                    return _lidoProviderStorage().lidoLocatorAddress;
                  }
                  modifier lidoLocatorCheck() {
                    require(lidoLocatorAddress() != address(0), "LidoLocator address not set");
                    _;
                  }
                  modifier assetCheck(address asset) {
                    require(asset == NATIVE_ETH_ADDRESS, "Asset must be ether");
                    _;
                  }
                  function _getLido() private view returns (ILido) {
                    address lidoAddress = ILidoLocator(lidoLocatorAddress()).lido();
                    return ILido(lidoAddress);
                  }
                  function _getWithdrawalQueue() private view returns (IWithdrawalQueue) {
                    address withdrawalQueueAddress = ILidoLocator(lidoLocatorAddress())
                      .withdrawalQueue();
                    return IWithdrawalQueue(withdrawalQueueAddress);
                  }
                  function supportedAssets() external pure returns (address[] memory) {
                    address[] memory assets = new address[](1);
                    assets[0] = NATIVE_ETH_ADDRESS;
                    return assets;
                  }
                  function canDirectlyWithdraw(
                    address asset
                  ) external pure assetCheck(asset) returns (bool) {
                    return false;
                  }
                  function getWithdrawalData(
                    address asset
                  )
                    public
                    view
                    lidoLocatorCheck
                    assetCheck(asset)
                    returns (WithdrawalData memory)
                  {
                    IWithdrawalQueue withdrawalQueue = _getWithdrawalQueue();
                    uint256[] memory withdrawalRequests = withdrawalQueue.getWithdrawalRequests(
                      address(this)
                    );
                    IWithdrawalQueue.WithdrawalRequestStatus[] memory statuses = withdrawalQueue
                      .getWithdrawalStatus(withdrawalRequests);
                    uint256 totalPending = 0;
                    uint256 totalAvailable = 0;
                    for (uint256 i = 0; i < statuses.length; i++) {
                      if (!statuses[i].isFinalized) {
                        totalPending += statuses[i].amountOfStETH;
                      } else if (!statuses[i].isClaimed) {
                        totalAvailable += statuses[i].amountOfStETH;
                      }
                    }
                    return WithdrawalData(totalPending, totalAvailable);
                  }
                  function getAssetBalance(
                    address asset
                  ) public view lidoLocatorCheck assetCheck(asset) returns (uint256) {
                    ILido lido = _getLido();
                    WithdrawalData memory withdrawalData = getWithdrawalData(asset);
                    uint256 totalInWithdrawals = withdrawalData.preparingAmount +
                      withdrawalData.preparedAmount;
                    return lido.balanceOf(address(this)) + totalInWithdrawals;
                  }
                  function invest(
                    address asset,
                    uint256 amount
                  ) external payable lidoLocatorCheck assetCheck(asset) {
                    ILido lido = _getLido();
                    require(!lido.isStakingPaused(), "Staking is paused");
                    require(lido.getCurrentStakeLimit() > amount, "Amount exceeds stake limit");
                    lido.submit{value: amount}(address(0));
                    emit Invested(address(this), asset, amount);
                  }
                  function prepareWithdrawal(
                    address asset,
                    uint256 amount
                  ) external lidoLocatorCheck assetCheck(asset) {
                    ILido lido = _getLido();
                    IWithdrawalQueue withdrawalQueue = _getWithdrawalQueue();
                    uint256 balance = lido.balanceOf(address(this));
                    require(balance >= amount, "Insufficient balance");
                    uint256 stEthAllowance = lido.allowance(
                      address(this),
                      address(withdrawalQueue)
                    );
                    if (stEthAllowance < amount) {
                      lido.approve(address(withdrawalQueue), amount - stEthAllowance);
                    }
                    uint256 numChunks = (amount + MAX_WITHDRAWAL_SIZE - 1) /
                      MAX_WITHDRAWAL_SIZE; // Calculate total number of chunks needed
                    uint256[] memory amounts = new uint256[](numChunks);
                    uint256 remainingAmount = amount;
                    for (uint256 i = 0; i < numChunks; i++) {
                      if (remainingAmount > MAX_WITHDRAWAL_SIZE) {
                        amounts[i] = MAX_WITHDRAWAL_SIZE;
                        remainingAmount -= MAX_WITHDRAWAL_SIZE;
                      } else {
                        amounts[i] = remainingAmount;
                        remainingAmount = 0;
                      }
                    }
                    withdrawalQueue.requestWithdrawals(amounts, address(this));
                    emit WithdrawalPrepared(address(this), asset, amount);
                  }
                  function finishWithdrawal(
                    address asset
                  ) external lidoLocatorCheck assetCheck(asset) {
                    IWithdrawalQueue withdrawalQueue = _getWithdrawalQueue();
                    uint256[] memory withdrawalRequests = withdrawalQueue.getWithdrawalRequests(
                      address(this)
                    );
                    IWithdrawalQueue.WithdrawalRequestStatus[] memory statuses = withdrawalQueue
                      .getWithdrawalStatus(withdrawalRequests);
                    uint256 totalAvailable = 0;
                    for (uint256 i = 0; i < withdrawalRequests.length; i++) {
                      if (statuses[i].isFinalized && !statuses[i].isClaimed) {
                        withdrawalQueue.claimWithdrawal(withdrawalRequests[i]);
                        totalAvailable += statuses[i].amountOfStETH;
                      }
                    }
                    emit WithdrawalFinished(address(this), asset, totalAvailable);
                  }
                  function supportsEmergencyWithdraw(
                    address asset
                  ) external pure assetCheck(asset) returns (bool) {
                    return false;
                  }
                  function supportsEarnings(
                    address asset
                  ) external pure assetCheck(asset) returns (bool) {
                    return false;
                  }
                }
                // SPDX-License-Identifier: MIT
                pragma solidity >=0.4.22 <0.9.0;
                library console {
                    address constant CONSOLE_ADDRESS =
                        0x000000000000000000636F6e736F6c652e6c6f67;
                    function _sendLogPayloadImplementation(bytes memory payload) internal view {
                        address consoleAddress = CONSOLE_ADDRESS;
                        /// @solidity memory-safe-assembly
                        assembly {
                            pop(
                                staticcall(
                                    gas(),
                                    consoleAddress,
                                    add(payload, 32),
                                    mload(payload),
                                    0,
                                    0
                                )
                            )
                        }
                    }
                    function _castToPure(
                      function(bytes memory) internal view fnIn
                    ) internal pure returns (function(bytes memory) pure fnOut) {
                        assembly {
                            fnOut := fnIn
                        }
                    }
                    function _sendLogPayload(bytes memory payload) internal pure {
                        _castToPure(_sendLogPayloadImplementation)(payload);
                    }
                    function log() internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log()"));
                    }
                    function logInt(int256 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
                    }
                    function logUint(uint256 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
                    }
                    function logString(string memory p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
                    }
                    function logBool(bool p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
                    }
                    function logAddress(address p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
                    }
                    function logBytes(bytes memory p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
                    }
                    function logBytes1(bytes1 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
                    }
                    function logBytes2(bytes2 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
                    }
                    function logBytes3(bytes3 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
                    }
                    function logBytes4(bytes4 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
                    }
                    function logBytes5(bytes5 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
                    }
                    function logBytes6(bytes6 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
                    }
                    function logBytes7(bytes7 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
                    }
                    function logBytes8(bytes8 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
                    }
                    function logBytes9(bytes9 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
                    }
                    function logBytes10(bytes10 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
                    }
                    function logBytes11(bytes11 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
                    }
                    function logBytes12(bytes12 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
                    }
                    function logBytes13(bytes13 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
                    }
                    function logBytes14(bytes14 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
                    }
                    function logBytes15(bytes15 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
                    }
                    function logBytes16(bytes16 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
                    }
                    function logBytes17(bytes17 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
                    }
                    function logBytes18(bytes18 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
                    }
                    function logBytes19(bytes19 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
                    }
                    function logBytes20(bytes20 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
                    }
                    function logBytes21(bytes21 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
                    }
                    function logBytes22(bytes22 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
                    }
                    function logBytes23(bytes23 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
                    }
                    function logBytes24(bytes24 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
                    }
                    function logBytes25(bytes25 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
                    }
                    function logBytes26(bytes26 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
                    }
                    function logBytes27(bytes27 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
                    }
                    function logBytes28(bytes28 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
                    }
                    function logBytes29(bytes29 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
                    }
                    function logBytes30(bytes30 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
                    }
                    function logBytes31(bytes31 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
                    }
                    function logBytes32(bytes32 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
                    }
                    function log(uint256 p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
                    }
                    function log(string memory p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
                    }
                    function log(bool p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
                    }
                    function log(address p0) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
                    }
                    function log(uint256 p0, uint256 p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
                    }
                    function log(uint256 p0, string memory p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
                    }
                    function log(uint256 p0, bool p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
                    }
                    function log(uint256 p0, address p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
                    }
                    function log(string memory p0, uint256 p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
                    }
                    function log(string memory p0, string memory p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
                    }
                    function log(string memory p0, bool p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
                    }
                    function log(string memory p0, address p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
                    }
                    function log(bool p0, uint256 p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
                    }
                    function log(bool p0, string memory p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
                    }
                    function log(bool p0, bool p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
                    }
                    function log(bool p0, address p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
                    }
                    function log(address p0, uint256 p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
                    }
                    function log(address p0, string memory p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
                    }
                    function log(address p0, bool p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
                    }
                    function log(address p0, address p1) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
                    }
                    function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
                    }
                    function log(uint256 p0, uint256 p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
                    }
                    function log(uint256 p0, uint256 p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
                    }
                    function log(uint256 p0, uint256 p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
                    }
                    function log(uint256 p0, string memory p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
                    }
                    function log(uint256 p0, string memory p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
                    }
                    function log(uint256 p0, string memory p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
                    }
                    function log(uint256 p0, string memory p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
                    }
                    function log(uint256 p0, bool p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
                    }
                    function log(uint256 p0, bool p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
                    }
                    function log(uint256 p0, bool p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
                    }
                    function log(uint256 p0, bool p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
                    }
                    function log(uint256 p0, address p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
                    }
                    function log(uint256 p0, address p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
                    }
                    function log(uint256 p0, address p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
                    }
                    function log(uint256 p0, address p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
                    }
                    function log(string memory p0, uint256 p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
                    }
                    function log(string memory p0, uint256 p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
                    }
                    function log(string memory p0, uint256 p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
                    }
                    function log(string memory p0, uint256 p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
                    }
                    function log(string memory p0, string memory p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
                    }
                    function log(string memory p0, string memory p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
                    }
                    function log(string memory p0, string memory p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
                    }
                    function log(string memory p0, string memory p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
                    }
                    function log(string memory p0, bool p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
                    }
                    function log(string memory p0, bool p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
                    }
                    function log(string memory p0, bool p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
                    }
                    function log(string memory p0, bool p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
                    }
                    function log(string memory p0, address p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
                    }
                    function log(string memory p0, address p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
                    }
                    function log(string memory p0, address p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
                    }
                    function log(string memory p0, address p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
                    }
                    function log(bool p0, uint256 p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
                    }
                    function log(bool p0, uint256 p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
                    }
                    function log(bool p0, uint256 p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
                    }
                    function log(bool p0, uint256 p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
                    }
                    function log(bool p0, string memory p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
                    }
                    function log(bool p0, string memory p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
                    }
                    function log(bool p0, string memory p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
                    }
                    function log(bool p0, string memory p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
                    }
                    function log(bool p0, bool p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
                    }
                    function log(bool p0, bool p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
                    }
                    function log(bool p0, bool p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
                    }
                    function log(bool p0, bool p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
                    }
                    function log(bool p0, address p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
                    }
                    function log(bool p0, address p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
                    }
                    function log(bool p0, address p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
                    }
                    function log(bool p0, address p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
                    }
                    function log(address p0, uint256 p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
                    }
                    function log(address p0, uint256 p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
                    }
                    function log(address p0, uint256 p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
                    }
                    function log(address p0, uint256 p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
                    }
                    function log(address p0, string memory p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
                    }
                    function log(address p0, string memory p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
                    }
                    function log(address p0, string memory p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
                    }
                    function log(address p0, string memory p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
                    }
                    function log(address p0, bool p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
                    }
                    function log(address p0, bool p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
                    }
                    function log(address p0, bool p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
                    }
                    function log(address p0, bool p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
                    }
                    function log(address p0, address p1, uint256 p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
                    }
                    function log(address p0, address p1, string memory p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
                    }
                    function log(address p0, address p1, bool p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
                    }
                    function log(address p0, address p1, address p2) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
                    }
                    function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, string memory p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, bool p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
                    }
                    function log(uint256 p0, address p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, uint256 p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, string memory p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, bool p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
                    }
                    function log(string memory p0, address p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, uint256 p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, string memory p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, bool p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
                    }
                    function log(bool p0, address p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, uint256 p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, string memory p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, bool p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, uint256 p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, uint256 p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, uint256 p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, string memory p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, string memory p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, string memory p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, string memory p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, bool p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, bool p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, bool p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, bool p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, address p2, uint256 p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, address p2, string memory p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, address p2, bool p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
                    }
                    function log(address p0, address p1, address p2, address p3) internal pure {
                        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
                    }
                }