Overview ERC20
PRICE
n/a

ON-CHAIN MARKET CAP n/a

Total Supply:
232.80 ctWBTC

Holders:
3,351
Profile Summary
Blockchain:
Ethereum (1)


Decimals:
17
Contract Source Code Verified (Partial Match)
Contract Name:
ConcreteMultiStrategyVault

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Created At:
Mon, 25 Nov 2024 17:45:23 GMT
ConcreteMultiStrategyVault.sol
node_modules
@blueprint-finance
earn-v1
src
vault
ConcreteMultiStrategyVault.sol


Contract ABI
[
  {
    "inputs": [],
    "stateMutability": "nonpayable",
    "type": "constructor"
  },
  {
    "inputs": [],
    "name": "AccumulatedFeeAccountedMustBeZero",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "AdditionFail",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "target",
        "type": "address"
      }
    ],
    "name": "AddressEmptyCode",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "AddressInsufficientBalance",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "AllotmentTotalTooHigh",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "BlueprintUnauthorizedAccount",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "ClaimRouterUnauthorizedAccount",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "ERC20ApproveFail",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "allowance",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "needed",
        "type": "uint256"
      }
    ],
    "name": "ERC20InsufficientAllowance",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "sender",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "balance",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "needed",
        "type": "uint256"
      }
    ],
    "name": "ERC20InsufficientBalance",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "approver",
        "type": "address"
      }
    ],
    "name": "ERC20InvalidApprover",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "receiver",
        "type": "address"
      }
    ],
    "name": "ERC20InvalidReceiver",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "sender",
        "type": "address"
      }
    ],
    "name": "ERC20InvalidSender",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      }
    ],
    "name": "ERC20InvalidSpender",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "receiver",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "assets",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "max",
        "type": "uint256"
      }
    ],
    "name": "ERC4626ExceededMaxDeposit",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "receiver",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "shares",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "max",
        "type": "uint256"
      }
    ],
    "name": "ERC4626ExceededMaxMint",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "owner",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "shares",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "max",
        "type": "uint256"
      }
    ],
    "name": "ERC4626ExceededMaxRedeem",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "owner",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "assets",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "max",
        "type": "uint256"
      }
    ],
    "name": "ERC4626ExceededMaxWithdraw",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "EnforcedPause",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "ExpectedPause",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "FailedInnerCall",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "bytes32",
        "name": "id",
        "type": "bytes32"
      }
    ],
    "name": "ImplementationAlreadyExists",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "bytes32",
        "name": "id",
        "type": "bytes32"
      }
    ],
    "name": "ImplementationDoesNotExist",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "contract IERC4626",
        "name": "strategy",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "available",
        "type": "uint256"
      }
    ],
    "name": "InsufficientFunds",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "vault",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "available",
        "type": "uint256"
      }
    ],
    "name": "InsufficientVaultFunds",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidAmount",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidAssetAddress",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidClaimRouterAddress",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidDefaultAdminAddress",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidDepositLimit",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidFeeRecipient",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "bytes32",
        "name": "id",
        "type": "bytes32"
      }
    ],
    "name": "InvalidImplementation",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "index",
        "type": "uint256"
      }
    ],
    "name": "InvalidIndex",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidInitialization",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "argLength",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "expectedLength",
        "type": "uint256"
      }
    ],
    "name": "InvalidLength",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidRecipient",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidRewardTokenAddress",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "signer",
        "type": "address"
      }
    ],
    "name": "InvalidSigner",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidSubstraction",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidTokenRegistry",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidTreasuryAddress",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidUserAddress",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidVaultFees",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidVaultRegistry",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "InvalidWithdrawlQueue",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "MathOverflowedMulDiv",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "MaxError",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "MultipleProtectStrat",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "NoProtectionStrategiesFound",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "token",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      }
    ],
    "name": "NotAvailableForWithdrawal",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "NotImplemented",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "NotInitializing",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "tokenAddress",
        "type": "address"
      }
    ],
    "name": "NotValidRewardToken",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "caller",
        "type": "address"
      }
    ],
    "name": "OnlyVault",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "owner",
        "type": "address"
      }
    ],
    "name": "OwnableInvalidOwner",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "OwnableUnauthorizedAccount",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "deadline",
        "type": "uint256"
      }
    ],
    "name": "PermitDeadlineExpired",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "ProtectUnauthorizedAccount",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "QueueNotSet",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "ReentrancyGuardReentrantCall",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "RemoveFail",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "RewardTokenAlreadyApproved",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "RewardTokenNotApproved",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "token",
        "type": "address"
      }
    ],
    "name": "SafeERC20FailedOperation",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "strategy",
        "type": "address"
      }
    ],
    "name": "StrategyHasLockedAssets",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "SwapperBaseRewardrate",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "SwapperBonusRewardrateCtToken",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "SwapperBonusRewardrateSwapToken",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "SwapperBonusRewardrateUser",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "SwapperMaxProgressionFactor",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "tokenAddress",
        "type": "address"
      }
    ],
    "name": "TokenAlreadyRegistered",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "tokenAddress",
        "type": "address"
      }
    ],
    "name": "TokenNotRegistered",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "total",
        "type": "uint256"
      }
    ],
    "name": "TotalVaultsAllowedExceeded",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "attacker",
        "type": "address"
      }
    ],
    "name": "TreasuryAlreadySet",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "sender",
        "type": "address"
      }
    ],
    "name": "TreasuryChangeRequestCooldownNotElapsed",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "queue",
        "type": "address"
      }
    ],
    "name": "UnfinalizedWithdrawl",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "tokenAddress",
        "type": "address"
      }
    ],
    "name": "UnregisteredTokensCannotBeRewards",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "VaultAlreadyExists",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "VaultAssetMismatch",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "token",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "total",
        "type": "uint256"
      }
    ],
    "name": "VaultByTokenLimitExceeded",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "VaultDeployInitFailed",
    "type": "error"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "vault",
        "type": "address"
      }
    ],
    "name": "VaultDoesNotExist",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "VaultIsIdle",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "VaultZeroAddress",
    "type": "error"
  },
  {
    "inputs": [],
    "name": "ZeroAmount",
    "type": "error"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "owner",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "spender",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "Approval",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "sender",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "owner",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "assets",
        "type": "uint256"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "shares",
        "type": "uint256"
      }
    ],
    "name": "Deposit",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "limit",
        "type": "uint256"
      }
    ],
    "name": "DepositLimitSet",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "oldRecipient",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "newRecipient",
        "type": "address"
      }
    ],
    "name": "FeeRecipientUpdated",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "vaultName",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "underlyingAsset",
        "type": "address"
      }
    ],
    "name": "Initialized",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "uint64",
        "name": "version",
        "type": "uint64"
      }
    ],
    "name": "Initialized",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "previousOwner",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "newOwner",
        "type": "address"
      }
    ],
    "name": "OwnershipTransferred",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "Paused",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "protectStrategy",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      }
    ],
    "name": "RequestedFunds",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [],
    "name": "RewardsHarvested",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "address",
        "name": "newStrategy",
        "type": "address"
      }
    ],
    "name": "StrategyAdded",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "components": [
          {
            "internalType": "uint256",
            "name": "index",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "amount",
            "type": "uint256"
          }
        ],
        "indexed": false,
        "internalType": "struct Allocation[]",
        "name": "newAllocations",
        "type": "tuple[]"
      }
    ],
    "name": "StrategyAllocationsChanged",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "address",
        "name": "oldStrategy",
        "type": "address"
      }
    ],
    "name": "StrategyRemoved",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "bool",
        "name": "pastValue",
        "type": "bool"
      },
      {
        "indexed": false,
        "internalType": "bool",
        "name": "newValue",
        "type": "bool"
      }
    ],
    "name": "ToggleVaultIdle",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "from",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "Transfer",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "Unpaused",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": true,
        "internalType": "address",
        "name": "sender",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "receiver",
        "type": "address"
      },
      {
        "indexed": true,
        "internalType": "address",
        "name": "owner",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "assets",
        "type": "uint256"
      },
      {
        "indexed": false,
        "internalType": "uint256",
        "name": "shares",
        "type": "uint256"
      }
    ],
    "name": "Withdraw",
    "type": "event"
  },
  {
    "anonymous": false,
    "inputs": [
      {
        "indexed": false,
        "internalType": "address",
        "name": "oldQueue",
        "type": "address"
      },
      {
        "indexed": false,
        "internalType": "address",
        "name": "newQueue",
        "type": "address"
      }
    ],
    "name": "WithdrawalQueueUpdated",
    "type": "event"
  },
  {
    "inputs": [],
    "name": "accruedPerformanceFee",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "fee",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "accruedProtocolFee",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "index_",
        "type": "uint256"
      },
      {
        "internalType": "bool",
        "name": "replace_",
        "type": "bool"
      },
      {
        "components": [
          {
            "internalType": "contract IStrategy",
            "name": "strategy",
            "type": "address"
          },
          {
            "components": [
              {
                "internalType": "uint256",
                "name": "index",
                "type": "uint256"
              },
              {
                "internalType": "uint256",
                "name": "amount",
                "type": "uint256"
              }
            ],
            "internalType": "struct Allocation",
            "name": "allocation",
            "type": "tuple"
          }
        ],
        "internalType": "struct Strategy",
        "name": "newStrategy_",
        "type": "tuple"
      }
    ],
    "name": "addStrategy",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "owner",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      }
    ],
    "name": "allowance",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "spender",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "approve",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "asset",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "account",
        "type": "address"
      }
    ],
    "name": "balanceOf",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "maxRequests",
        "type": "uint256"
      }
    ],
    "name": "batchClaimWithdrawal",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "components": [
          {
            "internalType": "uint256",
            "name": "index",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "amount",
            "type": "uint256"
          }
        ],
        "internalType": "struct Allocation[]",
        "name": "allocations_",
        "type": "tuple[]"
      },
      {
        "internalType": "bool",
        "name": "redistribute",
        "type": "bool"
      }
    ],
    "name": "changeAllocations",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "claimRewards",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "shares",
        "type": "uint256"
      }
    ],
    "name": "convertToAssets",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "assets",
        "type": "uint256"
      }
    ],
    "name": "convertToShares",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "decimalOffset",
    "outputs": [
      {
        "internalType": "uint8",
        "name": "",
        "type": "uint8"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "decimals",
    "outputs": [
      {
        "internalType": "uint8",
        "name": "",
        "type": "uint8"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "assets_",
        "type": "uint256"
      },
      {
        "internalType": "address",
        "name": "receiver_",
        "type": "address"
      }
    ],
    "name": "deposit",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "shares",
        "type": "uint256"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "assets_",
        "type": "uint256"
      }
    ],
    "name": "deposit",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "depositLimit",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "feeRecipient",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "feesUpdatedAt",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "firstDeposit",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "getAvailableAssetsForWithdrawal",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "totalAvailable",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "getRewardTokens",
    "outputs": [
      {
        "internalType": "address[]",
        "name": "",
        "type": "address[]"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "getStrategies",
    "outputs": [
      {
        "components": [
          {
            "internalType": "contract IStrategy",
            "name": "strategy",
            "type": "address"
          },
          {
            "components": [
              {
                "internalType": "uint256",
                "name": "index",
                "type": "uint256"
              },
              {
                "internalType": "uint256",
                "name": "amount",
                "type": "uint256"
              }
            ],
            "internalType": "struct Allocation",
            "name": "allocation",
            "type": "tuple"
          }
        ],
        "internalType": "struct Strategy[]",
        "name": "",
        "type": "tuple[]"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "userAddress",
        "type": "address"
      }
    ],
    "name": "getTotalRewardsClaimed",
    "outputs": [
      {
        "components": [
          {
            "internalType": "address",
            "name": "rewardAddress",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "rewardAmount",
            "type": "uint256"
          }
        ],
        "internalType": "struct ReturnedRewards[]",
        "name": "",
        "type": "tuple[]"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "userAddress",
        "type": "address"
      }
    ],
    "name": "getUserRewards",
    "outputs": [
      {
        "components": [
          {
            "internalType": "address",
            "name": "rewardAddress",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "rewardAmount",
            "type": "uint256"
          }
        ],
        "internalType": "struct ReturnedRewards[]",
        "name": "",
        "type": "tuple[]"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "getVaultFees",
    "outputs": [
      {
        "components": [
          {
            "internalType": "uint64",
            "name": "depositFee",
            "type": "uint64"
          },
          {
            "internalType": "uint64",
            "name": "withdrawalFee",
            "type": "uint64"
          },
          {
            "internalType": "uint64",
            "name": "protocolFee",
            "type": "uint64"
          },
          {
            "components": [
              {
                "internalType": "uint256",
                "name": "lowerBound",
                "type": "uint256"
              },
              {
                "internalType": "uint256",
                "name": "upperBound",
                "type": "uint256"
              },
              {
                "internalType": "uint64",
                "name": "fee",
                "type": "uint64"
              }
            ],
            "internalType": "struct GraduatedFee[]",
            "name": "performanceFee",
            "type": "tuple[]"
          }
        ],
        "internalType": "struct VaultFees",
        "name": "",
        "type": "tuple"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "bytes",
        "name": "encodedData",
        "type": "bytes"
      }
    ],
    "name": "harvestRewards",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "highWaterMark",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "contract IERC20",
        "name": "baseAsset_",
        "type": "address"
      },
      {
        "internalType": "string",
        "name": "shareName_",
        "type": "string"
      },
      {
        "internalType": "string",
        "name": "shareSymbol_",
        "type": "string"
      },
      {
        "components": [
          {
            "internalType": "contract IStrategy",
            "name": "strategy",
            "type": "address"
          },
          {
            "components": [
              {
                "internalType": "uint256",
                "name": "index",
                "type": "uint256"
              },
              {
                "internalType": "uint256",
                "name": "amount",
                "type": "uint256"
              }
            ],
            "internalType": "struct Allocation",
            "name": "allocation",
            "type": "tuple"
          }
        ],
        "internalType": "struct Strategy[]",
        "name": "strategies_",
        "type": "tuple[]"
      },
      {
        "internalType": "address",
        "name": "feeRecipient_",
        "type": "address"
      },
      {
        "components": [
          {
            "internalType": "uint64",
            "name": "depositFee",
            "type": "uint64"
          },
          {
            "internalType": "uint64",
            "name": "withdrawalFee",
            "type": "uint64"
          },
          {
            "internalType": "uint64",
            "name": "protocolFee",
            "type": "uint64"
          },
          {
            "components": [
              {
                "internalType": "uint256",
                "name": "lowerBound",
                "type": "uint256"
              },
              {
                "internalType": "uint256",
                "name": "upperBound",
                "type": "uint256"
              },
              {
                "internalType": "uint64",
                "name": "fee",
                "type": "uint64"
              }
            ],
            "internalType": "struct GraduatedFee[]",
            "name": "performanceFee",
            "type": "tuple[]"
          }
        ],
        "internalType": "struct VaultFees",
        "name": "fees_",
        "type": "tuple"
      },
      {
        "internalType": "uint256",
        "name": "depositLimit_",
        "type": "uint256"
      },
      {
        "internalType": "address",
        "name": "owner_",
        "type": "address"
      }
    ],
    "name": "initialize",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "name": "maxDeposit",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "name": "maxMint",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "owner",
        "type": "address"
      }
    ],
    "name": "maxRedeem",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "owner",
        "type": "address"
      }
    ],
    "name": "maxWithdraw",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "shares_",
        "type": "uint256"
      },
      {
        "internalType": "address",
        "name": "receiver_",
        "type": "address"
      }
    ],
    "name": "mint",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "assets",
        "type": "uint256"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "shares_",
        "type": "uint256"
      }
    ],
    "name": "mint",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "name",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "owner",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "pause",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "paused",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "assets_",
        "type": "uint256"
      }
    ],
    "name": "previewDeposit",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "shares_",
        "type": "uint256"
      }
    ],
    "name": "previewMint",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "shares_",
        "type": "uint256"
      }
    ],
    "name": "previewRedeem",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "assets_",
        "type": "uint256"
      }
    ],
    "name": "previewWithdraw",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "shares",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "protectStrategy",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "index_",
        "type": "uint256"
      }
    ],
    "name": "pullFundsFromSingleStrategy",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "pullFundsFromStrategies",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "index_",
        "type": "uint256"
      },
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      }
    ],
    "name": "pushFundsIntoSingleStrategy",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "index_",
        "type": "uint256"
      }
    ],
    "name": "pushFundsIntoSingleStrategy",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "pushFundsToStrategies",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "shares_",
        "type": "uint256"
      },
      {
        "internalType": "address",
        "name": "receiver_",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "owner_",
        "type": "address"
      }
    ],
    "name": "redeem",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "assets",
        "type": "uint256"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "shares_",
        "type": "uint256"
      }
    ],
    "name": "redeem",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "index_",
        "type": "uint256"
      }
    ],
    "name": "removeStrategy",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "renounceOwnership",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "amount",
        "type": "uint256"
      }
    ],
    "name": "requestFunds",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "name": "rewardIndex",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "newLimit_",
        "type": "uint256"
      }
    ],
    "name": "setDepositLimit",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "newRecipient_",
        "type": "address"
      }
    ],
    "name": "setFeeRecipient",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "components": [
          {
            "internalType": "uint64",
            "name": "depositFee",
            "type": "uint64"
          },
          {
            "internalType": "uint64",
            "name": "withdrawalFee",
            "type": "uint64"
          },
          {
            "internalType": "uint64",
            "name": "protocolFee",
            "type": "uint64"
          },
          {
            "components": [
              {
                "internalType": "uint256",
                "name": "lowerBound",
                "type": "uint256"
              },
              {
                "internalType": "uint256",
                "name": "upperBound",
                "type": "uint256"
              },
              {
                "internalType": "uint64",
                "name": "fee",
                "type": "uint64"
              }
            ],
            "internalType": "struct GraduatedFee[]",
            "name": "performanceFee",
            "type": "tuple[]"
          }
        ],
        "internalType": "struct VaultFees",
        "name": "newFees_",
        "type": "tuple"
      }
    ],
    "name": "setVaultFees",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "withdrawalQueue_",
        "type": "address"
      }
    ],
    "name": "setWithdrawalQueue",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "symbol",
    "outputs": [
      {
        "internalType": "string",
        "name": "",
        "type": "string"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "takePortfolioAndProtocolFees",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "toggleVaultIdle",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "totalAssets",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "total",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "name": "totalRewardsClaimed",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "totalSupply",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "transfer",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "from",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "to",
        "type": "address"
      },
      {
        "internalType": "uint256",
        "name": "value",
        "type": "uint256"
      }
    ],
    "name": "transferFrom",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "newOwner",
        "type": "address"
      }
    ],
    "name": "transferOwnership",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "unpause",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "name": "userRewardIndex",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "vaultIdle",
    "outputs": [
      {
        "internalType": "bool",
        "name": "",
        "type": "bool"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "assets_",
        "type": "uint256"
      }
    ],
    "name": "withdraw",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "",
        "type": "uint256"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "uint256",
        "name": "assets_",
        "type": "uint256"
      },
      {
        "internalType": "address",
        "name": "receiver_",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "owner_",
        "type": "address"
      }
    ],
    "name": "withdraw",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "shares",
        "type": "uint256"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "withdrawalQueue",
    "outputs": [
      {
        "internalType": "contract IWithdrawalQueue",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  }
]


Contract Creation Code
608060405260006001553480156200001657600080fd5b506001600055620000266200002c565b620000e0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156200007d5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000dd5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615ffe80620000f06000396000f3fe608060405234801561001057600080fd5b506004361061043e5760003560e01c80638456cb5911610236578063ba0876521161013b578063d1b39ae5116100c3578063ecf7085811610087578063ecf708581461093a578063ef8b30f714610943578063f1f741b414610956578063f2fde38b14610969578063f4aa3efa1461097c57600080fd5b8063d1b39ae5146108e6578063d905777e146108ee578063db006a7514610901578063dd62ed3e14610914578063e74b981b1461092757600080fd5b8063c4f59f9b1161010a578063c4f59f9b14610885578063c60607621461089a578063c63d75b6146108ad578063c6e6f592146108c0578063ce96cb77146108d357600080fd5b8063ba08765214610839578063bdc8144b1461084c578063bf3bd25d1461085f578063c0cbbca61461087257600080fd5b8063a9059cbb116101be578063b3e321141161018d578063b3e32114146107cb578063b45ba4a8146107eb578063b460af94146107fe578063b49a60bb14610811578063b6b55f251461082657600080fd5b8063a9059cbb1461078a578063acfd79281461079d578063b39ed6d9146107a5578063b3d7f6b9146107b857600080fd5b80639e2f0e22116102055780639e2f0e22146107275780639f3d0a481461073a578063a039c12914610743578063a0712d681461076e578063a5f5be541461078157600080fd5b80638456cb59146106fc5780638da5cb5b1461070457806394bf804d1461070c57806395d89b411461071f57600080fd5b806337f1834e116103475780635c975abb116102cf5780636e553f65116102935780636e553f65146106a857806370a08231146106bb578063715018a6146106ce57806372e71601146106d6578063839e950f146106e957600080fd5b80635c975abb1461065a57806366584f8c146106725780636bedc46c1461067a5780636d3300e51461068d5780636e2a6fe5146106a057600080fd5b80634657189911610316578063465718991461061157806346904840146106195780634cdad5061461062c5780635337e6701461063f57806355b8b7811461065257600080fd5b806337f1834e146105e457806338d52e0f146105ec5780633f4ba83a146105f4578063402d267d146105fc57600080fd5b806318160ddd116103ca5780632a81196c116103995780632a81196c146105695780632e1a7d4d1461057e578063313ce56714610591578063372500ab146105b157806337d5fe99146105b957600080fd5b806318160ddd1461050d5780631d2af0b9146105225780631e8410da1461054d57806323b872dd1461055657600080fd5b8063095ea7b311610411578063095ea7b3146104a65780630a28a477146104c95780630c14935e146104dc578063111c8453146104e457806313ee9df4146104f857600080fd5b806301e1d1141461044357806306fdde031461045e578063078b0fb71461047357806307a2d13a14610493575b600080fd5b61044b61098f565b6040519081526020015b60405180910390f35b610466610c0a565b6040516104559190614c1a565b610486610481366004614c52565b610ccd565b6040516104559190614c6f565b61044b6104a1366004614cc7565b610e9e565b6104b96104b4366004614ce0565b610eb1565b6040519015158152602001610455565b61044b6104d7366004614cc7565b610ec9565b61044b610f20565b6006546104b990600160a01b900460ff1681565b610500610ffa565b6040516104559190614d0c565b600080516020615f898339815191525461044b565b61044b610530366004614dba565b600e60209081526000928352604080842090915290825290205481565b61044b60035481565b6104b9610564366004614df3565b6110dc565b61057c610577366004614f4b565b611102565b005b61044b61058c366004614cc7565b6113c0565b600254600160a01b900460ff165b60405160ff9091168152602001610455565b61057c6113cd565b600a546105cc906001600160a01b031681565b6040516001600160a01b039091168152602001610455565b61044b6113d8565b6105cc611534565b61057c611569565b61044b61060a366004614c52565b5060001990565b61057c611579565b6006546105cc906001600160a01b031681565b61044b61063a366004614cc7565b611653565b61057c61064d366004614c52565b6116ab565b61057c6117fd565b600080516020615fa98339815191525460ff166104b9565b61057c611914565b61057c610688366004614f9b565b61193f565b61057c61069b366004614cc7565b611a1b565b61057c611c49565b61044b6106b6366004614fd5565b611cb9565b61044b6106c9366004614c52565b611ef3565b61057c611f1b565b6104866106e4366004614c52565b611f2d565b61057c6106f7366004614ffa565b612058565b61057c6121c5565b6105cc6121d5565b61044b61071a366004614fd5565b6121fe565b6104666123ef565b6002546105cc906001600160a01b031681565b61044b60055481565b61044b610751366004614dba565b600d60209081526000928352604080842090915290825290205481565b61044b61077c366004614cc7565b61242e565b61044b60015481565b6104b9610798366004614ce0565b61243a565b61044b612448565b61057c6107b3366004614cc7565b6124be565b61044b6107c6366004614cc7565b612637565b61044b6107d9366004614c52565b600c6020526000908152604090205481565b61057c6107f936600461502a565b612664565b61044b61080c366004615074565b612880565b610819612990565b60405161045591906150b6565b61044b610834366004614cc7565b612a1b565b61044b610847366004615074565b612a27565b61057c61085a366004614cc7565b612b00565b61057c61086d366004614cc7565b612b44565b61057c610880366004614cc7565b612cfa565b61088d612fe1565b6040516104559190615122565b61057c6108a8366004615373565b613043565b61044b6108bb366004614c52565b6132fb565b61044b6108ce366004614cc7565b613350565b61044b6108e1366004614c52565b61335d565b61059f600981565b61044b6108fc366004614c52565b61336b565b61044b61090f366004614cc7565b613376565b61044b610922366004614dba565b613383565b61057c610935366004614c52565b6133cd565b61044b60045481565b61044b610951366004614cc7565b613458565b61057c610964366004614cc7565b6134a9565b61057c610977366004614c52565b6136be565b61057c61098a36600461545b565b6136f9565b6000610999611534565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa1580156109df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0391906154d5565b905060005b600754811015610b4a5760078181548110610a2557610a256154ee565b6000918252602090912060039091020154600780546001600160a01b03909216916307a2d13a919084908110610a5d57610a5d6154ee565b60009182526020909120600390910201546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610ab3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad791906154d5565b6040518263ffffffff1660e01b8152600401610af591815260200190565b602060405180830381865afa158015610b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3691906154d5565b610b40908361551a565b9150600101610a08565b50600a546000906001600160a01b031615610bd957600a60009054906101000a90046001600160a01b03166001600160a01b0316630ac9aaa36040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd691906154d5565b90505b80821015610bfa57604051639115530b60e01b815260040160405180910390fd5b610c04818361552d565b91505090565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace038054606091600080516020615f6983398151915291610c4990615540565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7590615540565b8015610cc25780601f10610c9757610100808354040283529160200191610cc2565b820191906000526020600020905b815481529060010190602001808311610ca557829003601f168201915b505050505091505090565b60606000610cda83611ef3565b600b549091506000816001600160401b03811115610cfa57610cfa614e34565b604051908082528060200260200182016040528015610d3f57816020015b6040805180820190915260008082526020820152815260200190600190039081610d185790505b50905060005b82811015610e95576000600c6000600b8481548110610d6657610d666154ee565b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000205490506000610e30866ec097ce7bc90715b34b9f10000000006000600d60008d6001600160a01b03166001600160a01b031681526020019081526020016000206000600b8981548110610df957610df96154ee565b60009182526020808320909101546001600160a01b03168352820192909252604001902054610e28908761552d565b9291906138f4565b90506040518060400160405280600b8581548110610e5057610e506154ee565b600091825260209182902001546001600160a01b03168252018290528451859085908110610e8057610e806154ee565b60209081029190910101525050600101610d45565b50949350505050565b6000610eab826000613945565b92915050565b600033610ebf81858561398c565b5060019392505050565b6000610ed6826001613999565b6006549091506001600160a01b03163303610ef15780610eab565b600854610eab9061271090610f1690600160401b90046001600160401b03168261552d565b83919060006138f4565b600080610f34670de0b6b3a7640000610e9e565b60095490915015801590610f49575060035481115b15610ff657735dda99c5821f02d19c121a243eba4d5ef1f2b18c6332c7eafa82600354610f82600080516020615f898339815191525490565b6040516001600160e01b031960e086901b16815260048101939093526024830191909152604482015260086064820152608401602060405180830381865af4158015610fd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0491906154d5565b5090565b604080516080810182526000808252602082018190529181019190915260608082015260408051608081018252600880546001600160401b038082168452600160401b82048116602080860191909152600160801b9092041683850152600980548551818402810184019096528086529394929360608601939260009084015b828210156110cf576000848152602090819020604080516060810182526003860290920180548352600180820154848601526002909101546001600160401b031691830191909152908352909201910161107a565b5050505081525050905090565b6000336110ea8582856139d7565b6110f5858585613a24565b60019150505b9392505050565b61110a613a83565b611112613ab5565b606080825160001461113857828060200190518101906111329190615640565b90925090505b6000611150600080516020615f898339815191525490565b9050606060005b6007548110156113855760005b85518110156111c75781868281518110611180576111806154ee565b6020026020010151036111ae5784818151811061119f5761119f6154ee565b602002602001015192506111c7565b6040805160208101909152600081529250600101611164565b506000600782815481106111dd576111dd6154ee565b6000918252602090912060039091020154604051630aa0465b60e21b81526001600160a01b0390911690632a81196c9061121b908690600401614c1a565b6000604051808303816000875af115801561123a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261126291908101906156fb565b905060005b815181101561137b576000828281518110611284576112846154ee565b602002602001015160200151905060008383815181106112a6576112a66154ee565b602002602001015160000151905081600014611371576001600160a01b0381166000908152600c6020526040812054900361132757600b80546001810182556000919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b0383161790555b611343826ec097ce7bc90715b34b9f10000000008960006138f4565b6001600160a01b0382166000908152600c60205260408120805490919061136b90849061551a565b90915550505b5050600101611267565b5050600101611157565b506040517f429eabcd6b69e5ca232c6a9d2c5af1805e375e951df8e9bfe831b445e5f69b2b90600090a1505050506113bd6001600055565b50565b6000610eab823333612880565b6113d633613ae6565b565b60006113e2611534565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015611428573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144c91906154d5565b60075490915060005b8181101561152f57600060078281548110611472576114726154ee565b6000918252602091829020604080518082018252600390930290910180546001600160a01b0390811684528251808401845260018301548152600290920154828601528385019190915282518251631bf8c1a760e11b8152925193955016926337f1834e926004808401938290030181865afa1580156114f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151a91906154d5565b611524908561551a565b935050600101611455565b505090565b6000807f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e005b546001600160a01b031692915050565b611571613a83565b6113d6613ca1565b611581613ab5565b600061158b610f20565b611593612448565b61159d919061551a565b905060006115b2670de0b6b3a7640000610e9e565b905060006115be61098f565b90506003548211156115d05760038290555b6000831180156115e05750600081115b156116425760006115fd600080516020615f898339815191525490565b9050600081156116245761161f82611615878661552d565b87919060006138f4565b611626565b845b60065490915061163f906001600160a01b031682613cfb565b50505b505042600555506113d66001600055565b60065460009081906001600160a01b03163303611671576000611694565b600854611694908490600160401b90046001600160401b031661271060006138f4565b61169e908461552d565b90506110fb816000613945565b6116b3613a83565b6001600160a01b0381166116da576040516355b7dfb560e11b815260040160405180910390fd5b600a546001600160a01b03161561179457600a60009054906101000a90046001600160a01b03166001600160a01b0316630ac9aaa36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561173e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176291906154d5565b1561179457600a546040516377d3906d60e01b81526001600160a01b0390911660048201526024015b60405180910390fd5b600a54604080516001600160a01b03928316815291831660208301527f90ee8c46ab78acce150d0041456437c06fbd2a3642739b948bd373357e4ed699910160405180910390a1600a80546001600160a01b0319166001600160a01b0392909216919091179055565b611805613a83565b600654600160a01b900460ff1615611830576040516303eb29d960e01b815260040160405180910390fd5b600061183a611534565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015611880573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a491906154d5565b6040516338abfe2b60e01b81526007600482015260248101829052909150735dda99c5821f02d19c121a243eba4d5ef1f2b18c906338abfe2b9060440160006040518083038186803b1580156118f957600080fd5b505af415801561190d573d6000803e3d6000fd5b5050505050565b61191c613a83565b60075460005b8181101561193b5761193381611a1b565b600101611922565b5050565b6000611949610f20565b611951612448565b61195b919061551a565b90506000611970670de0b6b3a7640000610e9e565b9050600061197c61098f565b905060035482111561198e5760038290555b60008311801561199e5750600081115b156119f65760006119bb600080516020615f898339815191525490565b9050600081156119d8576119d382611615878661552d565b6119da565b845b6006549091506119f3906001600160a01b031682613cfb565b50505b42600555611a02613a83565b836008611a0f82826158d4565b50504260055550505050565b611a23613a83565b600060078281548110611a3857611a386154ee565b600091825260209182902060039091020154604080516278744560e21b815290516001600160a01b03909216935083926301e1d114926004808401938290030181865afa158015611a8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab191906154d5565b816001600160a01b03166337f1834e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611aef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1391906154d5565b14611bfd57806001600160a01b031663b460af94826001600160a01b03166337f1834e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8991906154d5565b6040516001600160e01b031960e084901b1681526004810191909152306024820181905260448201526064016020604051808303816000875af1158015611bd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf891906154d5565b505050565b6040516370a0823160e01b81523060048201526001600160a01b0382169063ba0876529082906370a0823190602401602060405180830381865afa158015611b65573d6000803e3d6000fd5b611c51613a83565b60065460408051600160a01b90920460ff16158015835260208301527f40f0175b5fde6802a96ba1ba9eeaaa9564b53a1c021b6fcde51422b574abcdbd910160405180910390a16006805460ff60a01b198116600160a01b9182900460ff1615909102179055565b6000611cc3613ab5565b611ccb613d31565b611cd482613d62565b600454831115611cf757604051631264675f60e01b815260040160405180910390fd5b600854600090611d2090611d199086906001600160401b0316612710856138f4565b6000613999565b905080611d2e856000613999565b611d38919061552d565b91506305f5e1008211611d5e57604051631f2a200560e01b815260040160405180910390fd5b8015611d7a57600654611d7a906001600160a01b031682613cfb565b611d848383613cfb565b611da3333086611d92611534565b6001600160a01b0316929190613db6565b600654600160a01b900460ff16611ea25760075460005b81811015611e9f5760078181548110611dd557611dd56154ee565b6000918252602090912060039091020154600780546001600160a01b0390921691636e553f6591611e2e9185908110611e1057611e106154ee565b600091825260208220600260039092020101548a91612710906138f4565b6040516001600160e01b031960e084901b16815260048101919091523060248201526044016020604051808303816000875af1158015611e72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9691906154d5565b50600101611dba565b50505b60408051858152602081018490526001600160a01b0385169133917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a350610eab6001600055565b6001600160a01b03166000908152600080516020615f69833981519152602052604090205490565b611f23613a83565b6113d66000613e1d565b600b546060906000816001600160401b03811115611f4d57611f4d614e34565b604051908082528060200260200182016040528015611f9257816020015b6040805180820190915260008082526020820152815260200190600190039081611f6b5790505b50905060005b82811015612050576040518060400160405280600b8381548110611fbe57611fbe6154ee565b60009182526020808320909101546001600160a01b03908116845289168252600e815260408220600b805494909201939092919086908110612002576120026154ee565b60009182526020808320909101546001600160a01b031683528201929092526040019020549052825183908390811061203d5761203d6154ee565b6020908102919091010152600101611f98565b509392505050565b612060613a83565b600061206a611534565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa1580156120b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d491906154d5565b9050808211156120fd57308282604051631a07fb6b60e31b815260040161178b939291906159d3565b600654600160a01b900460ff1615612128576040516303eb29d960e01b815260040160405180910390fd5b6007838154811061213b5761213b6154ee565b6000918252602090912060039091020154604051636e553f6560e01b8152600481018490523060248201526001600160a01b0390911690636e553f65906044015b6020604051808303816000875af115801561219b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121bf91906154d5565b50505050565b6121cd613a83565b6113d6613e8e565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300611559565b6000612208613ab5565b612210613d31565b61221982613d62565b8260000361223a57604051631f2a200560e01b815260040160405180910390fd5b6008546001600160401b0316600084612263612710612259858261552d565b88919060006138f4565b61226d919061552d565b905061228361227c828761551a565b6001613945565b925061228e846132fb565b8311156122ae57604051631264675f60e01b815260040160405180910390fd5b80156122ca576006546122ca906001600160a01b031682613cfb565b6122d48486613cfb565b6122e2333085611d92611534565b600654600160a01b900460ff166123e35760075460005b818110156123e05760078181548110612314576123146154ee565b6000918252602090912060039091020154600780546001600160a01b0390921691636e553f659161236f918590811061234f5761234f6154ee565b6000918252602090912060026003909202010154889061271060016138f4565b6040516001600160e01b031960e084901b16815260048101919091523060248201526044016020604051808303816000875af11580156123b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d791906154d5565b506001016122f9565b50505b5050610eab6001600055565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace048054606091600080516020615f6983398151915291610c4990615540565b6000610eab82336121fe565b600033610ebf818585613a24565b600854600090600160801b90046001600160401b0316156124b8576127106124a960055442612477919061552d565b61247f61098f565b61248991906157b9565b600854600160801b90046001600160401b0316906301e187e060006138f4565b6124b39190615a0a565b905090565b50600090565b6124c6613a83565b60006124d0611534565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa158015612516573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253a91906154d5565b60075490915082106125625760405163042a2e7160e11b81526004810183905260240161178b565b600654600160a01b900460ff161561258d576040516303eb29d960e01b815260040160405180910390fd5b6000600783815481106125a2576125a26154ee565b60009182526020808320604080518082018252600390940290910180546001600160a01b03908116855282518084019093526001820154835260029091015482840190815292840191909152825191519294501691636e553f659161260d91869190612710906138f4565b6040516001600160e01b031960e084901b168152600481019190915230602482015260440161217c565b600854600090819061169e906127109061265a906001600160401b03168261552d565b85919060006138f4565b61266c613ab5565b612674613a83565b600061267e610f20565b612686612448565b612690919061551a565b905060006126a5670de0b6b3a7640000610e9e565b905060006126b161098f565b90506003548211156126c35760038290555b6000831180156126d35750600081115b1561272b5760006126f0600080516020615f898339815191525490565b90506000811561270d5761270882611615878661552d565b61270f565b845b600654909150612728906001600160a01b031682613cfb565b50505b426005556002546000908190735dda99c5821f02d19c121a243eba4d5ef1f2b18c906370b9cd689060079089908b908d906001600160a01b031661276d611534565b6040518763ffffffff1660e01b815260040161278e96959493929190615a1e565b606060405180830381865af41580156127ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127cf9190615a85565b600280546001600160a01b0319166001600160a01b039485161790559093509150811615612834576040516001600160a01b03821681527f09a1db4b80c32706328728508c941a6b954f31eb5affd32f236c1fd405f8fea49060200160405180910390a15b6040516001600160a01b03831681527f3f008fd510eae7a9e7bee13513d7b83bef8003d488b5a3d0b0da4de71d6846f1906020015b60405180910390a15050505050611bf86001600055565b600061288a613ab5565b612892613d31565b6001600160a01b0383166128b957604051634e46966960e11b815260040160405180910390fd5b6128c28261335d565b8411156128e257604051631264675f60e01b815260040160405180910390fd5b6128ed846001613999565b90506305f5e100811161291357604051631f2a200560e01b815260040160405180910390fd5b600854600654600160401b9091046001600160401b0316906000906001600160a01b03163303612944576000612969565b8261295f612710612955858261552d565b86919060006138f4565b612969919061552d565b9050612975818461551a565b92506129848686868685613ed7565b50506110fb6001600055565b60606007805480602002602001604051908101604052809291908181526020016000905b82821015612a125760008481526020908190206040805180820182526003860290920180546001600160a01b0316835281518083019092526001808201548352600290910154828501528284019190915290835290920191016129b4565b50505050905090565b6000610eab8233611cb9565b6000612a31613ab5565b612a39613d31565b6001600160a01b038316612a6057604051634e46966960e11b815260040160405180910390fd5b83600003612a8157604051631f2a200560e01b815260040160405180910390fd5b612a8a8261336b565b841115612aaa57604051631264675f60e01b815260040160405180910390fd5b600854600090612ad0908690600160401b90046001600160401b031661271060016138f4565b9050612ae6612adf828761552d565b6000613945565b9150612af58285858885613ed7565b506110fb6001600055565b612b08613a83565b60048190556040518181527f5d2e73196f8ba1b44e887e2bcc9bcd1f3e657add341d4a0a632ffff00d6903f2906020015b60405180910390a150565b6002546001600160a01b03163314612b71576040516311dc66cd60e11b815233600482015260240161178b565b6000735dda99c5821f02d19c121a243eba4d5ef1f2b18c631bc92572612b95611534565b60025460405160e084901b6001600160e01b03191681526001600160a01b039283166004820152602481018790529116604482015260076064820152608401602060405180830381865af4158015612bf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c1591906154d5565b905081811015612c3e57308282604051632e2a182f60e11b815260040161178b939291906159d3565b600254604051636e553f6560e01b8152600481018490523060248201526001600160a01b0390911690636e553f65906044016020604051808303816000875af1158015612c8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cb391906154d5565b506002546040518381526001600160a01b03909116907f986c3f7d8e5489362da2e0e75ed9d0aa29fbf30326fc391ae913868a4730bdb89060200160405180910390a25050565b612d02613ab5565b612d0a613a83565b6000612d14610f20565b612d1c612448565b612d26919061551a565b90506000612d3b670de0b6b3a7640000610e9e565b90506000612d4761098f565b9050600354821115612d595760038290555b600083118015612d695750600081115b15612dc1576000612d86600080516020615f898339815191525490565b905060008115612da357612d9e82611615878661552d565b612da5565b845b600654909150612dbe906001600160a01b031682613cfb565b50505b42600555600754808510612deb5760405163042a2e7160e11b81526004810186905260240161178b565b600060078681548110612e0057612e006154ee565b60009182526020909120600390910201546002546001600160a01b039182169250735dda99c5821f02d19c121a243eba4d5ef1f2b18c91635bfe38f891849116612e48611534565b60405160e085901b6001600160e01b03191681526001600160a01b03938416600482015291831660248301529091166044820152606401602060405180830381865af4158015612e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec09190615ac7565b600280546001600160a01b0319166001600160a01b0392831617905560405190821681527f09a1db4b80c32706328728508c941a6b954f31eb5affd32f236c1fd405f8fea49060200160405180910390a16007612f1e60018461552d565b81548110612f2e57612f2e6154ee565b906000526020600020906003020160078781548110612f4f57612f4f6154ee565b60009182526020909120825460039092020180546001600160a01b0319166001600160a01b03909216919091178155600180830154908201556002918201549101556007805480612fa257612fa2615ae4565b60008281526020812060036000199093019283020180546001600160a01b031916815560018101829055600201559055506113bd9350613adf92505050565b6060600b80548060200260200160405190810160405280929190818152602001828054801561303957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161301b575b5050505050905090565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03166000811580156130885750825b90506000826001600160401b031660011480156130a45750303b155b9050811580156130b2575080155b156130d05760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156130fa57845460ff60401b1916600160401b1785555b613102613ab5565b61310a614037565b6131138d614047565b61311d8c8c614058565b6131268661406a565b6001600160a01b038d1661314d57604051630ccd248560e21b815260040160405180910390fd5b735dda99c5821f02d19c121a243eba4d5ef1f2b18c63c03e99d98e60098d600260009054906101000a90046001600160a01b031660078e60086040518863ffffffff1660e01b81526004016131a89796959493929190615b9f565b6040805180830381865af41580156131c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131e89190615c57565b600280546001600160a81b031916600160a01b60ff93909316929092026001600160a01b031916919091176001600160a01b03928316179055891661324057604051630ed1b8b360e31b815260040160405180910390fd5b60068054633b9aca0060035560048990556001600160a81b0319166001600160a01b03808c1691909117909155604051908e169030907f3cd5ec01b1ae7cfec6ca1863e2cd6aa25d6d1702825803ff2b7cc95010fffdc290600090a36132a66001600055565b83156132ec57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050505050565b6000613316600080516020615fa98339815191525460ff1690565b8061332a575060045461332761098f565b10155b6133485761333661098f565b600454613343919061552d565b610eab565b600092915050565b6000610eab826000613999565b6000610eab612adf83611ef3565b6000610eab82611ef3565b6000610eab823333612a27565b6001600160a01b0391821660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b6133d5613a83565b6001600160a01b0381166133fc57604051630ed1b8b360e31b815260040160405180910390fd5b6006546040516001600160a01b038084169216907faaebcf1bfa00580e41d966056b48521fa9f202645c86d4ddf28113e617c1b1d390600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b60065460009081906001600160a01b03163303613476576000613492565b6008546134929084906001600160401b031661271060006138f4565b61349c908461552d565b90506110fb816000613999565b6134b1613a83565b6134b9613ab5565b600a546001600160a01b03166134e257604051637c0c423f60e11b815260040160405180910390fd5b60006134ec6113d8565b90506000600a60009054906101000a90046001600160a01b03166001600160a01b0316634f069a136040518163ffffffff1660e01b8152600401602060405180830381865afa158015613543573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061356791906154d5565b90506000600a60009054906101000a90046001600160a01b03166001600160a01b03166319c2b4c36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135e291906154d5565b90508160006135f1868361551a565b831061360657613601868561551a565b613608565b825b9050600061361785600161551a565b90505b81811161364957600061362d828861407b565b905086810361363c5750613649565b955091506001820161361a565b508382146136af57600a546040516284778560e11b8152600481018490526001600160a01b0390911690630108ef0a90602401600060405180830381600087803b15801561369657600080fd5b505af11580156136aa573d6000803e3d6000fd5b505050505b50505050506113bd6001600055565b6136c6613a83565b6001600160a01b0381166136f057604051631e4fbdf760e01b81526000600482015260240161178b565b6113bd81613e1d565b613701613ab5565b613709613a83565b6000613713610f20565b61371b612448565b613725919061551a565b9050600061373a670de0b6b3a7640000610e9e565b9050600061374661098f565b90506003548211156137585760038290555b6000831180156137685750600081115b156137c0576000613785600080516020615f898339815191525490565b9050600081156137a25761379d82611615878661552d565b6137a4565b845b6006549091506137bd906001600160a01b031682613cfb565b50505b42600555600754859081146137f657600754604051632db9197d60e11b815261178b918391600401918252602082015260400190565b6000805b8281101561388a57888882818110613814576138146154ee565b9050604002016020013582613829919061551a565b915088888281811061383d5761383d6154ee565b90506040020160078281548110613856576138566154ee565b90600052602060002090600302016001018181613880919081358155602082013560018201555050565b50506001016137fa565b5080612710146138ad57604051635632103160e01b815260040160405180910390fd5b85156138c3576138bb611914565b6138c36117fd565b7fb02d56028d2fba1da0ff6a7619d01fd6a273956cc6f10d93112c0e764c5196618888604051612869929190615c8c565b600080613902868686614111565b905061390d836141d5565b8015613929575060008480613924576139246159f4565b868809115b1561393c5761393960018261551a565b90505b95945050505050565b60006110fb61395261098f565b61395d90600161551a565b6139696009600a615daa565b600080516020615f8983398151915254613983919061551a565b859190856138f4565b611bf88383836001614202565b60006110fb6139aa6009600a615daa565b600080516020615f89833981519152546139c4919061551a565b6139cc61098f565b61398390600161551a565b60006139e38484613383565b905060001981146121bf5781811015613a1557828183604051637dc7a0d960e11b815260040161178b939291906159d3565b6121bf84848484036000614202565b6001600160a01b038316613a4e57604051634b637e8f60e11b81526000600482015260240161178b565b6001600160a01b038216613a785760405163ec442f0560e01b81526000600482015260240161178b565b611bf88383836142e9565b33613a8c6121d5565b6001600160a01b0316146113d65760405163118cdaa760e01b815233600482015260240161178b565b600260005403613ad857604051633ee5aeb560e01b815260040160405180910390fd5b6002600055565b6001600055565b6000613af182611ef3565b600b5490915060005b818110156121bf576000600c6000600b8481548110613b1b57613b1b6154ee565b60009182526020808320909101546001600160a01b0316835282019290925260400190205490508315613c43576000613b9a856ec097ce7bc90715b34b9f10000000006000600d60008b6001600160a01b03166001600160a01b031681526020019081526020016000206000600b8981548110610df957610df96154ee565b90508015613c41576001600160a01b0386166000908152600e60205260408120600b80548493919087908110613bd257613bd26154ee565b60009182526020808320909101546001600160a01b0316835282019290925260400181208054909190613c0690849061551a565b92505081905550613c418682600b8681548110613c2557613c256154ee565b6000918252602090912001546001600160a01b03169190614324565b505b6001600160a01b0385166000908152600d60205260408120600b80548493919086908110613c7357613c736154ee565b60009182526020808320909101546001600160a01b0316835282019290925260400190205550600101613afa565b613ca9614355565b600080516020615fa9833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b039091168152602001612b39565b6001600160a01b038216613d255760405163ec442f0560e01b81526000600482015260240161178b565b61193b600083836142e9565b600080516020615fa98339815191525460ff16156113d65760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b038116613d8957604051634e46966960e11b815260040160405180910390fd5b600080516020615f8983398151915254600003613da557426005555b6001546000036113bd574260015550565b6040516001600160a01b0384811660248301528381166044830152606482018390526121bf9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614385565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b613e96613d31565b600080516020615fa9833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833613ce3565b336001600160a01b03841614613f0657613f06833384613ef78733613383565b613f01919061552d565b61398c565b613f1083836143e8565b8015613f2c57600654613f2c906001600160a01b031682613cfb565b6000613f366113d8565b9050858110613f4e57613f49868661441e565b613fe4565b600a546001600160a01b0316613f7d57308682604051631a07fb6b60e31b815260040161178b939291906159d3565b600a5460405163da95ebf760e01b81526001600160a01b038781166004830152602482018990529091169063da95ebf790604401600060405180830381600087803b158015613fcb57600080fd5b505af1158015613fdf573d6000803e3d6000fd5b505050505b60408051878152602081018590526001600160a01b03808716929088169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a4505050505050565b61403f61474c565b6113d6614795565b61404f61474c565b6113bd816147b6565b61406061474c565b61193b828261483a565b61407261474c565b6113bd8161488b565b600a54604051637e2079e760e11b815260048101849052602481018390526000918291829182916001600160a01b039091169063fc40f3ce906044016060604051808303816000875af11580156140d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140fa9190615db9565b92509250925080851461393c5761393c828461441e565b60008383028160001985870982811083820303915050806000036141485783828161413e5761413e6159f4565b04925050506110fb565b8084116141685760405163227bc15360e01b815260040160405180910390fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b600060028260038111156141eb576141eb615df0565b6141f59190615e06565b60ff166001149050919050565b600080516020615f698339815191526001600160a01b03851661423b5760405163e602df0560e01b81526000600482015260240161178b565b6001600160a01b03841661426557604051634a1406b160e11b81526000600482015260240161178b565b6001600160a01b0380861660009081526001830160209081526040808320938816835292905220839055811561190d57836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516142da91815260200190565b60405180910390a35050505050565b6001600160a01b038316156143015761430183613ae6565b6001600160a01b038216156143195761431982613ae6565b611bf8838383614893565b6040516001600160a01b03838116602483015260448201839052611bf891859182169063a9059cbb90606401613deb565b600080516020615fa98339815191525460ff166113d657604051638dfc202b60e01b815260040160405180910390fd5b600061439a6001600160a01b038416836149be565b905080516000141580156143bf5750808060200190518101906143bd9190615e28565b155b15611bf857604051635274afe760e01b81526001600160a01b038416600482015260240161178b565b6001600160a01b03821661441257604051634b637e8f60e11b81526000600482015260240161178b565b61193b826000836142e9565b6000614428611534565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015614472573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061449691906154d5565b90508084116144b8576144b36001600160a01b0383168486614324565b6121bf565b60006144c4828661552d565b600754909150600090815b81811015614706576000600782815481106144ec576144ec6154ee565b6000918252602080832060408051808201825260039490940290910180546001600160a01b03908116855282518084018452600183015481526002909201548285015292840152825190516370a0823160e01b81523060048201529294501690634cdad5069082906370a0823190602401602060405180830381865afa15801561457a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061459e91906154d5565b6040518263ffffffff1660e01b81526004016145bc91815260200190565b602060405180830381865afa1580156145d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145fd91906154d5565b6020808401510151909150819061461a90889061271060016138f4565b1115614651578151602080840151015161463490886157b9565b82604051632e2a182f60e11b815260040161178b939291906159d3565b602080830151015160009061466c908c9061271060016138f4565b8351604051632d182be560e21b8152600481018390526001600160a01b038d8116602483015230604483015292935091169063b460af94906064016020604051808303816000875af11580156146c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146ea91906154d5565b506146f5818761551a565b955050600190920191506144cf9050565b50868210801561471f57508361471c838961552d565b11155b156147435761474386614732848a61552d565b6001600160a01b0388169190614324565b50505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166113d657604051631afcd79f60e31b815260040160405180910390fd5b61479d61474c565b600080516020615fa9833981519152805460ff19169055565b6147be61474c565b7f0773e532dfede91f04b12a73d3d2acd361424f41f76b4fb79f090161e36b4e006000806147eb846149cc565b91509150816147fb5760126147fd565b805b83546001600160a81b031916600160a01b60ff92909216919091026001600160a01b031916176001600160a01b0394909416939093179091555050565b61484261474c565b600080516020615f698339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0361487c8482615e8d565b50600481016121bf8382615e8d565b6136c661474c565b600080516020615f698339815191526001600160a01b0384166148cf57818160020160008282546148c4919061551a565b9091555061492e9050565b6001600160a01b0384166000908152602082905260409020548281101561490f5784818460405163391434e360e21b815260040161178b939291906159d3565b6001600160a01b03851660009081526020839052604090209083900390555b6001600160a01b03831661494c57600281018054839003905561496b565b6001600160a01b03831660009081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516149b091815260200190565b60405180910390a350505050565b60606110fb83836000614aa8565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b17905290516000918291829182916001600160a01b03871691614a1391615f4c565b600060405180830381855afa9150503d8060008114614a4e576040519150601f19603f3d011682016040523d82523d6000602084013e614a53565b606091505b5091509150818015614a6757506020815110155b15614a9b57600081806020019051810190614a8291906154d5565b905060ff8111614a99576001969095509350505050565b505b5060009485945092505050565b606081471015614acd5760405163cd78605960e01b815230600482015260240161178b565b600080856001600160a01b03168486604051614ae99190615f4c565b60006040518083038185875af1925050503d8060008114614b26576040519150601f19603f3d011682016040523d82523d6000602084013e614b2b565b606091505b5091509150614b3b868383614b45565b9695505050505050565b606082614b5a57614b5582614ba1565b6110fb565b8151158015614b7157506001600160a01b0384163b155b15614b9a57604051639996b31560e01b81526001600160a01b038516600482015260240161178b565b50806110fb565b805115614bb15780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b60005b83811015614be5578181015183820152602001614bcd565b50506000910152565b60008151808452614c06816020860160208601614bca565b601f01601f19169290920160200192915050565b6020815260006110fb6020830184614bee565b6001600160a01b03811681146113bd57600080fd5b8035614c4d81614c2d565b919050565b600060208284031215614c6457600080fd5b81356110fb81614c2d565b602080825282518282018190526000919060409081850190868401855b82811015614cba57815180516001600160a01b03168552860151868501529284019290850190600101614c8c565b5091979650505050505050565b600060208284031215614cd957600080fd5b5035919050565b60008060408385031215614cf357600080fd5b8235614cfe81614c2d565b946020939093013593505050565b6000602080835260a083016001600160401b0380865116602086015280602087015116604086015260408601516060828216606088015260608801519250608080880152839150825180855260c088019250602084019450600093505b80841015614dad57614d9983865180518252602080820151908301526040908101516001600160401b0316910152565b938501936001939093019291810191614d69565b5090979650505050505050565b60008060408385031215614dcd57600080fd5b8235614dd881614c2d565b91506020830135614de881614c2d565b809150509250929050565b600080600060608486031215614e0857600080fd5b8335614e1381614c2d565b92506020840135614e2381614c2d565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715614e6c57614e6c614e34565b60405290565b604051608081016001600160401b0381118282101715614e6c57614e6c614e34565b604051606081016001600160401b0381118282101715614e6c57614e6c614e34565b604051601f8201601f191681016001600160401b0381118282101715614ede57614ede614e34565b604052919050565b60006001600160401b03821115614eff57614eff614e34565b50601f01601f191660200190565b6000614f20614f1b84614ee6565b614eb6565b9050828152838383011115614f3457600080fd5b828260208301376000602084830101529392505050565b600060208284031215614f5d57600080fd5b81356001600160401b03811115614f7357600080fd5b8201601f81018413614f8457600080fd5b614f9384823560208401614f0d565b949350505050565b600060208284031215614fad57600080fd5b81356001600160401b03811115614fc357600080fd5b8201608081850312156110fb57600080fd5b60008060408385031215614fe857600080fd5b823591506020830135614de881614c2d565b6000806040838503121561500d57600080fd5b50508035926020909101359150565b80151581146113bd57600080fd5b600080600083850360a081121561504057600080fd5b8435935060208501356150528161501c565b92506060603f198201121561506657600080fd5b506040840190509250925092565b60008060006060848603121561508957600080fd5b83359250602084013561509b81614c2d565b915060408401356150ab81614c2d565b809150509250925092565b6020808252825182820181905260009190848201906040850190845b8181101561511657835180516001600160a01b031684528501516151028685018280518252602090810151910152565b5092840192606092909201916001016150d2565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156151165783516001600160a01b03168352928401929184019160010161513e565b600082601f83011261517457600080fd5b6110fb83833560208501614f0d565b60006001600160401b0382111561519c5761519c614e34565b5060051b60200190565b600082601f8301126151b757600080fd5b813560206151c7614f1b83615183565b828152606092830285018201928282019190878511156151e657600080fd5b8387015b85811015614dad57808903828112156152035760008081fd5b61520b614e4a565b823561521681614c2d565b81526040601f19830181131561522c5760008081fd5b615234614e4a565b8489013581529084013588820152818801528552509284019281016151ea565b6001600160401b03811681146113bd57600080fd5b60006080828403121561527b57600080fd5b615283614e72565b9050813561529081615254565b81526020828101356152a181615254565b828201526040838101356152b481615254565b60408401526060848101356001600160401b038111156152d357600080fd5b8501601f810187136152e457600080fd5b80356152f2614f1b82615183565b81815260609091028201850190858101908983111561531057600080fd5b928601925b828410156153615784848b03121561532d5760008081fd5b615335614e94565b8435815287850135888201528685013561534e81615254565b8188015282529284019290860190615315565b60608801525094979650505050505050565b600080600080600080600080610100898b03121561539057600080fd5b61539989614c42565b975060208901356001600160401b03808211156153b557600080fd5b6153c18c838d01615163565b985060408b01359150808211156153d757600080fd5b6153e38c838d01615163565b975060608b01359150808211156153f957600080fd5b6154058c838d016151a6565b965061541360808c01614c42565b955060a08b013591508082111561542957600080fd5b506154368b828c01615269565b93505060c0890135915061544c60e08a01614c42565b90509295985092959890939650565b60008060006040848603121561547057600080fd5b83356001600160401b038082111561548757600080fd5b818601915086601f83011261549b57600080fd5b8135818111156154aa57600080fd5b8760208260061b85010111156154bf57600080fd5b602092830195509350508401356150ab8161501c565b6000602082840312156154e757600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820180821115610eab57610eab615504565b81810381811115610eab57610eab615504565b600181811c9082168061555457607f821691505b60208210810361557457634e487b7160e01b600052602260045260246000fd5b50919050565b600082601f83011261558b57600080fd5b8151602061559b614f1b83615183565b82815260059290921b840181019181810190868411156155ba57600080fd5b8286015b848110156156355780516001600160401b038111156155dd5760008081fd5b8701603f810189136155ef5760008081fd5b848101516040615601614f1b83614ee6565b8281528b828486010111156156165760008081fd5b61562583898301848701614bca565b86525050509183019183016155be565b509695505050505050565b6000806040838503121561565357600080fd5b82516001600160401b038082111561566a57600080fd5b818501915085601f83011261567e57600080fd5b8151602061568e614f1b83615183565b82815260059290921b840181019181810190898411156156ad57600080fd5b948201945b838610156156cb578551825294820194908201906156b2565b918801519196509093505050808211156156e457600080fd5b506156f18582860161557a565b9150509250929050565b6000602080838503121561570e57600080fd5b82516001600160401b0381111561572457600080fd5b8301601f8101851361573557600080fd5b8051615743614f1b82615183565b81815260069190911b8201830190838101908783111561576257600080fd5b928401925b828410156157ae57604084890312156157805760008081fd5b615788614e4a565b845161579381614c2d565b81528486015186820152825260409093019290840190615767565b979650505050505050565b8082028115828204841417610eab57610eab615504565b813581556020820135600182015560408201356157ec81615254565b60028201805467ffffffffffffffff19166001600160401b038316179055505050565b600160401b83111561582357615823614e34565b8054838255808410156158975760038160030260038104831461584857615848615504565b8560030260038104871461585e5761585e615504565b6000858152602081209283019291909101905b82821015615892578082558060018301558060028301558382019150615871565b505050505b5060008181526020812083915b858110156158cc576158b683836157d0565b60609290920191600391909101906001016158a4565b505050505050565b81356158df81615254565b815467ffffffffffffffff19166001600160401b03821617825550602082013561590881615254565b81546fffffffffffffffff0000000000000000604092831b166fffffffffffffffff0000000000000000198216811784559184013561594681615254565b77ffffffffffffffffffffffffffffffff0000000000000000199190911690911760809190911b67ffffffffffffffff60801b16178155606082013536839003601e1901811261599557600080fd5b820180356001600160401b038111156159ad57600080fd5b6020820191506060810236038213156159c557600080fd5b6121bf81836001860161580f565b6001600160a01b039390931683526020830191909152604082015260600190565b634e487b7160e01b600052601260045260246000fd5b600082615a1957615a196159f4565b500490565b86815261010081018635615a3181614c2d565b60018060a01b038082166020850152615a5a6040850160208b0180358252602090810135910152565b87151560808501528660a085015280861660c085015280851660e08501525050979650505050505050565b600080600060608486031215615a9a57600080fd5b8351615aa581614c2d565b6020850151909350615ab681614c2d565b60408501519092506150ab81614c2d565b600060208284031215615ad957600080fd5b81516110fb81614c2d565b634e487b7160e01b600052603160045260246000fd5b6000608083016001600160401b0380845116855260208160208601511660208701528160408601511660408701526060915060608501516080606088015283815180865260a089019150602083019550600092505b80831015615b9357615b7f82875180518252602080820151908301526040908101516001600160401b0316910152565b948301946001929092019190840190615b4f565b50979650505050505050565b600060e0820160018060a01b03808b168452602060ff8b16602086015260e06040860152828a518085526101008701915060208c01945060005b81811015615c16578551805186168452840151615c028585018280518252602090810151910152565b509483019460609290920191600101615bd9565b50506001600160a01b038a16606087015288608087015285810360a0870152615c3f8189615afa565b9450505050508260c083015298975050505050505050565b60008060408385031215615c6a57600080fd5b8251615c7581614c2d565b602084015190925060ff81168114614de857600080fd5b602080825281018290526000604080830185835b868110156151165781358352602080830135908401529183019190830190600101615ca0565b600181815b80851115615d01578160001904821115615ce757615ce7615504565b80851615615cf457918102915b93841c9390800290615ccb565b509250929050565b600082615d1857506001610eab565b81615d2557506000610eab565b8160018114615d3b5760028114615d4557615d61565b6001915050610eab565b60ff841115615d5657615d56615504565b50506001821b610eab565b5060208310610133831016604e8410600b8410161715615d84575081810a610eab565b615d8e8383615cc6565b8060001904821115615da257615da2615504565b029392505050565b60006110fb60ff841683615d09565b600080600060608486031215615dce57600080fd5b8351615dd981614c2d565b602085015160409095015190969495509392505050565b634e487b7160e01b600052602160045260246000fd5b600060ff831680615e1957615e196159f4565b8060ff84160691505092915050565b600060208284031215615e3a57600080fd5b81516110fb8161501c565b601f821115611bf8576000816000526020600020601f850160051c81016020861015615e6e5750805b601f850160051c820191505b818110156158cc57828155600101615e7a565b81516001600160401b03811115615ea657615ea6614e34565b615eba81615eb48454615540565b84615e45565b602080601f831160018114615eef5760008415615ed75750858301515b600019600386901b1c1916600185901b1785556158cc565b600085815260208120601f198616915b82811015615f1e57888601518255948401946001909101908401615eff565b5085821015615f3c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008251615f5e818460208701614bca565b919091019291505056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0052c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300a26469706673582212203d8d4a67696b7125c250d1a76ae09bc01f4e13e9e16e1b4231ef7a3e706234ff64736f6c63430008180033