{
  "contractName": "NFTMarketplace",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address payable",
          "name": "_feeRecipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_feePercentage",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "seller",
          "type": "address"
        }
      ],
      "name": "ItemCanceled",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "seller",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        }
      ],
      "name": "ItemListed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "buyer",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "seller",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "marketplaceFee",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "royaltyFee",
          "type": "uint256"
        }
      ],
      "name": "ItemSold",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "feePercentage",
      "outputs": [
        {
          "internalType": "uint256",  
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "feeRecipient",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "listings",
      "outputs": [
        {
          "internalType": "address",
          "name": "seller",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        },
        {
          "internalType": "uint256",
          "name": "royaltyPercentage",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "royaltyRecipient",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "supportedTokenStandards",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "royaltyPercentage",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "royaltyRecipient",
          "type": "address"
        }
      ],
      "name": "listItem",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "buyItem",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "cancelListing",
      "outputs": [],
      "stateMutability": "nonpayable", 
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "newPrice",
          "type": "uint256"
        }
      ],
      "name": "updatePrice",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "getListing",
      "outputs": [
        {
          "internalType": "address",
          "name": "seller",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "active",
          "type": "bool"
        },
        {
          "internalType": "uint256",
          "name": "royaltyPercentage",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "royaltyRecipient",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "newFeePercentage",
          "type": "uint256"
        }
      ],
      "name": "updateFeePercentage",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address payable",
          "name": "newFeeRecipient",
          "type": "address"
        }
      ],
      "name": "updateFeeRecipient",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "supported",
          "type": "bool"
        }
      ],
      "name": "updateSupportedTokenStandard",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "withdrawBalance",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "emergencyWithdraw",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "royaltyPercentage",
          "type": "uint256"
        }
      ],
      "name": "calculateFees",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "marketplaceFee",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "royaltyFee",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "sellerAmount",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "isListed",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x60806040523480156100105790036001600160a01b038216610049576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610040906101a8565b60405180910390fd5b6100526101b8565b6100606101c5565b6000546001600160a01b0316331461005f5761005f6101d2565b5f80fd5b61006781610097565b50565b60015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060025f819055505050565b5f6100a56101df565b90505f6100b46101ec565b90505f6100c36101f9565b90505f6100d2610206565b90505f6100e1610213565b90505f6100f0610220565b90505f6100ff61022d565b90505f61010e61023a565b90505f61011d610247565b90505f61012c610254565b90505f61013b610261565b90505f61014a61026e565b90505f61015961027b565b90505f610168610288565b90505f610177610295565b90505f6101866102a2565b90505f6101956102af565b90505060018054600160a01b600160e01b031916600160a01b6001600160a01b0385160217905560026bffffffffffffffffffffffff836040516020016101db91906102bc565b60405160208183030381529060405280519060200120815260200190815260200160002060008282546102829190610374565b909155505050565b6040805160808101825260025463ffffffff808216835264010000000082048116602084015268010000000000000000820481169383019390935260ff6c01000000000000000000000000909104161515606082015290565b61034563ffffffff8416565b151590565b50600190565b6040805160c08101825260035463ffffffff8082168352640100000000820481166020840152680100000000000000008204811693830193909352600160601b810483166060830152600160801b8104909216608082015260ff600160a01b909104161515151560a082015290565b8082018082111561039957634e487b7160e01b5f52601160045260245ffd5b92915050565b5f6103a960c051565b905073ffffffffffffffffffffffffffffffffffffffff81166103f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ea906103a0565b60405180910390fd5b6001600160a01b0381166000908152600260205260409020805460ff19166001179055565b6001600160a01b038116610463576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161045a906103b7565b60405180910390fd5b6001600160a01b0381166000908152600260205260409020805460ff19169055565b6005805460ff19811660ff90911615179055565b5f546001600160a01b0316331461005f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ea906103ce565b600454600160a01b900460ff16156105015761050061050f565b6105016105e4565b61052b600354610521610622565b61010481106104c4565b61053a610487565b63ffffffff811681146105305763ffffffff821681146105cf5750505050565b6105cf565b5f54600160a01b900460ff16156106055761060461061a565b610604610622565b5f6002600160a01b9081168252602080832054604080516302571be360e01b8152600481019290925290517c010000000000000000000000000000000000000000000000000000000084169263fca513b99260248082019391829003018186803b1580156106275750634e487b7160e01b5f52604160045260245ffd5b505afa15801561066c5750634e487b7160e01b5f52604160045260245ffd5b505050506040513d601f19601f820116820180604052508101906106909190610788565b9350505050565b5f600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f8173ffffffffffffffffffffffffffffffffffffffff16319050808411156107655760405162461bcd60e51b815260206004820152602860248201527f4552433230566f746573436865636b706f696e74733a20696e76616c6964206160448201527f6d6f756e740000000000000000000000000000000000000000000000000000006064820152608401610798565b6040805160208101909152908152604051636eb1769f60e11b81526001600160a01b038616600482015230602482015273ffffffffffffffffffffffffffffffffffffffff85169063dd62ed3e9060440160206040518083038186803b1580156108095750634e487b7160e01b5f52604160045260245ffd5b505afa15801561084d5750634e487b7160e01b5f52604160045260245ffd5b505050506040513d601f19601f820116820180604052508101906108719190610861565b8410156108e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206160448201527f7070726f766564000000000000000000000000000000000000000000000000006064820152608401610798565b604051636352211e60e01b81526004810185905273ffffffffffffffffffffffffffffffffffffffff86169063636352119060240160206040518083038186803b15801561096b5750634e487b7160e01b5f52604160045260245ffd5b505afa15801561099f5750634e487b7160e01b5f52604160045260245ffd5b505050506040513d601f19601f820116820180604052508101906109c39190610a13565b6001600160a01b0316336001600160a01b031614610a63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4e46544d61726b6574706c6163653a204f6e6c7920746f6b656e206f776e6560448201527f722063616e206c69737400000000000000000000000000000000000000000000006064820152608401610798565b61012c831115610acf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f526f79616c747920706572636e7420746f6f20686967680000000000000000006044820152606401610798565b604080516101008101825233815260208101869052600181830152606081018590526001600160a01b038481166080830152600060a0830152600060c0830152600060e083015273ffffffffffffffffffffffffffffffffffffffff8716825260046020908152604083208882529091529020815181546001600160a01b0319166001600160a01b0390911617815560208201516001820155604082015160028201805460ff191691151591909117905560608201516003820155608082015160048201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039092169190911790555060a0820151600582015560c0820151600682015560e0820151600782015590506040516342842e0e60e01b81523360048201523060248201526044810186905273ffffffffffffffffffffffffffffffffffffffff8716906342842e0e90606401600060405180830381600087803b158015610c3f5750634e487b7160e01b5f52604160045260245ffd5b505af1158015610c7f5750634e487b7160e01b5f52604160045260245ffd5b50505050856001600160a01b03167f02567b2553aeb44e4ddd5d68462774dc3de158cb0727264daaff7974306a8870333876040518084916001600160a01b031681526020018381526020018281526020019350505050602060405180830381600087803b158015610cf15750634e487b7160e01b5f52604160045260245ffd5b505af1158015610d315750634e487b7160e01b5f52604160045260245ffd5b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8086165f90815260046020908152604080832088845290915290206001015460028201548254600382015485948594859485949491939092911690565b8181604051602001610da6929190610e1f565b6040516020818303038152906040528051906020012073ffffffffffffffffffffffffffffffffffffffff8716855260046020908152604080870188885290915290528280548254600460c0830152600385015460e083015260a06040830152600160a01b86048116151560c08301526002850154610100830152610e269650505050505050565b6040805180820190915260138152724e46544d61726b6574706c61636520763161647360681b602082015290565b5f73ffffffffffffffffffffffffffffffffffffffff8316610e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e85906103a0565b60405180910390fd5b506001600160a01b03919091165f908152600460209081526040808320938352929052205460020154600160a01b900460ff1690565b73ffffffffffffffffffffffffffffffffffffffff8216610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f906103a0565b60405180910390fd5b336001600160a01b0316600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060008381526020019081526020015f205f015f9054906101000a90046001600160a01b03166001600160a01b031614610fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcd90610ffc565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff8316815260046020908152604080832084845290915290206002015460ff16158061103a575073ffffffffffffffffffffffffffffffffffffffff8216855260046020908152604080832085845290915290205460020154600160a01b900460ff165b611070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106790611110565b60405180910390fd5b5f600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060008381526020019081526020015f206040518060a001604052805f6001600160a01b03168152602001600081526020015f1515815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815250908160015f6101000a81548160ff021916908315150217905550507fe2b61c4abde4a89c2e2a653c7fb8e2b80eee4e5bfd8c4b2deb4ac21ed2f92d6483604051611165919061105f565b60405180910390a1505050565b5f600254905090565b61178661062c565b811061119b5760405162461bcd60e51b815260040161119290611195565b60405180910390fd5b6002819055507f611668bfdf8e9b2ba6e49784f2a7bb6d3d6b52f2b4bc0d9b1db0c8b4f7cf3a358160405161075c919061118c565b600354600160a01b900460ff16611217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120e9061121c565b60405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040516f74696d6520746f207374617274747261764160801b815260200160405180910390a15060036b1027e72f1f12813088000000908082016b0c9f2c9cd04674edea4000000090825050600360106101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555050565b73ffffffffffffffffffffffffffffffffffffffff8216855260046020908152604080832084845290915290206001810154919055604051636352211e60e01b81526004810183905273ffffffffffffffffffffffffffffffffffffffff8516906370a0823191506024016020604051808303816000875af1601f3d11620012f3575050634e487b7160e01b5f52601f60045260245ffd5b505050506040513d601f19601f8201168201806040525081019061131791906112f1565b336001600160a01b0391909116820103611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134e90611361565b60405180910390fd5b61136081610412565b507fecc3f60b3516b5e72cdabb4da3b89eda1e59ca34b0c37ee9e4f2688fe4b8b6a08386604051611391929190611395565b60405180910390a1505050565b5f6113a4826113f0565b9050919050565b600454600160a01b900460ff161515600114156113f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ec90611413565b60405180910390fd5b506040805160608101825260015463ffffffff808216835264010000000082048116602084015268010000000000000000909104169181019190915290565b5f73ffffffffffffffffffffffffffffffffffffffff8316611468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145f906103a0565b60405180910390fd5b506001600160a01b03919091165f908152600460209081526040808320938352929052205460010154151590565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600460209081526040808320848452909152902060020154600160a01b900460ff16611512576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150990611516565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff831681526004602090815260408083208584529091529020600181015490506127106115548260025461158f565b81151561156b5763ffffffff831515161561157057611570565b611570565b5f83840393505050506115d0565b5f839050612710611583600354866115939050565b6115839063ffffffff8616905090505050565b81811061159a575f5b80820295945050505050565b81840295945050505050565b634e487b7160e01b5f52601260045260245ffd5b5f816115ca576115ca6115aa565b500490565b5080820190600390030260028104949090565b826127106115f1866002546115f7905090565b600255600554604051636352211e60e01b81526004810187905260ff9091169073ffffffffffffffffffffffffffffffffffffffff8916906370a0823190602401602060405180830381865afa15801561164f5750634e487b7160e01b5f52604160045260245ffd5b505050506040513d601f19601f82011682018060405250810190611673919061165b565b6001600160a01b03161461168a5761168a61167b565b600680547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1665010000000000600386011663ffffffff160217905550565b6000620186a08201602085106116b457634e487b7160e01b600052604160045260245ffd5b5080820390506001600160a01b038216858201808203848511161561170c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170390611718565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff8c16815260046020908152604080832060e35f85151591909117815580613110850382602060405180830381601f196023190116820180604052503481015160600190600f60066bffffffffffffffffffffffff160101604052600854909152612710819073ffffffffffffffffffffffffffffffffffffffff1c168c60005260206000206040805163ffffffffffffffff8c168152602081018c9052908101939093526060830191909152608082018b90526001600160a01b03808c1660a084015260c0830196909652918c16908401526001600160e01b03198b1660e08301525060040160405180830390a4156118335750600601556001600160a01b0391909116155f9081526004602090815260408083209583529490529290206002015460ff169050565b1461187d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187490611881565b60405180910390fd5b346001015414156118c3576040517f08c379a000000000000000000000000000000000000000000000000000000000081526004016118ba906118c7565b60405180910390fd5b8160045f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8a815260200190815260200160002060010154036119ff5761196e5750634e487b7160e01b5f52604160005260245ffd5b5f73ffffffffffffffffffffffffffffffffffffffff8b16815260046020908152604080832060a8515292909252819020600281015411909117905560010154600182015460030154600482015460058301546006840154604080516bffffffffffffffffffffffff199a8b168b528a602052898982019063ffffffff199160d01b166060890152600160801b80910467ffffffffffffffff166080890152909116151560a0870152600160a01b9091046001600160a01b031660c08601529091906001600160801b031660e0850152610100840152610120830152610140820152610160810152610180600082015261019f810191505050565b804255611a2c57634e487b7160e01b5f52604160045260245ffd5b5060040160a082018815159052506040518091039082f590600387900b1515156020850152612710600487015414611a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8390611a90565b60405180910390fd5b5f8a815260046020908152604080832080546001600160a01b03191681556001810182905560050281018290556003810180547fffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff1690556004810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600581015f90556006810155600781015f905590829052610120830152610140820152610160810152610180810191909152815173ffffffffffffffffffffffffffffffffffffffff8d1690819060040160a082018815159052506040518091039082f5906003900b15159050604082018815159052506040518091039082f59060008c81526004602090815260408083205f90556001810182905560050281018290556003810180547fffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff1690556004810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600581015f90556006810155600781015f905590829052610120830152610140820152610160810152610180810191909152815173ffffffffffffffffffffffffffffffffffffffff8d1690819060040160a08201881515905250604051809103908290f590600387900b15159050604082018815159052506040518091039082f5906003905090508173ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff165f8d73ffffffffffffffffffffffffffffffffffffffff167f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8c8c8c8c8c8c604051611cc496959493929190611cd0565b60405180910390a3505050505050505050565b505050505050505050565b6040518060a0016040528060006001600160a01b03168152602001600081526020015f15158152602001600081526020015f6001600160a01b031681525090565b6040518060a0016040528060056001600160a01b03168152602001600581526020015f15158152602001600581526020015f6001600160a01b031681525090565b604080516001600160a01b03928316815291831660208301528101919091526060810191909152608081019190915260a0015b6040516020818303038152906040528051906020012090565b8061ffff16845250565b808203611dbb578115155b604051636e23b87160e01b81526004810191909152602481019190915290565b5050565b6001600160a01b03841681529190820360405186901c82015260608501945084846040518091039082f590600387900b1515159050604082018815159052506040518091039082f59060008c81526004602090815260408083205f90556001810182905560050281018290556003810180547fffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff1690556004810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600581015f90556006810155600781015f905590829052610120830152610140820152610160810152610180810191909152815173ffffffffffffffffffffffffffffffffffffffff8d1690819060040160a08201881515905250604051809103908290f590600387900b15159050604082018815159052506040518091039082f5906003905090508173ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff165f8d73ffffffffffffffffffffffffffffffffffffffff167f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8c8c8c8c8c8c604051611e9396959493929190611e9f565b60405180910390a35050505050505050565b60005b83811015611ec057808201611ebb818461175c565b8350505b600101611ea4565b505050565b5f8183611eda5760405180910390fd5b506020830151604084015160608501516080860151925087925086925085925084925050565b6040805160038082526080820190925290602082018380368337505092915050565b61ffff831681528060200190910152509392505050565b6001600160a01b038716815260208101869052604081018590526060810184905260808101839052509195945050505050565b5f8203611f7c5763ffffffff82166001600160a01b0385811682529092166020520190565b5f8b8b8b8b8b8b604051602001611f9896959493929190611fa4565b60405160208183030381529060405280519060018201602002016040518091039082f590600387900b15159050604082018815159052506040518091039082f5906003905090508173ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff165f8d73ffffffffffffffffffffffffffffffffffffffff167f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8c8c8c8c8c8c60405161205996959493929190612065565b60405180910390a35050505050505050565b604051604e820152602081018690526040810185905260608101849052608081018390526bffffffffffffffffffffffff19831660a08201819052846003020260c0820181905260a0820152f090506003905090508173ffffffffffffffffffffffffffffffffffffffff16945050505050565b8063ffffffff16845250565b808203612100578115155b604051636e23b87160e01b81526004810191909152602481019190915290565b5050565b6040805160038082526080820190925290602082018380368337505092915050565b63ffffffff8316815260200183815260200182606001356040518060400160405190815260200160008152509392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561218657612186612156565b60405290565b5f5b838110156121a6578181015183820152602001612190565b50505050565b5f81519050919050565b5f82601f8301126121c6575f80fd5b815160206001600160401b038211156121e1576121e1612156565b6121ef818360051b01612164565b82815260059290921b8401810191818101908684111561220e575f80fd5b8286015b84811015612229578051835291830191830161222e5b509695505050505050565b5f8060408385031215612246575f80fd5b82356001600160401b0380821115612265575f80fd5b612271868387016121b6565b93506020850135915080821115612287575f80fd5b50612294858286016121b6565b9150509250929050565b5f602082840312156122af575f80fd5b81516001600160a01b03811681146122c7575f80fd5b92915050565b6001600160a01b03959095168552602085019390935260408401919091526060830152608082015260a00190565b6001600160a01b03861681526020810185905260408101849052606081018390526080810182905260a081019190915260c00190565b6001600160a01b03858116825284166020820152604081018390526060810182905260800190565b5f6020828403121561235f575f80fd5b8151801515811481146122c7575f80fd5b604081525f61238a60408301856122a8565b82810360208401526123a981856122a8565b95945050505050565b5f602082840312156123c3575f80fd5b8135600281900b81146122c7575f80fd5b5f8183036080811215806123e5575f80fd5b61ffff8316815290565b5050919050565b604051602081016001600160401b0381118282101715612418576124186124cd565b60405290565b5f6020828403121561242f575f80fd5b81516001600160a01b03811681146122c757f80fd5b602081525f82518060208401526124648160408501602087016124cd565b601f01601f19169190910160400192915050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f604082840312156124b7575f80fd5b6124bf6124ed565b9050815181526020820151602082015292915050565b634e487b7160e01b5f52601160045260245ffd5b5f6001600160401b0382111561250157612501612156565b5060051b60200190565b5f8151808452612522816020860160208601612190565b601f01601f19169290920160200192915050565b6020815260ff9091166020820152604081019190915260600190565b600281900b8152604060208201525f6125676040830184612552565b949350505050565b6040815260406020820152600481526302ee3d0360e51b606082015260808101919091526001600160a01b0391909116604082015260600190565b6020815282516020820152608081016020830160050b60408301526001600160a01b0360808401511660608301526020830160050b6080830152600160a01b60c08501511660c083015260e084015192506001600160801b0360e085015192508060ff86511660208701526040860151604087015260608601516060870152608086015160808701525094935050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260808101829052600060a0820181905260c08201525050949350505050565b6040815283516040820152602084015160608201526001600160a01b0360408501511660808201526060840151606082015260808401516080820152600160601b60a08501511615156001600160a01b039091161760a08201526003810190506001600160a01b038616151560c0820152600160a01b8060e08501511660e0830152506101008501511661010082015260408101859052608081018490526101208101839052606081018290526040810151610140820152509392505050565b6001600160a01b0384811682528316602082015260408101829052600060608201819052608082015250949350505050565b60208101829052604081018190525f8260608201819052608082015250969590951515958515159485951515604086015260608501526001600160a01b039093166080840152600160601b9190911660a083015260c082015260600190565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a083015260c081015160c083015260e081015160e083015261010081015161010083015261012081015161012083015261014081015161014083015261016081015161016083015261018081015161018083015256fea264697066735822122067b8e9c5a7b1e8d9c0f2a6c3e1b4d5c6a9f3e0b7c8d4e5f6a9b2c3d4e5f697e88664736f6c63430008140033"
}