{
  "_format": "hh-sol-artifact-1",
  "contractName": "Liquidity2Test",
  "sourceName": "contracts/test/liquidity/Liquidity2Test.sol",
  "abi": [
    {
      "inputs": [],
      "name": "AccessControlBadConfirmation",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "neededRole",
          "type": "bytes32"
        }
      ],
      "name": "AccessControlUnauthorizedAccount",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "AddressEmptyCode",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AddressZero",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AlreadyRelayed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AmlValidationFailed",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "depositAmount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "limit",
          "type": "uint256"
        }
      ],
      "name": "DepositAmountExceedsLimit",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "depositHash",
          "type": "bytes32"
        }
      ],
      "name": "DepositHashAlreadyExists",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "ERC1967InvalidImplementation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ERC1967NonPayable",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "EligibilityValidationFailed",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "EnforcedPause",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ExpectedPause",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "FailedCall",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "depositDataHash",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "calculatedHash",
          "type": "bytes32"
        }
      ],
      "name": "InvalidDepositHash",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidInitialization",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidWithdrawalAddress",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotInitializing",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlySenderCanCancelDeposit",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "upToDepositId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "firstDepositId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "lastDepositId",
          "type": "uint256"
        }
      ],
      "name": "OutOfRange",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "RelayLimitExceeded",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "SafeERC20FailedOperation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "SenderIsNotScrollMessenger",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TokenAddressIsZero",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "TriedToDepositZero",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UUPSUnauthorizedCallContext",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "slot",
          "type": "bytes32"
        }
      ],
      "name": "UUPSUnsupportedProxiableUUID",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "WithdrawalAddressNotSet",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "WithdrawalFeeRatioExceedsLimit",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "withdrawalHash",
          "type": "bytes32"
        }
      ],
      "name": "WithdrawalNotFound",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "withdrawalHash",
          "type": "bytes32"
        }
      ],
      "name": "ClaimedWithdrawal",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "depositId",
          "type": "uint256"
        }
      ],
      "name": "DepositCanceled",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "depositId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "recipientSaltHash",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "tokenIndex",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "isEligible",
          "type": "bool"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "depositedAt",
          "type": "uint256"
        }
      ],
      "name": "Deposited",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "upToDepositId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "gasLimit",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "message",
          "type": "bytes"
        }
      ],
      "name": "DepositsRelayed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "withdrawalHash",
          "type": "bytes32"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "recipient",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "tokenIndex",
              "type": "uint32"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "nullifier",
              "type": "bytes32"
            }
          ],
          "indexed": false,
          "internalType": "struct WithdrawalLib.Withdrawal",
          "name": "withdrawal",
          "type": "tuple"
        }
      ],
      "name": "DirectWithdrawalFailed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "withdrawalHash",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        }
      ],
      "name": "DirectWithdrawalSuccessed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "version",
          "type": "uint64"
        }
      ],
      "name": "Initialized",
      "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": "amlPermitter",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "eligibilityPermitter",
          "type": "address"
        }
      ],
      "name": "PermitterSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "previousAdminRole",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "newAdminRole",
          "type": "bytes32"
        }
      ],
      "name": "RoleAdminChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleGranted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "RoleRevoked",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "Unpaused",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "Upgraded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "withdrawalHash",
          "type": "bytes32"
        }
      ],
      "name": "WithdrawalClaimable",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint32",
          "name": "token",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "WithdrawalFeeCollected",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint32",
          "name": "tokenIndex",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "feeRatio",
          "type": "uint256"
        }
      ],
      "name": "WithdrawalFeeRatioSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint32",
          "name": "token",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "WithdrawalFeeWithdrawn",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DEFAULT_ADMIN_ROLE",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "RELAYER",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "RELAY_LIMIT",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "UPGRADE_INTERFACE_VERSION",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "WITHDRAWAL",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "WITHDRAWAL_FEE_RATIO_LIMIT",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "amlPermitter",
      "outputs": [
        {
          "internalType": "contract IPermitter",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "depositId",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "depositor",
              "type": "address"
            },
            {
              "internalType": "bytes32",
              "name": "recipientSaltHash",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            },
            {
              "internalType": "uint32",
              "name": "tokenIndex",
              "type": "uint32"
            },
            {
              "internalType": "bool",
              "name": "isEligible",
              "type": "bool"
            }
          ],
          "internalType": "struct DepositLib.Deposit",
          "name": "deposit",
          "type": "tuple"
        }
      ],
      "name": "cancelDeposit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "recipient",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "tokenIndex",
              "type": "uint32"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "nullifier",
              "type": "bytes32"
            }
          ],
          "internalType": "struct WithdrawalLib.Withdrawal[]",
          "name": "withdrawals",
          "type": "tuple[]"
        }
      ],
      "name": "claimWithdrawals",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "claimableWithdrawals",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "name": "collectedWithdrawalFees",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "contribution",
      "outputs": [
        {
          "internalType": "contract IContribution",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "deploymentTime",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "tokenAddress",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "recipientSaltHash",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "amlPermission",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "eligibilityPermission",
          "type": "bytes"
        }
      ],
      "name": "depositERC1155",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "tokenAddress",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "recipientSaltHash",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "amlPermission",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "eligibilityPermission",
          "type": "bytes"
        }
      ],
      "name": "depositERC20",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "tokenAddress",
          "type": "address"
        },
        {
          "internalType": "bytes32",
          "name": "recipientSaltHash",
          "type": "bytes32"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "amlPermission",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "eligibilityPermission",
          "type": "bytes"
        }
      ],
      "name": "depositERC721",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "recipientSaltHash",
          "type": "bytes32"
        },
        {
          "internalType": "bytes",
          "name": "amlPermission",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "eligibilityPermission",
          "type": "bytes"
        }
      ],
      "name": "depositNativeToken",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "doesDepositHashExist",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "eligibilityPermitter",
      "outputs": [
        {
          "internalType": "contract IPermitter",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "depositId",
          "type": "uint256"
        }
      ],
      "name": "getDepositData",
      "outputs": [
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "depositHash",
              "type": "bytes32"
            },
            {
              "internalType": "address",
              "name": "sender",
              "type": "address"
            }
          ],
          "internalType": "struct DepositQueueLib.DepositData",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256[]",
          "name": "depositIds",
          "type": "uint256[]"
        }
      ],
      "name": "getDepositDataBatch",
      "outputs": [
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "depositHash",
              "type": "bytes32"
            },
            {
              "internalType": "address",
              "name": "sender",
              "type": "address"
            }
          ],
          "internalType": "struct DepositQueueLib.DepositData[]",
          "name": "",
          "type": "tuple[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "depositId",
          "type": "uint256"
        }
      ],
      "name": "getDepositDataHash",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getLastDepositId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getLastRelayedDepositId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getNativeTokenIndex",
      "outputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        }
      ],
      "name": "getRoleAdmin",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "enum ITokenData.TokenType",
          "name": "tokenType",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "tokenAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "getTokenIndex",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        },
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "tokenIndex",
          "type": "uint32"
        }
      ],
      "name": "getTokenInfo",
      "outputs": [
        {
          "components": [
            {
              "internalType": "enum ITokenData.TokenType",
              "name": "tokenType",
              "type": "uint8"
            },
            {
              "internalType": "address",
              "name": "tokenAddress",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "tokenId",
              "type": "uint256"
            }
          ],
          "internalType": "struct ITokenData.TokenInfo",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getVal",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "grantRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "hasRole",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_admin",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_l1ScrollMessenger",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_rollup",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_withdrawal",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_claim",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_relayer",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_contribution",
          "type": "address"
        },
        {
          "internalType": "address[]",
          "name": "initialERC20Tokens",
          "type": "address[]"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "depositId",
          "type": "uint256"
        },
        {
          "internalType": "bytes32",
          "name": "recipientSaltHash",
          "type": "bytes32"
        },
        {
          "internalType": "uint32",
          "name": "tokenIndex",
          "type": "uint32"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "isEligible",
          "type": "bool"
        },
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        }
      ],
      "name": "isDepositValid",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "l1ScrollMessenger",
      "outputs": [
        {
          "internalType": "contract IL1ScrollMessenger",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "name": "onERC1155Received",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "pauseDeposits",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "paused",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "recipient",
              "type": "address"
            },
            {
              "internalType": "uint32",
              "name": "tokenIndex",
              "type": "uint32"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            },
            {
              "internalType": "bytes32",
              "name": "nullifier",
              "type": "bytes32"
            }
          ],
          "internalType": "struct WithdrawalLib.Withdrawal[]",
          "name": "withdrawals",
          "type": "tuple[]"
        },
        {
          "internalType": "bytes32[]",
          "name": "withdrawalHashes",
          "type": "bytes32[]"
        }
      ],
      "name": "processWithdrawals",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proxiableUUID",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "upToDepositId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "gasLimit",
          "type": "uint256"
        }
      ],
      "name": "relayDeposits",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "callerConfirmation",
          "type": "address"
        }
      ],
      "name": "renounceRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "role",
          "type": "bytes32"
        },
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "revokeRole",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "rollup",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_amlPermitter",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_eligibilityPermitter",
          "type": "address"
        }
      ],
      "name": "setPermitter",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "tokenIndex",
          "type": "uint32"
        },
        {
          "internalType": "uint256",
          "name": "feeRatio",
          "type": "uint256"
        }
      ],
      "name": "setWithdrawalFeeRatio",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "unpauseDeposits",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newImplementation",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "upgradeToAndCall",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint32[]",
          "name": "tokenIndices",
          "type": "uint32[]"
        }
      ],
      "name": "withdrawCollectedFees",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        }
      ],
      "name": "withdrawalFeeRatio",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b60805161466c6100fd6000396000818161222e01528181612257015261239b015261466c6000f3fe6080604052600436106102c95760003560e01c806391d1485411610175578063cb23bcb5116100dc578063dd9ea29911610095578063ea4644bb1161006f578063ea4644bb146108fb578063ecda10f51461091b578063f23a6e6114610931578063f6a552d41461097757600080fd5b8063dd9ea299146108a5578063e1cb0e52146108ba578063e579fa2b146108ce57600080fd5b8063cb23bcb5146107cb578063cbd90cd0146107eb578063cd6a976e14610818578063d395c01714610838578063d438c34914610865578063d547741f1461088557600080fd5b80639d6a54cb1161012e5780639d6a54cb146106de578063a217fddf146106fe578063a98f704414610713578063ad3cb1cc14610733578063c13819b614610771578063c60af2b51461079e57600080fd5b806391d148541461061e57806391f69b7d1461063e578063978069b41461065e578063986be0e21461067e5780639c79a31c1461069e5780639d07861c146106be57600080fd5b80634f1ef286116102345780635c975abb116101ed57806367517837116101c757806367517837146105b657806376918c0d146105cb57806385979730146105de578063902eeef3146105fe57600080fd5b80635c975abb1461054c5780635edeb2a31461057157806363d8882a146105a157600080fd5b80634f1ef2861461049657806350520b1f146104a957806352d1902d146104e157806354adcb99146104f65780635521f77e1461050c57806358dec40a1461052c57600080fd5b80632f2ff15d116102865780632f2ff15d146103c557806336568abe146103e5578063381175f6146104055780633cd07066146104415780633de40cfa14610461578063433f6c121461047457600080fd5b806301ffc9a7146102ce5780630219198014610303578063219cd2631461031a578063232c1c8a146103365780632483e71514610363578063248a9ca3146103a5575b600080fd5b3480156102da57600080fd5b506102ee6102e936600461383d565b61098d565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b506103186109c4565b005b34801561032657600080fd5b50604051600081526020016102fa565b34801561034257600080fd5b506103566103513660046138d0565b6109da565b6040516102fa9190613960565b34801561036f57600080fd5b506103977fab4f864e5201b0fde9b5ee3e4cf96384802b0ffdfcf7f9de4699ce21a30afc4f81565b6040519081526020016102fa565b3480156103b157600080fd5b506103976103c03660046139c1565b610adb565b3480156103d157600080fd5b506103186103e03660046139ef565b610afd565b3480156103f157600080fd5b506103186104003660046139ef565b610b1f565b34801561041157600080fd5b50610425610420366004613a1f565b610b57565b60408051921515835263ffffffff9091166020830152016102fa565b34801561044d57600080fd5b5061031861045c366004613a7d565b610c72565b61031861046f366004613aef565b610cf7565b34801561048057600080fd5b5061039760008051602061461783398151915281565b6103186104a4366004613b6c565b610dec565b3480156104b557600080fd5b506005546104c9906001600160a01b031681565b6040516001600160a01b0390911681526020016102fa565b3480156104ed57600080fd5b50610397610e0b565b34801561050257600080fd5b506103976101c281565b34801561051857600080fd5b50610318610527366004613c17565b610e28565b34801561053857600080fd5b50610318610547366004613cf4565b610f53565b34801561055857600080fd5b506000805160206145f78339815191525460ff166102ee565b34801561057d57600080fd5b506102ee61058c3660046139c1565b600c6020526000908152604090205460ff1681565b3480156105ad57600080fd5b50610318611052565b3480156105c257600080fd5b50610397611065565b6103186105d9366004613d48565b61107c565b3480156105ea57600080fd5b506008546104c9906001600160a01b031681565b34801561060a57600080fd5b50610318610619366004613d6a565b6111e4565b34801561062a57600080fd5b506102ee6106393660046139ef565b61124e565b34801561064a57600080fd5b50610318610659366004613ddc565b611286565b34801561066a57600080fd5b506007546104c9906001600160a01b031681565b34801561068a57600080fd5b506103976106993660046139c1565b611433565b3480156106aa57600080fd5b506103186106b9366004613e1d565b611464565b3480156106ca57600080fd5b506102ee6106d9366004613e63565b6115dc565b3480156106ea57600080fd5b506103186106f9366004613ec8565b6116ae565b34801561070a57600080fd5b50610397600081565b34801561071f57600080fd5b506004546104c9906001600160a01b031681565b34801561073f57600080fd5b50610764604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102fa9190613f87565b34801561077d57600080fd5b5061079161078c3660046139c1565b61177f565b6040516102fa9190613f9a565b3480156107aa57600080fd5b506103976107b9366004613fba565b600b6020526000908152604090205481565b3480156107d757600080fd5b506006546104c9906001600160a01b031681565b3480156107f757600080fd5b5061080b610806366004613fba565b6117e0565b6040516102fa9190613feb565b34801561082457600080fd5b50610318610833366004613c17565b611883565b34801561084457600080fd5b50610397610853366004613fba565b600a6020526000908152604090205481565b34801561087157600080fd5b50610318610880366004614036565b6119e3565b34801561089157600080fd5b506103186108a03660046139ef565b611b72565b3480156108b157600080fd5b50610397611b8e565b3480156108c657600080fd5b506007610397565b3480156108da57600080fd5b506103976108e93660046139c1565b60096020526000908152604090205481565b34801561090757600080fd5b506103186109163660046140d8565b611ba0565b34801561092757600080fd5b5061039760035481565b34801561093d57600080fd5b5061095e61094c366004614200565b63f23a6e6160e01b9695505050505050565b6040516001600160e01b031990911681526020016102fa565b34801561098357600080fd5b506103976105dc81565b60006001600160e01b03198216637965db0b60e01b14806109be57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60006109cf81611eb1565b6109d7611ebb565b50565b6060600082516001600160401b038111156109f7576109f7613867565b604051908082528060200260200182016040528015610a3c57816020015b6040805180820190915260008082526020820152815260200190600190039081610a155790505b50905060005b8351811015610ad457600d600001848281518110610a6257610a6261427b565b602002602001015181548110610a7a57610a7a61427b565b60009182526020918290206040805180820190915260029092020180548252600101546001600160a01b0316918101919091528251839083908110610ac157610ac161427b565b6020908102919091010152600101610a42565b5092915050565b60009081526000805160206145d7833981519152602052604090206001015490565b610b0682610adb565b610b0f81611eb1565b610b198383611f1e565b50505050565b6001600160a01b0381163314610b485760405163334bd91960e11b815260040160405180910390fd5b610b528282611fc3565b505050565b60008080856003811115610b6d57610b6d613fd5565b03610b7e5750600190506000610c6a565b6001600160a01b038416610ba55760405163dc2e5e8d60e01b815260040160405180910390fd5b6001856003811115610bb957610bb9613fd5565b03610bf0576001600160a01b03841660009081526001602052604090205463ffffffff168015610bee57600192509050610c6a565b505b6002856003811115610c0457610c04613fd5565b1480610c2157506003856003811115610c1f57610c1f613fd5565b145b15610c63576001600160a01b038416600090815260026020908152604080832086845290915290205463ffffffff168015610c6157600192509050610c6a565b505b5060009050805b935093915050565b6000610c7d81611eb1565b6105dc821115610ca05760405163886349bb60e01b815260040160405180910390fd5b63ffffffff83166000818152600a602052604090819020849055517ff5a91001916153e67eaaa2ae82827a002838792ca48af87df63408cc09cb96f490610cea9085815260200190565b60405180910390a2505050565b610cff61203f565b34600003610d20576040516394fe88d960e01b815260040160405180910390fd5b60008086604051602401610d3691815260200190565b60408051601f198184030181529190526020810180516001600160e01b031660016215566760e11b03191790529050610de3610d6f3390565b888434858b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525061207292505050565b50505050505050565b610df4612223565b610dfd826122c8565b610e0782826122d3565b5050565b6000610e15612390565b506000805160206145b783398151915290565b610e3061203f565b84600003610e51576040516394fe88d960e01b815260040160405180910390fd5b610e666001600160a01b0388163330886123d9565b6000610e756001896000612440565b6040516001600160a01b038a166024820152604481018990526064810188905290915060009060840160408051601f198184030181529190526020810180516001600160e01b031663788c2ecf60e01b1790529050610f48610ed43390565b89848a858b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525061207292505050565b505050505050505050565b6000610f5e81611eb1565b60005b8281101561104b576000848483818110610f7d57610f7d61427b565b9050602002016020810190610f929190613fba565b63ffffffff81166000908152600b6020526040812054919250819003610fb9575050611043565b63ffffffff82166000908152600b60205260408120819055610fda836117e0565b9050610ff5816000015182602001518a85856040015161247a565b8263ffffffff16886001600160a01b03167f6c8628f02ab9884920c84f6f3507810561c8ed6c4b3bae0ce96eceab6def228b8460405161103791815260200190565b60405180910390a35050505b600101610f61565b5050505050565b600061105d81611eb1565b6109d76125f5565b600e54600090611077906001906142a7565b905090565b7fab4f864e5201b0fde9b5ee3e4cf96384802b0ffdfcf7f9de4699ce21a30afc4f6110a681611eb1565b60006110b3600d8561263b565b90506101c2815111156110d957604051635a8a34e560e01b815260040160405180910390fd5b600063f03efa3760e01b85836040516024016110f69291906142ba565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526004546006549192506001600160a01b0390811691635f7b157791349116600085896111513390565b6040518763ffffffff1660e01b8152600401611171959493929190614309565b6000604051808303818588803b15801561118a57600080fd5b505af115801561119e573d6000803e3d6000fd5b5050505050847f71df2a50f3ab1563277a27043770eb570eeaa3fc42ef76c607cdc667a82d03a485836040516111d5929190614352565b60405180910390a25050505050565b60006111ef81611eb1565b600780546001600160a01b03199081166001600160a01b03868116918217909355600880549092169285169283179091556040517ff670cdc1c52016a5cec857c88e8948913b39f86889230c0661b011fd2ed57df590600090a3505050565b60009182526000805160206145d7833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60005b81811015610b525760008383838181106112a5576112a561427b565b9050608002018036038101906112bb919061436b565b905060006112c882612803565b6000818152600960205260408120549192500361130057604051630181cdef60e61b8152600481018290526024015b60405180910390fd5b600061131483602001518460400151612880565b9050600081846040015161132891906142a7565b9050600061133985602001516117e0565b9050600960008581526020019081526020016000206000905561136f81600001518260200151876000015185856040015161247a565b845160405185916001600160a01b0316907f0575467d13f5ab9174f470cec96623374b05cf4b19a3c83a4bfca523e243ab0490600090a382156114225760208086015163ffffffff166000908152600b9091526040812080548592906113d69084906143df565b92505081905550846020015163ffffffff167f34658d4aa4a80fa713a0f3a04329f39177b5bea34e8dcba253600ee5ade6c6548460405161141991815260200190565b60405180910390a25b505060019093019250611289915050565b6000600d600001828154811061144b5761144b61427b565b9060005260206000209060020201600001549050919050565b81611474368390038301836143f2565b6000600d600001838154811061148c5761148c61427b565b60009182526020918290206040805180820190915260029092020180548252600101546001600160a01b03169181019190915290506114c83390565b6001600160a01b031681602001516001600160a01b0316146114fd57604051631165d41f60e31b815260040160405180910390fd5b6000611508836128b5565b82519091508114611539578151604051633df112db60e11b81526004810191909152602481018290526044016112f7565b611541611065565b84116115605760405163d0ebeb4b60e01b815260040160405180910390fd5b600061156d600d88612933565b905060006115846108066080890160608a01613fba565b90506115a78160000151826020015184602001518a60400135856040015161247a565b60405188907f0c1c0787650562778c282502dfd6dcea2fb79d23783920aa18aee36b4aa3dc4890600090a25050505050505050565b600080600d60000188815481106115f5576115f561427b565b60009182526020808320604080518082018252600290940290910180548452600101546001600160a01b0390811684840152815160a08101835290881681529182018b9052810188905263ffffffff89166060820152861515608082015290925061165f906128b5565b82519091508114611675576000925050506116a4565b836001600160a01b031682602001516001600160a01b03161461169d576000925050506116a4565b6001925050505b9695505050505050565b6004546001600160a01b03163381146116da5760405163d8844f1560e01b815260040160405180910390fd5b61174e600080516020614617833981519152826001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa15801561172a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106399190614477565b61176b57604051634261081360e11b815260040160405180910390fd5b61177585856129cf565b61104b8383612aa8565b6040805180820190915260008082526020820152600d8054839081106117a7576117a761427b565b60009182526020918290206040805180820190915260029092020180548252600101546001600160a01b03169181019190915292915050565b604080516060810182526000808252602082018190529181019190915260008263ffffffff16815481106118165761181661427b565b6000918252602090912060408051606081019091526002909202018054829060ff16600381111561184957611849613fd5565b600381111561185a5761185a613fd5565b8152815461010090046001600160a01b0316602082015260019091015460409091015292915050565b61188b61203f565b6001600160a01b0387166323b872dd336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101889052606401600060405180830381600087803b1580156118e957600080fd5b505af11580156118fd573d6000803e3d6000fd5b50505050600061190f60028988612440565b6040516001600160a01b038a166024820152604481018990526064810188905290915060009060840160408051601f198184030181529190526020810180516001600160e01b03166313e803eb60e31b1790529050610f4861196e3390565b89846001858b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525061207292505050565b6119eb61203f565b84600003611a0c576040516394fe88d960e01b815260040160405180910390fd5b60408051602081018252600081529051637921219560e11b81526001600160a01b038a169163f242432a91611a4c91339130918c918c9190600401614494565b600060405180830381600087803b158015611a6657600080fd5b505af1158015611a7a573d6000803e3d6000fd5b505050506000611a8c60038a89612440565b6040516001600160a01b038b166024820152604481018a9052606481018990526084810188905290915060009060a40160408051601f198184030181529190526020810180516001600160e01b03166326fc02dd60e01b1790529050611b66611af23390565b8a848a858b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525061207292505050565b50505050505050505050565b611b7b82610adb565b611b8481611eb1565b610b198383611fc3565b600d54600090611077906001906142a7565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015611be55750825b90506000826001600160401b03166001148015611c015750303b155b905081158015611c0f575080155b15611c2d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315611c5757845460ff60401b1916600160401b1785555b6001600160a01b038d161580611c7457506001600160a01b038c16155b80611c8657506001600160a01b038b16155b80611c9857506001600160a01b038a16155b80611caa57506001600160a01b038916155b80611cbc57506001600160a01b038816155b80611cce57506001600160a01b038716155b15611cec57604051639fabe1c160e01b815260040160405180910390fd5b611cf760008e611f1e565b50611d227fab4f864e5201b0fde9b5ee3e4cf96384802b0ffdfcf7f9de4699ce21a30afc4f89611f1e565b50611d3b6000805160206146178339815191528b611f1e565b50611d546000805160206146178339815191528a611f1e565b50611d5d612b94565b611d65612b94565b611d6e86612b9c565b611d76612bed565b60408051808201909152600080825260208201818152600d8054600180820183559190935292517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5600290930292830155517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb690910180546001600160a01b039283166001600160a01b031991821617909155600e929092556004805483168f83161790556005805483168a831617905560068054909216908d16179055611e4162015180426144d9565b611e4c9060016143df565b611e5990620151806144fb565b6003558315611ea257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050505050565b6109d78133612bfd565b611ec361203f565b6000805160206145f7833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b60006000805160206145d7833981519152611f39848461124e565b611fb9576000848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055611f6f3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506109be565b60009150506109be565b60006000805160206145d7833981519152611fde848461124e565b15611fb9576000848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506109be565b6000805160206145f78339815191525460ff16156120705760405163d93c066560e01b815260040160405180910390fd5b565b61207c8383612c36565b60006120888483612ce4565b9050600061209887600354612db8565b9050808611156120c55760405163539163e160e01b815260048101879052602481018290526044016112f7565b60006121076040518060a001604052808c6001600160a01b031681526020018b81526020018981526020018a63ffffffff1681526020018515158152506128b5565b6000818152600c602052604090205490915060ff161561213d5760405163bff0e9e760e01b8152600481018290526024016112f7565b6000818152600c60205260408120805460ff191660011790556121b7600d838d8254604080518082019091529283526001600160a01b0391821660208085019182526001808401875560009687529520935160028302909401938455519290930180546001600160a01b0319169290911691909117905590565b6040805163ffffffff8c168152602081018b90528615158183015242606082015290519192508b916001600160a01b038e169184917f1061e9784cdd951f4cbc394956165b3a94cf872a3afda95fc76b55cefb35cc519181900360800190a45050505050505050505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806122aa57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661229e6000805160206145b7833981519152546001600160a01b031690565b6001600160a01b031614155b156120705760405163703e46dd60e11b815260040160405180910390fd5b6000610e0781611eb1565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561232d575060408051601f3d908101601f1916820190925261232a91810190614512565b60015b61235557604051634c9c8ce360e01b81526001600160a01b03831660048201526024016112f7565b6000805160206145b7833981519152811461238657604051632a87526960e21b8152600481018290526024016112f7565b610b52838361303b565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146120705760405163703e46dd60e11b815260040160405180910390fd5b6040516001600160a01b038481166024830152838116604483015260648201839052610b199186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613091565b6000806000612450868686610b57565b9150915081156124635791506124739050565b61246e868686613102565b925050505b9392505050565b600085600381111561248e5761248e613fd5565b036124cf576040516001600160a01b0384169083156108fc029084906000818181858888f193505050501580156124c9573d6000803e3d6000fd5b5061104b565b60018560038111156124e3576124e3613fd5565b03612501576124fc6001600160a01b03851684846132c4565b61104b565b600285600381111561251557612515613fd5565b03612587576040516323b872dd60e01b81523060048201526001600160a01b038481166024830152604482018390528516906323b872dd90606401600060405180830381600087803b15801561256a57600080fd5b505af115801561257e573d6000803e3d6000fd5b5050505061104b565b60408051602081018252600081529051637921219560e11b81526001600160a01b0386169163f242432a916125c791309188918791899190600401614494565b600060405180830381600087803b1580156125e157600080fd5b505af1158015610f48573d6000803e3d6000fd5b6125fd6132f5565b6000805160206145f7833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611f00565b60018201548254606091908310158061265357508083105b156126945783548390829061266a906001906142a7565b604051634a0dd9bd60e01b81526004810193909352602483019190915260448201526064016112f7565b6000815b8481116126f85785546000908790839081106126b6576126b661427b565b60009182526020909120600160029092020101546001600160a01b0316146126e657816126e28161452b565b9250505b806126f08161452b565b915050612698565b506000816001600160401b0381111561271357612713613867565b60405190808252806020026020018201604052801561273c578160200160208202803683370190505b5090506000835b8681116127e75787546000908990839081106127615761276161427b565b60009182526020909120600160029092020101546001600160a01b0316146127d5578760000181815481106127985761279861427b565b9060005260206000209060020201600001548383815181106127bc576127bc61427b565b6020908102919091010152816127d18161452b565b9250505b806127df8161452b565b915050612743565b506127f38660016143df565b6001880155509250505092915050565b60008160000151826020015183604001518460600151604051602001612863949392919060609490941b6bffffffffffffffffffffffff1916845260e09290921b6001600160e01b03191660148401526018830152603882015260580190565b604051602081830303815290604052805190602001209050919050565b63ffffffff82166000908152600a60205260408120546127106128a382856144fb565b6128ad91906144d9565b949350505050565b6000816000015182602001518360400151846060015185608001516128db5760006128de565b60015b60405160609590951b6bffffffffffffffffffffffff191660208601526034850193909352605484019190915260e090811b6001600160e01b03191660748401521b60ff60e01b166078820152607c01612863565b604080518082019091526000808252602082015282600001828154811061295c5761295c61427b565b60009182526020918290206040805180820190915260029092020180548252600101546001600160a01b03169181019190915283549091508390839081106129a6576129a661427b565b60009182526020822060029091020190815560010180546001600160a01b031916905592915050565b60005b81811015612a1257612a0a8383838181106129ef576129ef61427b565b905060800201803603810190612a05919061436b565b613325565b6001016129d2565b508015610e075760055460405163f099f9f560e01b81527ff00e60aabbc167f41684e8d81677229edbc0f1876ae2c1ded0a60367465292ab6004820152326024820152604481018390526001600160a01b039091169063f099f9f5906064015b600060405180830381600087803b158015612a8c57600080fd5b505af1158015612aa0573d6000803e3d6000fd5b505050505050565b60005b81811015612b30574260096000858585818110612aca57612aca61427b565b90506020020135815260200190815260200160002081905550828282818110612af557612af561427b565b905060200201357fd63a18c6858559d79659151118b33c6ad7cf4f7735b64fe9dbd85c509e11a11760405160405180910390a2600101612aab565b508015610e075760055460405163f099f9f560e01b81527f25146e2fbfab3f988e64e94788d256b87c4fa8691f43ec409c49b57436cb7ee66004820152326024820152604481018390526001600160a01b039091169063f099f9f590606401612a72565b6120706135b1565b612ba46135b1565b612bb16000806000613102565b5060005b8151811015610e0757612be46001838381518110612bd557612bd561427b565b60200260200101516000613102565b50600101612bb5565b612bf56135b1565b6120706135fa565b612c07828261124e565b610e075760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016112f7565b6007546001600160a01b031680612c4c57505050565b60405163901afa5f60e01b81526000906001600160a01b0383169063901afa5f90612c81903390349089908990600401614544565b6020604051808303816000875af1158015612ca0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc4919061457d565b905080610b1957604051631195542160e11b815260040160405180910390fd5b6008546000906001600160a01b031680612d025760019150506109be565b8251600003612d155760009150506109be565b60405163901afa5f60e01b81526000906001600160a01b0383169063901afa5f90612d4a90339034908a908a90600401614544565b6020604051808303816000875af1158015612d69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d8d919061457d565b905080612dad57604051630a3a260560e01b815260040160405180910390fd5b506001949350505050565b600063ffffffff831615801590612dd6575063ffffffff8316600214155b8015612de9575063ffffffff8316600314155b15612df757506000196109be565b81421015612e405763ffffffff8316612e1a575068056bc75e2d631000006109be565b60011963ffffffff841601612e345750631dcd65006109be565b5064746a5288006109be565b600062015180612e5084426142a7565b612e5a91906144d9565b905060006102d88210612e6f57506004612ea5565b6102228210612e8057506003612ea5565b61016c8210612e9157506002612ea5565b60b68210612ea157506001612ea5565b5060005b63ffffffff8516612f3d578060ff16600003612ece5768056bc75e2d63100000925050506109be565b8060ff16600103612eec57681b1ae4d6e2ef500000925050506109be565b8060ff16600203612f0a57683635c9adc5dea00000925050506109be565b8060ff16600303612f295769010f0cf064dd59200000925050506109be565b69021e19e0c9bab2400000925050506109be565b60011963ffffffff861601612fc1578060ff16600003612f6557631dcd6500925050506109be565b8060ff16600103612f7e57633b9aca00925050506109be565b8060ff16600203612f985764012a05f200925050506109be565b8060ff16600303612fb2576402540be400925050506109be565b640ba43b7400925050506109be565b8060ff16600003612fdb5764746a528800925050506109be565b8060ff16600103612ff55764e8d4a51000925050506109be565b8060ff166002036130105765048c27395000925050506109be565b8060ff1660030361302b576509184e72a000925050506109be565b652d79883d2000925050506109be565b6130448261361b565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561308957610b528282613680565b610e076136f6565b600080602060008451602086016000885af1806130b4576040513d6000823e3d81fd5b50506000513d915081156130cc5780600114156130d9565b6001600160a01b0384163b155b15610b1957604051635274afe760e01b81526001600160a01b03851660048201526024016112f7565b60008054604080516060810190915282908087600381111561312657613126613fd5565b81526001600160a01b038716602080830191909152604090910186905282546001818101855560009485529190932082516002909402018054929390929091839160ff19169083600381111561317e5761317e613fd5565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560409091015160019091015560008560038111156131c9576131c9613fd5565b03613212576000805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49805463ffffffff191663ffffffff83161790559050612473565b6001600160a01b0384166132395760405163dc2e5e8d60e01b815260040160405180910390fd5b600185600381111561324d5761324d613fd5565b03613284576001600160a01b0384166000908152600160205260409020805463ffffffff191663ffffffff83161790559050612473565b6001600160a01b0393909316600090815260026020908152604080832094835293905291909120805463ffffffff191663ffffffff841617905550919050565b6040516001600160a01b03838116602483015260448201839052610b5291859182169063a9059cbb9060640161240e565b6000805160206145f78339815191525460ff1661207057604051638dfc202b60e01b815260040160405180910390fd5b600061333482602001516117e0565b9050600061334a83602001518460400151612880565b9050600081846040015161335e91906142a7565b9050600160008451600381111561337757613377613fd5565b036133ac5784516040516000916001600160a01b03169084156108fc0290859084818181858888f1955061342d945050505050565b6001845160038111156133c1576133c1613fd5565b03613429578451604080516001600160a01b0392831660248201526044808201869052825180830390910181526064909101909152602080820180516001600160e01b031663a9059cbb60e01b1790528601519091613421911682613715565b91505061342d565b5060005b80156134f05784516001600160a01b031661344786612803565b6040517f6a65a945f1306f9bb3d4e3ce63aa367de6976a375de002492404554392c2460e90600090a382156124fc5760208086015163ffffffff166000908152600b9091526040812080548592906134a09084906143df565b92505081905550846020015163ffffffff167f34658d4aa4a80fa713a0f3a04329f39177b5bea34e8dcba253600ee5ade6c654846040516134e391815260200190565b60405180910390a261104b565b60006134fb86612803565b600081815260096020526040908190204290555190915081907fedf8120f63daf877f6cb9aa7a3e21724c4532681d4afd77a45561904f1a045999061357690899081516001600160a01b0316815260208083015163ffffffff1690820152604080830151908201526060918201519181019190915260800190565b60405180910390a260405181907fd63a18c6858559d79659151118b33c6ad7cf4f7735b64fe9dbd85c509e11a11790600090a2505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661207057604051631afcd79f60e31b815260040160405180910390fd5b6136026135b1565b6000805160206145f7833981519152805460ff19169055565b806001600160a01b03163b60000361365157604051634c9c8ce360e01b81526001600160a01b03821660048201526024016112f7565b6000805160206145b783398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161369d919061459a565b600060405180830381855af49150503d80600081146136d8576040519150601f19603f3d011682016040523d82523d6000602084013e6136dd565b606091505b50915091506136ed8583836137b8565b95945050505050565b34156120705760405163b398979f60e01b815260040160405180910390fd5b6000806000846001600160a01b031684604051613732919061459a565b6000604051808303816000865af19150503d806000811461376f576040519150601f19603f3d011682016040523d82523d6000602084013e613774565b606091505b509150915081801561379e57508051158061379e57508080602001905181019061379e919061457d565b80156136ed5750505050506001600160a01b03163b151590565b6060826137cd576137c882613814565b612473565b81511580156137e457506001600160a01b0384163b155b1561380d57604051639996b31560e01b81526001600160a01b03851660048201526024016112f7565b5080612473565b8051156138245780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b60006020828403121561384f57600080fd5b81356001600160e01b03198116811461247357600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156138a5576138a5613867565b604052919050565b60006001600160401b038211156138c6576138c6613867565b5060051b60200190565b6000602082840312156138e257600080fd5b81356001600160401b038111156138f857600080fd5b8201601f8101841361390957600080fd5b803561391c613917826138ad565b61387d565b8082825260208201915060208360051b85010192508683111561393e57600080fd5b6020840193505b828410156116a4578335825260209384019390910190613945565b602080825282518282018190526000918401906040840190835b818110156139b6576139a0838551805182526020908101516001600160a01b0316910152565b602093909301926040929092019160010161397a565b509095945050505050565b6000602082840312156139d357600080fd5b5035919050565b6001600160a01b03811681146109d757600080fd5b60008060408385031215613a0257600080fd5b823591506020830135613a14816139da565b809150509250929050565b600080600060608486031215613a3457600080fd5b833560048110613a4357600080fd5b92506020840135613a53816139da565b929592945050506040919091013590565b803563ffffffff81168114613a7857600080fd5b919050565b60008060408385031215613a9057600080fd5b613a9983613a64565b946020939093013593505050565b60008083601f840112613ab957600080fd5b5081356001600160401b03811115613ad057600080fd5b602083019150836020828501011115613ae857600080fd5b9250929050565b600080600080600060608688031215613b0757600080fd5b8535945060208601356001600160401b03811115613b2457600080fd5b613b3088828901613aa7565b90955093505060408601356001600160401b03811115613b4f57600080fd5b613b5b88828901613aa7565b969995985093965092949392505050565b60008060408385031215613b7f57600080fd5b8235613b8a816139da565b915060208301356001600160401b03811115613ba557600080fd5b8301601f81018513613bb657600080fd5b80356001600160401b03811115613bcf57613bcf613867565b613be2601f8201601f191660200161387d565b818152866020838501011115613bf757600080fd5b816020840160208301376000602083830101528093505050509250929050565b600080600080600080600060a0888a031215613c3257600080fd5b8735613c3d816139da565b9650602088013595506040880135945060608801356001600160401b03811115613c6657600080fd5b613c728a828b01613aa7565b90955093505060808801356001600160401b03811115613c9157600080fd5b613c9d8a828b01613aa7565b989b979a50959850939692959293505050565b60008083601f840112613cc257600080fd5b5081356001600160401b03811115613cd957600080fd5b6020830191508360208260051b8501011115613ae857600080fd5b600080600060408486031215613d0957600080fd5b8335613d14816139da565b925060208401356001600160401b03811115613d2f57600080fd5b613d3b86828701613cb0565b9497909650939450505050565b60008060408385031215613d5b57600080fd5b50508035926020909101359150565b60008060408385031215613d7d57600080fd5b8235613d88816139da565b91506020830135613a14816139da565b60008083601f840112613daa57600080fd5b5081356001600160401b03811115613dc157600080fd5b6020830191508360208260071b8501011115613ae857600080fd5b60008060208385031215613def57600080fd5b82356001600160401b03811115613e0557600080fd5b613e1185828601613d98565b90969095509350505050565b60008082840360c0811215613e3157600080fd5b8335925060a0601f1982011215613e4757600080fd5b506020830190509250929050565b80151581146109d757600080fd5b60008060008060008060c08789031215613e7c57600080fd5b8635955060208701359450613e9360408801613a64565b9350606087013592506080870135613eaa81613e55565b915060a0870135613eba816139da565b809150509295509295509295565b60008060008060408587031215613ede57600080fd5b84356001600160401b03811115613ef457600080fd5b613f0087828801613d98565b90955093505060208501356001600160401b03811115613f1f57600080fd5b613f2b87828801613cb0565b95989497509550505050565b60005b83811015613f52578181015183820152602001613f3a565b50506000910152565b60008151808452613f73816020860160208601613f37565b601f01601f19169290920160200192915050565b6020815260006124736020830184613f5b565b815181526020808301516001600160a01b031690820152604081016109be565b600060208284031215613fcc57600080fd5b61247382613a64565b634e487b7160e01b600052602160045260246000fd5b815160608201906004811061401057634e487b7160e01b600052602160045260246000fd5b82526020838101516001600160a01b031690830152604092830151929091019190915290565b60008060008060008060008060c0898b03121561405257600080fd5b883561405d816139da565b975060208901359650604089013595506060890135945060808901356001600160401b0381111561408d57600080fd5b6140998b828c01613aa7565b90955093505060a08901356001600160401b038111156140b857600080fd5b6140c48b828c01613aa7565b999c989b5096995094979396929594505050565b600080600080600080600080610100898b0312156140f557600080fd5b8835614100816139da565b97506020890135614110816139da565b96506040890135614120816139da565b95506060890135614130816139da565b94506080890135614140816139da565b935060a0890135614150816139da565b925060c0890135614160816139da565b915060e08901356001600160401b0381111561417b57600080fd5b89016000601f82018c1361418e57600080fd5b813561419c613917826138ad565b8082825260208201915060208360051b86010192508e8311156141be57600080fd5b6020850194505b828510156141e95784356141d8816139da565b8252602094850194909101906141c5565b9b9e9a9d50989b5096999598949750929550505050565b60008060008060008060a0878903121561421957600080fd5b8635614224816139da565b95506020870135614234816139da565b9450604087013593506060870135925060808701356001600160401b0381111561425d57600080fd5b61426989828a01613aa7565b979a9699509497509295939492505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b818103818111156109be576109be614291565b6000604082018483526040602084015280845180835260608501915060208601925060005b818110156142fd5783518352602093840193909201916001016142df565b50909695505050505050565b60018060a01b038616815284602082015260a06040820152600061433060a0830186613f5b565b6060830194909452506001600160a01b03919091166080909101529392505050565b8281526040602082015260006128ad6040830184613f5b565b6000608082840312801561437e57600080fd5b50604051608081016001600160401b03811182821017156143a1576143a1613867565b60405282356143af816139da565b81526143bd60208401613a64565b6020820152604083810135908201526060928301359281019290925250919050565b808201808211156109be576109be614291565b600060a082840312801561440557600080fd5b5060405160a081016001600160401b038111828210171561442857614428613867565b6040528235614436816139da565b8152602083810135908201526040808401359082015261445860608401613a64565b6060820152608083013561446b81613e55565b60808201529392505050565b60006020828403121561448957600080fd5b8151612473816139da565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906144ce90830184613f5b565b979650505050505050565b6000826144f657634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176109be576109be614291565b60006020828403121561452457600080fd5b5051919050565b60006001820161453d5761453d614291565b5060010190565b60018060a01b038516815283602082015260806040820152600061456b6080830185613f5b565b82810360608401526144ce8185613f5b565b60006020828403121561458f57600080fd5b815161247381613e55565b600082516145ac818460208701613f37565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300738128fe393bef1bcd8a524796fff40618b938cd467c71fcf37850ab0ba4f7d7a26469706673582212209e41d31aae1401a4ca127ed0e5f968c69fdae1a0b858e7d907b3518c68fa29b364736f6c634300081b0033",
  "deployedBytecode": "0x6080604052600436106102c95760003560e01c806391d1485411610175578063cb23bcb5116100dc578063dd9ea29911610095578063ea4644bb1161006f578063ea4644bb146108fb578063ecda10f51461091b578063f23a6e6114610931578063f6a552d41461097757600080fd5b8063dd9ea299146108a5578063e1cb0e52146108ba578063e579fa2b146108ce57600080fd5b8063cb23bcb5146107cb578063cbd90cd0146107eb578063cd6a976e14610818578063d395c01714610838578063d438c34914610865578063d547741f1461088557600080fd5b80639d6a54cb1161012e5780639d6a54cb146106de578063a217fddf146106fe578063a98f704414610713578063ad3cb1cc14610733578063c13819b614610771578063c60af2b51461079e57600080fd5b806391d148541461061e57806391f69b7d1461063e578063978069b41461065e578063986be0e21461067e5780639c79a31c1461069e5780639d07861c146106be57600080fd5b80634f1ef286116102345780635c975abb116101ed57806367517837116101c757806367517837146105b657806376918c0d146105cb57806385979730146105de578063902eeef3146105fe57600080fd5b80635c975abb1461054c5780635edeb2a31461057157806363d8882a146105a157600080fd5b80634f1ef2861461049657806350520b1f146104a957806352d1902d146104e157806354adcb99146104f65780635521f77e1461050c57806358dec40a1461052c57600080fd5b80632f2ff15d116102865780632f2ff15d146103c557806336568abe146103e5578063381175f6146104055780633cd07066146104415780633de40cfa14610461578063433f6c121461047457600080fd5b806301ffc9a7146102ce5780630219198014610303578063219cd2631461031a578063232c1c8a146103365780632483e71514610363578063248a9ca3146103a5575b600080fd5b3480156102da57600080fd5b506102ee6102e936600461383d565b61098d565b60405190151581526020015b60405180910390f35b34801561030f57600080fd5b506103186109c4565b005b34801561032657600080fd5b50604051600081526020016102fa565b34801561034257600080fd5b506103566103513660046138d0565b6109da565b6040516102fa9190613960565b34801561036f57600080fd5b506103977fab4f864e5201b0fde9b5ee3e4cf96384802b0ffdfcf7f9de4699ce21a30afc4f81565b6040519081526020016102fa565b3480156103b157600080fd5b506103976103c03660046139c1565b610adb565b3480156103d157600080fd5b506103186103e03660046139ef565b610afd565b3480156103f157600080fd5b506103186104003660046139ef565b610b1f565b34801561041157600080fd5b50610425610420366004613a1f565b610b57565b60408051921515835263ffffffff9091166020830152016102fa565b34801561044d57600080fd5b5061031861045c366004613a7d565b610c72565b61031861046f366004613aef565b610cf7565b34801561048057600080fd5b5061039760008051602061461783398151915281565b6103186104a4366004613b6c565b610dec565b3480156104b557600080fd5b506005546104c9906001600160a01b031681565b6040516001600160a01b0390911681526020016102fa565b3480156104ed57600080fd5b50610397610e0b565b34801561050257600080fd5b506103976101c281565b34801561051857600080fd5b50610318610527366004613c17565b610e28565b34801561053857600080fd5b50610318610547366004613cf4565b610f53565b34801561055857600080fd5b506000805160206145f78339815191525460ff166102ee565b34801561057d57600080fd5b506102ee61058c3660046139c1565b600c6020526000908152604090205460ff1681565b3480156105ad57600080fd5b50610318611052565b3480156105c257600080fd5b50610397611065565b6103186105d9366004613d48565b61107c565b3480156105ea57600080fd5b506008546104c9906001600160a01b031681565b34801561060a57600080fd5b50610318610619366004613d6a565b6111e4565b34801561062a57600080fd5b506102ee6106393660046139ef565b61124e565b34801561064a57600080fd5b50610318610659366004613ddc565b611286565b34801561066a57600080fd5b506007546104c9906001600160a01b031681565b34801561068a57600080fd5b506103976106993660046139c1565b611433565b3480156106aa57600080fd5b506103186106b9366004613e1d565b611464565b3480156106ca57600080fd5b506102ee6106d9366004613e63565b6115dc565b3480156106ea57600080fd5b506103186106f9366004613ec8565b6116ae565b34801561070a57600080fd5b50610397600081565b34801561071f57600080fd5b506004546104c9906001600160a01b031681565b34801561073f57600080fd5b50610764604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516102fa9190613f87565b34801561077d57600080fd5b5061079161078c3660046139c1565b61177f565b6040516102fa9190613f9a565b3480156107aa57600080fd5b506103976107b9366004613fba565b600b6020526000908152604090205481565b3480156107d757600080fd5b506006546104c9906001600160a01b031681565b3480156107f757600080fd5b5061080b610806366004613fba565b6117e0565b6040516102fa9190613feb565b34801561082457600080fd5b50610318610833366004613c17565b611883565b34801561084457600080fd5b50610397610853366004613fba565b600a6020526000908152604090205481565b34801561087157600080fd5b50610318610880366004614036565b6119e3565b34801561089157600080fd5b506103186108a03660046139ef565b611b72565b3480156108b157600080fd5b50610397611b8e565b3480156108c657600080fd5b506007610397565b3480156108da57600080fd5b506103976108e93660046139c1565b60096020526000908152604090205481565b34801561090757600080fd5b506103186109163660046140d8565b611ba0565b34801561092757600080fd5b5061039760035481565b34801561093d57600080fd5b5061095e61094c366004614200565b63f23a6e6160e01b9695505050505050565b6040516001600160e01b031990911681526020016102fa565b34801561098357600080fd5b506103976105dc81565b60006001600160e01b03198216637965db0b60e01b14806109be57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60006109cf81611eb1565b6109d7611ebb565b50565b6060600082516001600160401b038111156109f7576109f7613867565b604051908082528060200260200182016040528015610a3c57816020015b6040805180820190915260008082526020820152815260200190600190039081610a155790505b50905060005b8351811015610ad457600d600001848281518110610a6257610a6261427b565b602002602001015181548110610a7a57610a7a61427b565b60009182526020918290206040805180820190915260029092020180548252600101546001600160a01b0316918101919091528251839083908110610ac157610ac161427b565b6020908102919091010152600101610a42565b5092915050565b60009081526000805160206145d7833981519152602052604090206001015490565b610b0682610adb565b610b0f81611eb1565b610b198383611f1e565b50505050565b6001600160a01b0381163314610b485760405163334bd91960e11b815260040160405180910390fd5b610b528282611fc3565b505050565b60008080856003811115610b6d57610b6d613fd5565b03610b7e5750600190506000610c6a565b6001600160a01b038416610ba55760405163dc2e5e8d60e01b815260040160405180910390fd5b6001856003811115610bb957610bb9613fd5565b03610bf0576001600160a01b03841660009081526001602052604090205463ffffffff168015610bee57600192509050610c6a565b505b6002856003811115610c0457610c04613fd5565b1480610c2157506003856003811115610c1f57610c1f613fd5565b145b15610c63576001600160a01b038416600090815260026020908152604080832086845290915290205463ffffffff168015610c6157600192509050610c6a565b505b5060009050805b935093915050565b6000610c7d81611eb1565b6105dc821115610ca05760405163886349bb60e01b815260040160405180910390fd5b63ffffffff83166000818152600a602052604090819020849055517ff5a91001916153e67eaaa2ae82827a002838792ca48af87df63408cc09cb96f490610cea9085815260200190565b60405180910390a2505050565b610cff61203f565b34600003610d20576040516394fe88d960e01b815260040160405180910390fd5b60008086604051602401610d3691815260200190565b60408051601f198184030181529190526020810180516001600160e01b031660016215566760e11b03191790529050610de3610d6f3390565b888434858b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525061207292505050565b50505050505050565b610df4612223565b610dfd826122c8565b610e0782826122d3565b5050565b6000610e15612390565b506000805160206145b783398151915290565b610e3061203f565b84600003610e51576040516394fe88d960e01b815260040160405180910390fd5b610e666001600160a01b0388163330886123d9565b6000610e756001896000612440565b6040516001600160a01b038a166024820152604481018990526064810188905290915060009060840160408051601f198184030181529190526020810180516001600160e01b031663788c2ecf60e01b1790529050610f48610ed43390565b89848a858b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525061207292505050565b505050505050505050565b6000610f5e81611eb1565b60005b8281101561104b576000848483818110610f7d57610f7d61427b565b9050602002016020810190610f929190613fba565b63ffffffff81166000908152600b6020526040812054919250819003610fb9575050611043565b63ffffffff82166000908152600b60205260408120819055610fda836117e0565b9050610ff5816000015182602001518a85856040015161247a565b8263ffffffff16886001600160a01b03167f6c8628f02ab9884920c84f6f3507810561c8ed6c4b3bae0ce96eceab6def228b8460405161103791815260200190565b60405180910390a35050505b600101610f61565b5050505050565b600061105d81611eb1565b6109d76125f5565b600e54600090611077906001906142a7565b905090565b7fab4f864e5201b0fde9b5ee3e4cf96384802b0ffdfcf7f9de4699ce21a30afc4f6110a681611eb1565b60006110b3600d8561263b565b90506101c2815111156110d957604051635a8a34e560e01b815260040160405180910390fd5b600063f03efa3760e01b85836040516024016110f69291906142ba565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526004546006549192506001600160a01b0390811691635f7b157791349116600085896111513390565b6040518763ffffffff1660e01b8152600401611171959493929190614309565b6000604051808303818588803b15801561118a57600080fd5b505af115801561119e573d6000803e3d6000fd5b5050505050847f71df2a50f3ab1563277a27043770eb570eeaa3fc42ef76c607cdc667a82d03a485836040516111d5929190614352565b60405180910390a25050505050565b60006111ef81611eb1565b600780546001600160a01b03199081166001600160a01b03868116918217909355600880549092169285169283179091556040517ff670cdc1c52016a5cec857c88e8948913b39f86889230c0661b011fd2ed57df590600090a3505050565b60009182526000805160206145d7833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60005b81811015610b525760008383838181106112a5576112a561427b565b9050608002018036038101906112bb919061436b565b905060006112c882612803565b6000818152600960205260408120549192500361130057604051630181cdef60e61b8152600481018290526024015b60405180910390fd5b600061131483602001518460400151612880565b9050600081846040015161132891906142a7565b9050600061133985602001516117e0565b9050600960008581526020019081526020016000206000905561136f81600001518260200151876000015185856040015161247a565b845160405185916001600160a01b0316907f0575467d13f5ab9174f470cec96623374b05cf4b19a3c83a4bfca523e243ab0490600090a382156114225760208086015163ffffffff166000908152600b9091526040812080548592906113d69084906143df565b92505081905550846020015163ffffffff167f34658d4aa4a80fa713a0f3a04329f39177b5bea34e8dcba253600ee5ade6c6548460405161141991815260200190565b60405180910390a25b505060019093019250611289915050565b6000600d600001828154811061144b5761144b61427b565b9060005260206000209060020201600001549050919050565b81611474368390038301836143f2565b6000600d600001838154811061148c5761148c61427b565b60009182526020918290206040805180820190915260029092020180548252600101546001600160a01b03169181019190915290506114c83390565b6001600160a01b031681602001516001600160a01b0316146114fd57604051631165d41f60e31b815260040160405180910390fd5b6000611508836128b5565b82519091508114611539578151604051633df112db60e11b81526004810191909152602481018290526044016112f7565b611541611065565b84116115605760405163d0ebeb4b60e01b815260040160405180910390fd5b600061156d600d88612933565b905060006115846108066080890160608a01613fba565b90506115a78160000151826020015184602001518a60400135856040015161247a565b60405188907f0c1c0787650562778c282502dfd6dcea2fb79d23783920aa18aee36b4aa3dc4890600090a25050505050505050565b600080600d60000188815481106115f5576115f561427b565b60009182526020808320604080518082018252600290940290910180548452600101546001600160a01b0390811684840152815160a08101835290881681529182018b9052810188905263ffffffff89166060820152861515608082015290925061165f906128b5565b82519091508114611675576000925050506116a4565b836001600160a01b031682602001516001600160a01b03161461169d576000925050506116a4565b6001925050505b9695505050505050565b6004546001600160a01b03163381146116da5760405163d8844f1560e01b815260040160405180910390fd5b61174e600080516020614617833981519152826001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa15801561172a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106399190614477565b61176b57604051634261081360e11b815260040160405180910390fd5b61177585856129cf565b61104b8383612aa8565b6040805180820190915260008082526020820152600d8054839081106117a7576117a761427b565b60009182526020918290206040805180820190915260029092020180548252600101546001600160a01b03169181019190915292915050565b604080516060810182526000808252602082018190529181019190915260008263ffffffff16815481106118165761181661427b565b6000918252602090912060408051606081019091526002909202018054829060ff16600381111561184957611849613fd5565b600381111561185a5761185a613fd5565b8152815461010090046001600160a01b0316602082015260019091015460409091015292915050565b61188b61203f565b6001600160a01b0387166323b872dd336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260448101889052606401600060405180830381600087803b1580156118e957600080fd5b505af11580156118fd573d6000803e3d6000fd5b50505050600061190f60028988612440565b6040516001600160a01b038a166024820152604481018990526064810188905290915060009060840160408051601f198184030181529190526020810180516001600160e01b03166313e803eb60e31b1790529050610f4861196e3390565b89846001858b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525061207292505050565b6119eb61203f565b84600003611a0c576040516394fe88d960e01b815260040160405180910390fd5b60408051602081018252600081529051637921219560e11b81526001600160a01b038a169163f242432a91611a4c91339130918c918c9190600401614494565b600060405180830381600087803b158015611a6657600080fd5b505af1158015611a7a573d6000803e3d6000fd5b505050506000611a8c60038a89612440565b6040516001600160a01b038b166024820152604481018a9052606481018990526084810188905290915060009060a40160408051601f198184030181529190526020810180516001600160e01b03166326fc02dd60e01b1790529050611b66611af23390565b8a848a858b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8f018190048102820181019092528d815292508d91508c908190840183828082843760009201919091525061207292505050565b50505050505050505050565b611b7b82610adb565b611b8481611eb1565b610b198383611fc3565b600d54600090611077906001906142a7565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b0316600081158015611be55750825b90506000826001600160401b03166001148015611c015750303b155b905081158015611c0f575080155b15611c2d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315611c5757845460ff60401b1916600160401b1785555b6001600160a01b038d161580611c7457506001600160a01b038c16155b80611c8657506001600160a01b038b16155b80611c9857506001600160a01b038a16155b80611caa57506001600160a01b038916155b80611cbc57506001600160a01b038816155b80611cce57506001600160a01b038716155b15611cec57604051639fabe1c160e01b815260040160405180910390fd5b611cf760008e611f1e565b50611d227fab4f864e5201b0fde9b5ee3e4cf96384802b0ffdfcf7f9de4699ce21a30afc4f89611f1e565b50611d3b6000805160206146178339815191528b611f1e565b50611d546000805160206146178339815191528a611f1e565b50611d5d612b94565b611d65612b94565b611d6e86612b9c565b611d76612bed565b60408051808201909152600080825260208201818152600d8054600180820183559190935292517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5600290930292830155517fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb690910180546001600160a01b039283166001600160a01b031991821617909155600e929092556004805483168f83161790556005805483168a831617905560068054909216908d16179055611e4162015180426144d9565b611e4c9060016143df565b611e5990620151806144fb565b6003558315611ea257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050505050565b6109d78133612bfd565b611ec361203f565b6000805160206145f7833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b60006000805160206145d7833981519152611f39848461124e565b611fb9576000848152602082815260408083206001600160a01b03871684529091529020805460ff19166001179055611f6f3390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019150506109be565b60009150506109be565b60006000805160206145d7833981519152611fde848461124e565b15611fb9576000848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a460019150506109be565b6000805160206145f78339815191525460ff16156120705760405163d93c066560e01b815260040160405180910390fd5b565b61207c8383612c36565b60006120888483612ce4565b9050600061209887600354612db8565b9050808611156120c55760405163539163e160e01b815260048101879052602481018290526044016112f7565b60006121076040518060a001604052808c6001600160a01b031681526020018b81526020018981526020018a63ffffffff1681526020018515158152506128b5565b6000818152600c602052604090205490915060ff161561213d5760405163bff0e9e760e01b8152600481018290526024016112f7565b6000818152600c60205260408120805460ff191660011790556121b7600d838d8254604080518082019091529283526001600160a01b0391821660208085019182526001808401875560009687529520935160028302909401938455519290930180546001600160a01b0319169290911691909117905590565b6040805163ffffffff8c168152602081018b90528615158183015242606082015290519192508b916001600160a01b038e169184917f1061e9784cdd951f4cbc394956165b3a94cf872a3afda95fc76b55cefb35cc519181900360800190a45050505050505050505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806122aa57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661229e6000805160206145b7833981519152546001600160a01b031690565b6001600160a01b031614155b156120705760405163703e46dd60e11b815260040160405180910390fd5b6000610e0781611eb1565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561232d575060408051601f3d908101601f1916820190925261232a91810190614512565b60015b61235557604051634c9c8ce360e01b81526001600160a01b03831660048201526024016112f7565b6000805160206145b7833981519152811461238657604051632a87526960e21b8152600481018290526024016112f7565b610b52838361303b565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146120705760405163703e46dd60e11b815260040160405180910390fd5b6040516001600160a01b038481166024830152838116604483015260648201839052610b199186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613091565b6000806000612450868686610b57565b9150915081156124635791506124739050565b61246e868686613102565b925050505b9392505050565b600085600381111561248e5761248e613fd5565b036124cf576040516001600160a01b0384169083156108fc029084906000818181858888f193505050501580156124c9573d6000803e3d6000fd5b5061104b565b60018560038111156124e3576124e3613fd5565b03612501576124fc6001600160a01b03851684846132c4565b61104b565b600285600381111561251557612515613fd5565b03612587576040516323b872dd60e01b81523060048201526001600160a01b038481166024830152604482018390528516906323b872dd90606401600060405180830381600087803b15801561256a57600080fd5b505af115801561257e573d6000803e3d6000fd5b5050505061104b565b60408051602081018252600081529051637921219560e11b81526001600160a01b0386169163f242432a916125c791309188918791899190600401614494565b600060405180830381600087803b1580156125e157600080fd5b505af1158015610f48573d6000803e3d6000fd5b6125fd6132f5565b6000805160206145f7833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611f00565b60018201548254606091908310158061265357508083105b156126945783548390829061266a906001906142a7565b604051634a0dd9bd60e01b81526004810193909352602483019190915260448201526064016112f7565b6000815b8481116126f85785546000908790839081106126b6576126b661427b565b60009182526020909120600160029092020101546001600160a01b0316146126e657816126e28161452b565b9250505b806126f08161452b565b915050612698565b506000816001600160401b0381111561271357612713613867565b60405190808252806020026020018201604052801561273c578160200160208202803683370190505b5090506000835b8681116127e75787546000908990839081106127615761276161427b565b60009182526020909120600160029092020101546001600160a01b0316146127d5578760000181815481106127985761279861427b565b9060005260206000209060020201600001548383815181106127bc576127bc61427b565b6020908102919091010152816127d18161452b565b9250505b806127df8161452b565b915050612743565b506127f38660016143df565b6001880155509250505092915050565b60008160000151826020015183604001518460600151604051602001612863949392919060609490941b6bffffffffffffffffffffffff1916845260e09290921b6001600160e01b03191660148401526018830152603882015260580190565b604051602081830303815290604052805190602001209050919050565b63ffffffff82166000908152600a60205260408120546127106128a382856144fb565b6128ad91906144d9565b949350505050565b6000816000015182602001518360400151846060015185608001516128db5760006128de565b60015b60405160609590951b6bffffffffffffffffffffffff191660208601526034850193909352605484019190915260e090811b6001600160e01b03191660748401521b60ff60e01b166078820152607c01612863565b604080518082019091526000808252602082015282600001828154811061295c5761295c61427b565b60009182526020918290206040805180820190915260029092020180548252600101546001600160a01b03169181019190915283549091508390839081106129a6576129a661427b565b60009182526020822060029091020190815560010180546001600160a01b031916905592915050565b60005b81811015612a1257612a0a8383838181106129ef576129ef61427b565b905060800201803603810190612a05919061436b565b613325565b6001016129d2565b508015610e075760055460405163f099f9f560e01b81527ff00e60aabbc167f41684e8d81677229edbc0f1876ae2c1ded0a60367465292ab6004820152326024820152604481018390526001600160a01b039091169063f099f9f5906064015b600060405180830381600087803b158015612a8c57600080fd5b505af1158015612aa0573d6000803e3d6000fd5b505050505050565b60005b81811015612b30574260096000858585818110612aca57612aca61427b565b90506020020135815260200190815260200160002081905550828282818110612af557612af561427b565b905060200201357fd63a18c6858559d79659151118b33c6ad7cf4f7735b64fe9dbd85c509e11a11760405160405180910390a2600101612aab565b508015610e075760055460405163f099f9f560e01b81527f25146e2fbfab3f988e64e94788d256b87c4fa8691f43ec409c49b57436cb7ee66004820152326024820152604481018390526001600160a01b039091169063f099f9f590606401612a72565b6120706135b1565b612ba46135b1565b612bb16000806000613102565b5060005b8151811015610e0757612be46001838381518110612bd557612bd561427b565b60200260200101516000613102565b50600101612bb5565b612bf56135b1565b6120706135fa565b612c07828261124e565b610e075760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016112f7565b6007546001600160a01b031680612c4c57505050565b60405163901afa5f60e01b81526000906001600160a01b0383169063901afa5f90612c81903390349089908990600401614544565b6020604051808303816000875af1158015612ca0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cc4919061457d565b905080610b1957604051631195542160e11b815260040160405180910390fd5b6008546000906001600160a01b031680612d025760019150506109be565b8251600003612d155760009150506109be565b60405163901afa5f60e01b81526000906001600160a01b0383169063901afa5f90612d4a90339034908a908a90600401614544565b6020604051808303816000875af1158015612d69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d8d919061457d565b905080612dad57604051630a3a260560e01b815260040160405180910390fd5b506001949350505050565b600063ffffffff831615801590612dd6575063ffffffff8316600214155b8015612de9575063ffffffff8316600314155b15612df757506000196109be565b81421015612e405763ffffffff8316612e1a575068056bc75e2d631000006109be565b60011963ffffffff841601612e345750631dcd65006109be565b5064746a5288006109be565b600062015180612e5084426142a7565b612e5a91906144d9565b905060006102d88210612e6f57506004612ea5565b6102228210612e8057506003612ea5565b61016c8210612e9157506002612ea5565b60b68210612ea157506001612ea5565b5060005b63ffffffff8516612f3d578060ff16600003612ece5768056bc75e2d63100000925050506109be565b8060ff16600103612eec57681b1ae4d6e2ef500000925050506109be565b8060ff16600203612f0a57683635c9adc5dea00000925050506109be565b8060ff16600303612f295769010f0cf064dd59200000925050506109be565b69021e19e0c9bab2400000925050506109be565b60011963ffffffff861601612fc1578060ff16600003612f6557631dcd6500925050506109be565b8060ff16600103612f7e57633b9aca00925050506109be565b8060ff16600203612f985764012a05f200925050506109be565b8060ff16600303612fb2576402540be400925050506109be565b640ba43b7400925050506109be565b8060ff16600003612fdb5764746a528800925050506109be565b8060ff16600103612ff55764e8d4a51000925050506109be565b8060ff166002036130105765048c27395000925050506109be565b8060ff1660030361302b576509184e72a000925050506109be565b652d79883d2000925050506109be565b6130448261361b565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561308957610b528282613680565b610e076136f6565b600080602060008451602086016000885af1806130b4576040513d6000823e3d81fd5b50506000513d915081156130cc5780600114156130d9565b6001600160a01b0384163b155b15610b1957604051635274afe760e01b81526001600160a01b03851660048201526024016112f7565b60008054604080516060810190915282908087600381111561312657613126613fd5565b81526001600160a01b038716602080830191909152604090910186905282546001818101855560009485529190932082516002909402018054929390929091839160ff19169083600381111561317e5761317e613fd5565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560409091015160019091015560008560038111156131c9576131c9613fd5565b03613212576000805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49805463ffffffff191663ffffffff83161790559050612473565b6001600160a01b0384166132395760405163dc2e5e8d60e01b815260040160405180910390fd5b600185600381111561324d5761324d613fd5565b03613284576001600160a01b0384166000908152600160205260409020805463ffffffff191663ffffffff83161790559050612473565b6001600160a01b0393909316600090815260026020908152604080832094835293905291909120805463ffffffff191663ffffffff841617905550919050565b6040516001600160a01b03838116602483015260448201839052610b5291859182169063a9059cbb9060640161240e565b6000805160206145f78339815191525460ff1661207057604051638dfc202b60e01b815260040160405180910390fd5b600061333482602001516117e0565b9050600061334a83602001518460400151612880565b9050600081846040015161335e91906142a7565b9050600160008451600381111561337757613377613fd5565b036133ac5784516040516000916001600160a01b03169084156108fc0290859084818181858888f1955061342d945050505050565b6001845160038111156133c1576133c1613fd5565b03613429578451604080516001600160a01b0392831660248201526044808201869052825180830390910181526064909101909152602080820180516001600160e01b031663a9059cbb60e01b1790528601519091613421911682613715565b91505061342d565b5060005b80156134f05784516001600160a01b031661344786612803565b6040517f6a65a945f1306f9bb3d4e3ce63aa367de6976a375de002492404554392c2460e90600090a382156124fc5760208086015163ffffffff166000908152600b9091526040812080548592906134a09084906143df565b92505081905550846020015163ffffffff167f34658d4aa4a80fa713a0f3a04329f39177b5bea34e8dcba253600ee5ade6c654846040516134e391815260200190565b60405180910390a261104b565b60006134fb86612803565b600081815260096020526040908190204290555190915081907fedf8120f63daf877f6cb9aa7a3e21724c4532681d4afd77a45561904f1a045999061357690899081516001600160a01b0316815260208083015163ffffffff1690820152604080830151908201526060918201519181019190915260800190565b60405180910390a260405181907fd63a18c6858559d79659151118b33c6ad7cf4f7735b64fe9dbd85c509e11a11790600090a2505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661207057604051631afcd79f60e31b815260040160405180910390fd5b6136026135b1565b6000805160206145f7833981519152805460ff19169055565b806001600160a01b03163b60000361365157604051634c9c8ce360e01b81526001600160a01b03821660048201526024016112f7565b6000805160206145b783398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b03168460405161369d919061459a565b600060405180830381855af49150503d80600081146136d8576040519150601f19603f3d011682016040523d82523d6000602084013e6136dd565b606091505b50915091506136ed8583836137b8565b95945050505050565b34156120705760405163b398979f60e01b815260040160405180910390fd5b6000806000846001600160a01b031684604051613732919061459a565b6000604051808303816000865af19150503d806000811461376f576040519150601f19603f3d011682016040523d82523d6000602084013e613774565b606091505b509150915081801561379e57508051158061379e57508080602001905181019061379e919061457d565b80156136ed5750505050506001600160a01b03163b151590565b6060826137cd576137c882613814565b612473565b81511580156137e457506001600160a01b0384163b155b1561380d57604051639996b31560e01b81526001600160a01b03851660048201526024016112f7565b5080612473565b8051156138245780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b60006020828403121561384f57600080fd5b81356001600160e01b03198116811461247357600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156138a5576138a5613867565b604052919050565b60006001600160401b038211156138c6576138c6613867565b5060051b60200190565b6000602082840312156138e257600080fd5b81356001600160401b038111156138f857600080fd5b8201601f8101841361390957600080fd5b803561391c613917826138ad565b61387d565b8082825260208201915060208360051b85010192508683111561393e57600080fd5b6020840193505b828410156116a4578335825260209384019390910190613945565b602080825282518282018190526000918401906040840190835b818110156139b6576139a0838551805182526020908101516001600160a01b0316910152565b602093909301926040929092019160010161397a565b509095945050505050565b6000602082840312156139d357600080fd5b5035919050565b6001600160a01b03811681146109d757600080fd5b60008060408385031215613a0257600080fd5b823591506020830135613a14816139da565b809150509250929050565b600080600060608486031215613a3457600080fd5b833560048110613a4357600080fd5b92506020840135613a53816139da565b929592945050506040919091013590565b803563ffffffff81168114613a7857600080fd5b919050565b60008060408385031215613a9057600080fd5b613a9983613a64565b946020939093013593505050565b60008083601f840112613ab957600080fd5b5081356001600160401b03811115613ad057600080fd5b602083019150836020828501011115613ae857600080fd5b9250929050565b600080600080600060608688031215613b0757600080fd5b8535945060208601356001600160401b03811115613b2457600080fd5b613b3088828901613aa7565b90955093505060408601356001600160401b03811115613b4f57600080fd5b613b5b88828901613aa7565b969995985093965092949392505050565b60008060408385031215613b7f57600080fd5b8235613b8a816139da565b915060208301356001600160401b03811115613ba557600080fd5b8301601f81018513613bb657600080fd5b80356001600160401b03811115613bcf57613bcf613867565b613be2601f8201601f191660200161387d565b818152866020838501011115613bf757600080fd5b816020840160208301376000602083830101528093505050509250929050565b600080600080600080600060a0888a031215613c3257600080fd5b8735613c3d816139da565b9650602088013595506040880135945060608801356001600160401b03811115613c6657600080fd5b613c728a828b01613aa7565b90955093505060808801356001600160401b03811115613c9157600080fd5b613c9d8a828b01613aa7565b989b979a50959850939692959293505050565b60008083601f840112613cc257600080fd5b5081356001600160401b03811115613cd957600080fd5b6020830191508360208260051b8501011115613ae857600080fd5b600080600060408486031215613d0957600080fd5b8335613d14816139da565b925060208401356001600160401b03811115613d2f57600080fd5b613d3b86828701613cb0565b9497909650939450505050565b60008060408385031215613d5b57600080fd5b50508035926020909101359150565b60008060408385031215613d7d57600080fd5b8235613d88816139da565b91506020830135613a14816139da565b60008083601f840112613daa57600080fd5b5081356001600160401b03811115613dc157600080fd5b6020830191508360208260071b8501011115613ae857600080fd5b60008060208385031215613def57600080fd5b82356001600160401b03811115613e0557600080fd5b613e1185828601613d98565b90969095509350505050565b60008082840360c0811215613e3157600080fd5b8335925060a0601f1982011215613e4757600080fd5b506020830190509250929050565b80151581146109d757600080fd5b60008060008060008060c08789031215613e7c57600080fd5b8635955060208701359450613e9360408801613a64565b9350606087013592506080870135613eaa81613e55565b915060a0870135613eba816139da565b809150509295509295509295565b60008060008060408587031215613ede57600080fd5b84356001600160401b03811115613ef457600080fd5b613f0087828801613d98565b90955093505060208501356001600160401b03811115613f1f57600080fd5b613f2b87828801613cb0565b95989497509550505050565b60005b83811015613f52578181015183820152602001613f3a565b50506000910152565b60008151808452613f73816020860160208601613f37565b601f01601f19169290920160200192915050565b6020815260006124736020830184613f5b565b815181526020808301516001600160a01b031690820152604081016109be565b600060208284031215613fcc57600080fd5b61247382613a64565b634e487b7160e01b600052602160045260246000fd5b815160608201906004811061401057634e487b7160e01b600052602160045260246000fd5b82526020838101516001600160a01b031690830152604092830151929091019190915290565b60008060008060008060008060c0898b03121561405257600080fd5b883561405d816139da565b975060208901359650604089013595506060890135945060808901356001600160401b0381111561408d57600080fd5b6140998b828c01613aa7565b90955093505060a08901356001600160401b038111156140b857600080fd5b6140c48b828c01613aa7565b999c989b5096995094979396929594505050565b600080600080600080600080610100898b0312156140f557600080fd5b8835614100816139da565b97506020890135614110816139da565b96506040890135614120816139da565b95506060890135614130816139da565b94506080890135614140816139da565b935060a0890135614150816139da565b925060c0890135614160816139da565b915060e08901356001600160401b0381111561417b57600080fd5b89016000601f82018c1361418e57600080fd5b813561419c613917826138ad565b8082825260208201915060208360051b86010192508e8311156141be57600080fd5b6020850194505b828510156141e95784356141d8816139da565b8252602094850194909101906141c5565b9b9e9a9d50989b5096999598949750929550505050565b60008060008060008060a0878903121561421957600080fd5b8635614224816139da565b95506020870135614234816139da565b9450604087013593506060870135925060808701356001600160401b0381111561425d57600080fd5b61426989828a01613aa7565b979a9699509497509295939492505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b818103818111156109be576109be614291565b6000604082018483526040602084015280845180835260608501915060208601925060005b818110156142fd5783518352602093840193909201916001016142df565b50909695505050505050565b60018060a01b038616815284602082015260a06040820152600061433060a0830186613f5b565b6060830194909452506001600160a01b03919091166080909101529392505050565b8281526040602082015260006128ad6040830184613f5b565b6000608082840312801561437e57600080fd5b50604051608081016001600160401b03811182821017156143a1576143a1613867565b60405282356143af816139da565b81526143bd60208401613a64565b6020820152604083810135908201526060928301359281019290925250919050565b808201808211156109be576109be614291565b600060a082840312801561440557600080fd5b5060405160a081016001600160401b038111828210171561442857614428613867565b6040528235614436816139da565b8152602083810135908201526040808401359082015261445860608401613a64565b6060820152608083013561446b81613e55565b60808201529392505050565b60006020828403121561448957600080fd5b8151612473816139da565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906144ce90830184613f5b565b979650505050505050565b6000826144f657634e487b7160e01b600052601260045260246000fd5b500490565b80820281158282048414176109be576109be614291565b60006020828403121561452457600080fd5b5051919050565b60006001820161453d5761453d614291565b5060010190565b60018060a01b038516815283602082015260806040820152600061456b6080830185613f5b565b82810360608401526144ce8185613f5b565b60006020828403121561458f57600080fd5b815161247381613e55565b600082516145ac818460208701613f37565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300738128fe393bef1bcd8a524796fff40618b938cd467c71fcf37850ab0ba4f7d7a26469706673582212209e41d31aae1401a4ca127ed0e5f968c69fdae1a0b858e7d907b3518c68fa29b364736f6c634300081b0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
