{
  "_format": "hh-sol-artifact-1",
  "contractName": "VideoPayment",
  "sourceName": "contracts/VideoPayment.sol",
  "abi": [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "target",
          "type": "address"
        }
      ],
      "name": "AddressEmptyCode",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "AlreadyPurchased",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ArrayLengthMismatch",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ContractPaused",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "ERC1967InvalidImplementation",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ERC1967NonPayable",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "FailedCall",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InsufficientPayment",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidAmount",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidContent",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidInitialization",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NoValidPermission",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotAdmin",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotInitializing",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotOwner",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ReentrancyGuardReentrantCall",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UUPSUnauthorizedCallContext",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "slot",
          "type": "bytes32"
        }
      ],
      "name": "UUPSUnsupportedProxiableUUID",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UnsupportedToken",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ZeroAddress",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "admin",
          "type": "address"
        }
      ],
      "name": "AdminAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "admin",
          "type": "address"
        }
      ],
      "name": "AdminRemoved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256[]",
          "name": "contentIds",
          "type": "uint256[]"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "paymentToken",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "totalAmount",
          "type": "uint256"
        }
      ],
      "name": "BatchPurchased",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "contentId",
          "type": "uint256"
        }
      ],
      "name": "ContentConfigUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "contentId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "paymentToken",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "viewCount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "validUntil",
          "type": "uint256"
        }
      ],
      "name": "ContentPurchased",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "version",
          "type": "uint64"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "contentId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "NFTPurchased",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [],
      "name": "Paused",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "contentId",
          "type": "uint256"
        }
      ],
      "name": "PermissionExpired",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "SupportedTokenAdded",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "SupportedTokenRemoved",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "contentId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        }
      ],
      "name": "TokenPriceUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [],
      "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": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "contentId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "remainingViews",
          "type": "uint256"
        }
      ],
      "name": "ViewConsumed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "contentId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "addedCount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "totalRemaining",
          "type": "uint256"
        }
      ],
      "name": "ViewCountAdded",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "UPGRADE_INTERFACE_VERSION",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "admin",
          "type": "address"
        }
      ],
      "name": "addAdmin",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "addSupportedToken",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "users",
          "type": "address[]"
        },
        {
          "internalType": "uint256[]",
          "name": "contentIds",
          "type": "uint256[]"
        }
      ],
      "name": "batchConsumeView",
      "outputs": [
        {
          "internalType": "bool[]",
          "name": "",
          "type": "bool[]"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256[]",
          "name": "contentIds",
          "type": "uint256[]"
        },
        {
          "internalType": "address",
          "name": "paymentToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "totalAmount",
          "type": "uint256"
        }
      ],
      "name": "batchPurchase",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256[]",
          "name": "contentIds",
          "type": "uint256[]"
        },
        {
          "internalType": "uint256[]",
          "name": "nativePrices",
          "type": "uint256[]"
        },
        {
          "internalType": "uint256[]",
          "name": "defaultViewCounts",
          "type": "uint256[]"
        },
        {
          "internalType": "uint256[]",
          "name": "viewDurations",
          "type": "uint256[]"
        },
        {
          "internalType": "bool[]",
          "name": "isActiveArray",
          "type": "bool[]"
        }
      ],
      "name": "batchSetContentConfig",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256[]",
          "name": "contentIds",
          "type": "uint256[]"
        },
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "internalType": "uint256[]",
          "name": "prices",
          "type": "uint256[]"
        }
      ],
      "name": "batchUpdateTokenPrice",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "contentId",
          "type": "uint256"
        }
      ],
      "name": "consumeView",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "contentId",
          "type": "uint256"
        }
      ],
      "name": "getContentPurchaseInfo",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "defaultViewCount",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "viewDuration",
              "type": "uint256"
            },
            {
              "internalType": "bool",
              "name": "isActive",
              "type": "bool"
            },
            {
              "internalType": "address[]",
              "name": "supportedTokens",
              "type": "address[]"
            },
            {
              "internalType": "uint256[]",
              "name": "tokenPrices",
              "type": "uint256[]"
            },
            {
              "internalType": "bool",
              "name": "isUnlimitedViewing",
              "type": "bool"
            }
          ],
          "internalType": "struct IVideoPayment.ContentPurchaseInfo",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "contentId",
          "type": "uint256"
        }
      ],
      "name": "getPermissionDetails",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "purchaseTime",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "remainingViews",
              "type": "uint256"
            },
            {
              "internalType": "bool",
              "name": "isValid",
              "type": "bool"
            }
          ],
          "internalType": "struct VideoPaymentStorage.ViewPermission",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "internalType": "uint256[]",
          "name": "contentIds",
          "type": "uint256[]"
        }
      ],
      "name": "getUserPermissions",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "purchaseTime",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "remainingViews",
              "type": "uint256"
            },
            {
              "internalType": "bool",
              "name": "isValid",
              "type": "bool"
            }
          ],
          "internalType": "struct VideoPaymentStorage.ViewPermission[]",
          "name": "",
          "type": "tuple[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "contentId",
          "type": "uint256"
        }
      ],
      "name": "hasViewPermission",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "initialOwner",
          "type": "address"
        },
        {
          "internalType": "address[]",
          "name": "initialAdmins",
          "type": "address[]"
        },
        {
          "internalType": "address[]",
          "name": "supportedTokenAddresses",
          "type": "address[]"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "contentId",
          "type": "uint256"
        }
      ],
      "name": "isContentActive",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "isSupportedToken",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "migrate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "pause",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proxiableUUID",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "contentId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "paymentToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "purchaseContent",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "contentId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "nftContract",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "purchaseWithNFT",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "admin",
          "type": "address"
        }
      ],
      "name": "removeAdmin",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "removeSupportedToken",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "contentId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "nativePrice",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "defaultViewCount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "viewDuration",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "isActive",
          "type": "bool"
        }
      ],
      "name": "setContentConfig",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "unpause",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "contentId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        }
      ],
      "name": "updateTokenPrice",
      "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": [],
      "name": "version",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100d4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100725760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d15780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6080516132606100fd60003960008181612183015281816121ac015261231801526132606000f3fe60806040526004361061019c5760003560e01c806370480275116100ec57806399ea24fe1161008a578063b303f53f11610064578063b303f53f146104b9578063b6f1d140146104e6578063b8e8f98e146104f9578063caae24b31461052657600080fd5b806399ea24fe14610448578063ad3cb1cc1461045b578063b1b105fe1461049957600080fd5b806386778641116100c657806386778641146103c65780638d13660e146103e65780638f0ff11b146104135780638fd3ab801461043357600080fd5b8063704802751461037157806376319190146103915780638456cb59146103b157600080fd5b806340033b3d11610159578063529e2b3211610133578063529e2b32146102ec57806352d1902d1461031957806354fd4d501461033c5780636d69fcaf1461035157600080fd5b806340033b3d146102865780634a200fa5146102b95780634f1ef286146102d957600080fd5b806305059571146101a157806309b952be146101d65780631785f53c146101f8578063240028e8146102185780633428cebb146102515780633f4ba83a14610271575b600080fd5b3480156101ad57600080fd5b506101c16101bc3660046128c4565b610546565b60405190151581526020015b60405180910390f35b3480156101e257600080fd5b506101f66101f1366004612a3b565b610722565b005b34801561020457600080fd5b506101f6610213366004612b22565b610952565b34801561022457600080fd5b506101c1610233366004612b22565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561025d57600080fd5b506101f661026c366004612b3f565b6109ed565b34801561027d57600080fd5b506101f6610ade565b34801561029257600080fd5b506101c16102a1366004612b77565b60009081526002602052604090206004015460ff1690565b3480156102c557600080fd5b506101f66102d4366004612bf7565b610b3e565b6101f66102e7366004612c70565b610e74565b3480156102f857600080fd5b5061030c610307366004612d1b565b610e93565b6040516101cd9190612d82565b34801561032557600080fd5b5061032e611286565b6040519081526020016101cd565b34801561034857600080fd5b5060065461032e565b34801561035d57600080fd5b506101f661036c366004612b22565b6112a3565b34801561037d57600080fd5b506101f661038c366004612b22565b61131f565b34801561039d57600080fd5b506101f66103ac366004612b22565b6113c0565b3480156103bd57600080fd5b506101f6611439565b3480156103d257600080fd5b506101f66103e1366004612b3f565b61149c565b3480156103f257600080fd5b506104066104013660046128c4565b611661565b6040516101cd9190612dc7565b34801561041f57600080fd5b506101f661042e366004612dea565b6116da565b34801561043f57600080fd5b506101f66118b0565b6101f6610456366004612e59565b6118dd565b34801561046757600080fd5b5061048c604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101cd9190612ec5565b3480156104a557600080fd5b506101f66104b4366004612ef8565b611bc7565b3480156104c557600080fd5b506104d96104d4366004612f45565b611c5a565b6040516101cd9190612f7e565b6101f66104f4366004612b3f565b611d75565b34801561050557600080fd5b50610519610514366004612b77565b611fdc565b6040516101cd9190613013565b34801561053257600080fd5b506101c16105413660046128c4565b61207d565b3360009081526001602052604081205460ff1661057657604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b03831660009081526003602090815260408083208584529091529020600281015460ff166105be5760405163fcd7a1b560e01b815260040160405180910390fd5b60008381526002602052604090206003015481546105dc91906130d4565b4211156105fc5760405163fcd7a1b560e01b815260040160405180910390fd5b600083815260026020819052604082200154908190036106545783856001600160a01b03166000805160206131cb833981519152600060405161064191815260200190565b60405180910390a360019250505061071c565b81600101546000036106795760405163fcd7a1b560e01b815260040160405180910390fd5b60018201805490600061068b836130e7565b919050555083856001600160a01b03166000805160206131cb83398151915284600101546040516106be91815260200190565b60405180910390a381600101546000036107155760028201805460ff1916905560405184906001600160a01b038716907f294e395c96ee31e4373f6b284b107e5341ffa80f2c53e582bc3cfb1f9efe500e90600090a35b6001925050505b92915050565b3360009081526001602052604090205460ff1661075257604051637bfa4b9f60e01b815260040160405180910390fd5b8351855114158061076557508251855114155b8061077257508151855114155b8061077f57508051855114155b1561079d5760405163512509d360e11b815260040160405180910390fd5b60005b855181101561094a578481815181106107bb576107bb6130fe565b6020026020010151600060020160008884815181106107dc576107dc6130fe565b602002602001015181526020019081526020016000206001018190555083818151811061080b5761080b6130fe565b60200260200101516000600201600088848151811061082c5761082c6130fe565b602002602001015181526020019081526020016000206002018190555082818151811061085b5761085b6130fe565b60200260200101516000600201600088848151811061087c5761087c6130fe565b60200260200101518152602001908152602001600020600301819055508181815181106108ab576108ab6130fe565b6020026020010151600060020160008884815181106108cc576108cc6130fe565b6020026020010151815260200190815260200160002060040160006101000a81548160ff02191690831515021790555085818151811061090e5761090e6130fe565b60200260200101517fa7c3f5f04f0c05ad82fcdf81039da5a01bf41ce2769b7b347afa43bb65e4426660405160405180910390a26001016107a0565b505050505050565b6000546001600160a01b0316331461097d576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b0381166109a45760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038116600081815260016020526040808220805460ff19169055517fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f9190a250565b3360009081526001602052604090205460ff16610a1d57604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b03821660009081526004602052604090205460ff16610a565760405163350b944160e11b815260040160405180910390fd5b60008381526002602090815260408083206001600160a01b0386168085529252909120829055610a955760008381526002602052604090206001018190555b816001600160a01b0316837f376716bd86293ff8b34061b9af3cac5116f15e0f2cbf689d822b6d6d7b1eeca983604051610ad191815260200190565b60405180910390a3505050565b6000546001600160a01b03163314610b09576040516330cd747160e01b815260040160405180910390fd5b6005805460ff191690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b6000610b48612137565b805490915060ff600160401b82041615906001600160401b0316600081158015610b6f5750825b90506000826001600160401b03166001148015610b8b5750303b155b905081158015610b99575080155b15610bb75760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610be157845460ff60401b1916600160401b1785555b6001600160a01b038816610c085760405163d92e233d60e01b815260040160405180910390fd5b610c10612160565b610c18612168565b600080546001600160a01b0319166001600160a01b038a1617815560016006556005805460ff191690555b8751811015610d315760006001600160a01b0316888281518110610c6957610c696130fe565b60200260200101516001600160a01b031614610d29576001600060010160008a8481518110610c9a57610c9a6130fe565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550878181518110610ceb57610ceb6130fe565b60200260200101516001600160a01b03167f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33960405160405180910390a25b600101610c43565b5060005b8651811015610e235760006001600160a01b0316878281518110610d5b57610d5b6130fe565b60200260200101516001600160a01b031614610e1b57600160006004016000898481518110610d8c57610d8c6130fe565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550868181518110610ddd57610ddd6130fe565b60200260200101516001600160a01b03167fd1be2e90bd3d24839d9dd94ad871068e1f9688b02fa43f2a62c9975dfa9de2d760405160405180910390a25b600101610d35565b508315610e6a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610e7c612178565b610e858261221d565b610e8f828261224b565b5050565b3360009081526001602052604090205460609060ff16610ec657604051637bfa4b9f60e01b815260040160405180910390fd5b8151835114610ee85760405163512509d360e11b815260040160405180910390fd5b600083516001600160401b03811115610f0357610f036128f0565b604051908082528060200260200182016040528015610f2c578160200160208202803683370190505b50905060005b845181101561127e576000806003016000878481518110610f5557610f556130fe565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000868481518110610f9157610f916130fe565b6020026020010151815260200190815260200160002090508060020160009054906101000a900460ff16610fe9576000838381518110610fd357610fd36130fe565b9115156020928302919091019091015250611276565b60006002016000868481518110611002576110026130fe565b6020026020010151815260200190815260200160002060030154816000015461102b91906130d4565b421115611046576000838381518110610fd357610fd36130fe565b6000806002016000878581518110611060576110606130fe565b602002602001015181526020019081526020016000206002015490508060000361111257858381518110611096576110966130fe565b60200260200101518784815181106110b0576110b06130fe565b60200260200101516001600160a01b03166000805160206131cb83398151915260006040516110e191815260200190565b60405180910390a360018484815181106110fd576110fd6130fe565b91151560209283029190910190910152611273565b816001015460000361114b576000848481518110611132576111326130fe565b6020026020010190151590811515815250505050611276565b60018201805490600061115d836130e7565b9190505550858381518110611174576111746130fe565b602002602001015187848151811061118e5761118e6130fe565b60200260200101516001600160a01b03166000805160206131cb83398151915284600101546040516111c291815260200190565b60405180910390a3816001015460000361124e5760028201805460ff1916905585518690849081106111f6576111f66130fe565b6020026020010151878481518110611210576112106130fe565b60200260200101516001600160a01b03167f294e395c96ee31e4373f6b284b107e5341ffa80f2c53e582bc3cfb1f9efe500e60405160405180910390a35b6001848481518110611262576112626130fe565b911515602092830291909101909101525b50505b600101610f32565b509392505050565b600061129061230d565b506000805160206131eb83398151915290565b3360009081526001602052604090205460ff166112d357604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b038116600081815260046020526040808220805460ff19166001179055517fd1be2e90bd3d24839d9dd94ad871068e1f9688b02fa43f2a62c9975dfa9de2d79190a250565b6000546001600160a01b0316331461134a576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b0381166113715760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e3399190a250565b3360009081526001602052604090205460ff166113f057604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b038116600081815260046020526040808220805460ff19169055517fbea12876694c4055c71f74308f752b9027cf3d554194000a366abddfc239a3069190a250565b6000546001600160a01b03163314611464576040516330cd747160e01b815260040160405180910390fd5b6005805460ff191660011790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b6114a4612356565b60055460ff16156114c85760405163ab35696f60e01b815260040160405180910390fd5b600083815260026020526040902060040154839060ff166114fc5760405163ab4142cf60e01b815260040160405180910390fd5b6040516331a9108f60e11b81526004810183905233906001600160a01b03851690636352211e90602401602060405180830381865afa158015611543573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115679190613114565b6001600160a01b03161461158e5760405163fcd7a1b560e01b815260040160405180910390fd5b6040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b038416906323b872dd90606401600060405180830381600087803b1580156115dc57600080fd5b505af11580156115f0573d6000803e3d6000fd5b505050506115fe338561238e565b604080516001600160a01b038516815260208101849052859133917fd0de3e759b6d8ae4ab8dfd56f0869b691034bf2f14b896155287e5cd61d66a70910160405180910390a35061165c600160008051602061320b83398151915255565b505050565b611687604051806060016040528060008152602001600081526020016000151581525090565b506001600160a01b03821660009081526003602090815260408083208484528252918290208251606081018452815481526001820154928101929092526002015460ff1615159181019190915292915050565b3360009081526001602052604090205460ff1661170a57604051637bfa4b9f60e01b815260040160405180910390fd5b805183511461172c5760405163512509d360e11b815260040160405180910390fd5b6001600160a01b03821660009081526004602052604090205460ff166117655760405163350b944160e11b815260040160405180910390fd5b60005b83518110156118aa57818181518110611783576117836130fe565b6020026020010151600060020160008684815181106117a4576117a46130fe565b602090810291909101810151825281810192909252604090810160009081206001600160a01b0388168083529352209190915561182c578181815181106117ed576117ed6130fe565b60200260200101516000600201600086848151811061180e5761180e6130fe565b60200260200101518152602001908152602001600020600101819055505b826001600160a01b0316848281518110611848576118486130fe565b60200260200101517f376716bd86293ff8b34061b9af3cac5116f15e0f2cbf689d822b6d6d7b1eeca9848481518110611883576118836130fe565b602002602001015160405161189a91815260200190565b60405180910390a3600101611768565b50505050565b6000546001600160a01b031633146118db576040516330cd747160e01b815260040160405180910390fd5b565b6118e5612356565b60055460ff16156119095760405163ab35696f60e01b815260040160405180910390fd5b6001600160a01b03821660009081526004602052604090205460ff166119425760405163350b944160e11b815260040160405180910390fd5b6000805b8451811015611a655760006002016000868381518110611968576119686130fe565b60209081029190910181015182528101919091526040016000206004015460ff166119a65760405163ab4142cf60e01b815260040160405180910390fd5b6001600160a01b0384166119f957600060020160008683815181106119cd576119cd6130fe565b6020026020010151815260200190815260200160002060010154826119f291906130d4565b9150611a5d565b60006002016000868381518110611a1257611a126130fe565b602002602001015181526020019081526020016000206000016000856001600160a01b03166001600160a01b031681526020019081526020016000205482611a5a91906130d4565b91505b600101611946565b50808214611a865760405163cd1c886760e01b815260040160405180910390fd5b6001600160a01b038316611ab957813414611ab45760405163cd1c886760e01b815260040160405180910390fd5b611b32565b6040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b038416906323b872dd906064016020604051808303816000875af1158015611b0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b309190613131565b505b60005b8451811015611b6957611b6133868381518110611b5457611b546130fe565b602002602001015161238e565b600101611b35565b50336001600160a01b03167f2be07a645f06bfa8b189b4f0aba9bf2109d098d03cbede0449641495bba5d53d858585604051611ba79392919061314e565b60405180910390a25061165c600160008051602061320b83398151915255565b3360009081526001602052604090205460ff16611bf757604051637bfa4b9f60e01b815260040160405180910390fd5b600085815260026020819052604080832060018101889055918201869055600382018590556004909101805460ff19168415151790555186917fa7c3f5f04f0c05ad82fcdf81039da5a01bf41ce2769b7b347afa43bb65e4426691a25050505050565b6060600082516001600160401b03811115611c7757611c776128f0565b604051908082528060200260200182016040528015611cce57816020015b611cbb604051806060016040528060008152602001600081526020016000151581525090565b815260200190600190039081611c955790505b50905060005b835181101561127e576001600160a01b03851660009081526003602052604081208551909190869084908110611d0c57611d0c6130fe565b60209081029190910181015182528181019290925260409081016000208151606081018352815481526001820154938101939093526002015460ff161515908201528251839083908110611d6257611d626130fe565b6020908102919091010152600101611cd4565b611d7d612356565b60055460ff1615611da15760405163ab35696f60e01b815260040160405180910390fd5b600083815260026020526040902060040154839060ff16611dd55760405163ab4142cf60e01b815260040160405180910390fd5b6001600160a01b03831660009081526004602052604090205460ff16611e0e5760405163350b944160e11b815260040160405180910390fd5b60006001600160a01b038416611e765750600084815260026020526040902060010154348114611e515760405163cd1c886760e01b815260040160405180910390fd5b348314611e715760405163cd1c886760e01b815260040160405180910390fd5b611f33565b5060008481526002602090815260408083206001600160a01b0387168452909152902054828114611eba5760405163cd1c886760e01b815260040160405180910390fd5b6040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b038516906323b872dd906064016020604051808303816000875af1158015611f0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f319190613131565b505b611f3d338661238e565b600085815260026020526040812060030154611f5990426130d4565b6000878152600260208181526040928390209091015482516001600160a01b038a16815291820188905281830152606081018390529051919250879133917f180fe4b156a592a405cdd866f58883063db683348215e97cf864d6bf9679261c919081900360800190a350505061165c600160008051602061320b83398151915255565b6120196040518060c00160405280600081526020016000815260200160001515815260200160608152602001606081526020016000151581525090565b60008281526002602052604081209080612032856124e2565b6040805160c08101825260028701548082526003880154602083015260049097015460ff1615159181019190915260608101929092526080820152921560a084015250909392505050565b6001600160a01b038216600090815260036020908152604080832084845282528083208151606081018352815481526001820154938101939093526002015460ff1615159082018190526120d557600091505061071c565b60008381526002602052604090206003015481516120f391906130d4565b42111561210457600091505061071c565b600083815260026020819052604082200154908190036121295760019250505061071c565b50602001511515905061071c565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0061071c565b6118db612690565b612170612690565b6118db6126b5565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806121ff57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166121f36000805160206131eb833981519152546001600160a01b031690565b6001600160a01b031614155b156118db5760405163703e46dd60e11b815260040160405180910390fd5b6000546001600160a01b03163314612248576040516330cd747160e01b815260040160405180910390fd5b50565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156122a5575060408051601f3d908101601f191682019092526122a29181019061317c565b60015b6122d257604051634c9c8ce360e01b81526001600160a01b03831660048201526024015b60405180910390fd5b6000805160206131eb833981519152811461230357604051632a87526960e21b8152600481018290526024016122c9565b61165c83836126bd565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146118db5760405163703e46dd60e11b815260040160405180910390fd5b60008051602061320b83398151915280546001190161238857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b6001600160a01b03821660009081526003602081815260408084208585528252808420600292839052908420918201549190920154919290919082900361241d57600283015460ff1680156123ef575082546123eb9082906130d4565b4211155b156123fb575050505050565b428355600060018085019190915560028401805460ff191690911790556124c7565b600283015460ff16801561243d575082546124399082906130d4565b4211155b156124ac578183600101600082825461245691906130d4565b9091555050600183015460408051848152602081019290925285916001600160a01b038816917fb76abe3c068fccae7ac0f9377f48f7261dcf952179a37060c5de877a493e67b7910160405180910390a36124c7565b428355600180840183905560028401805460ff191690911790555b5050505050565b600160008051602061320b83398151915255565b600080805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec54606091829160ff168015612532575060008481526002602052604090206001015415155b15612545578061254181613195565b9150505b806001600160401b0381111561255d5761255d6128f0565b604051908082528060200260200182016040528015612586578160200160208202803683370190505b509250806001600160401b038111156125a1576125a16128f0565b6040519080825280602002602001820160405280156125ca578160200160208202803683370190505b50600080805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec549193509060ff16801561261a575060008581526002602052604090206001015415155b15612689576000848281518110612633576126336130fe565b6001600160a01b039092166020928302919091018201526000868152600290915260409020600101548351849083908110612670576126706130fe565b60209081029190910101528061268581613195565b9150505b5050915091565b612698612713565b6118db57604051631afcd79f60e31b815260040160405180910390fd5b6124ce612690565b6126c68261272d565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561270b5761165c8282612792565b610e8f612808565b600061271d612137565b54600160401b900460ff16919050565b806001600160a01b03163b60000361276357604051634c9c8ce360e01b81526001600160a01b03821660048201526024016122c9565b6000805160206131eb83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516127af91906131ae565b600060405180830381855af49150503d80600081146127ea576040519150601f19603f3d011682016040523d82523d6000602084013e6127ef565b606091505b50915091506127ff858383612827565b95945050505050565b34156118db5760405163b398979f60e01b815260040160405180910390fd5b60608261283c5761283782612886565b61287f565b815115801561285357506001600160a01b0384163b155b1561287c57604051639996b31560e01b81526001600160a01b03851660048201526024016122c9565b50805b9392505050565b8051156128965780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6001600160a01b038116811461224857600080fd5b600080604083850312156128d757600080fd5b82356128e2816128af565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561292e5761292e6128f0565b604052919050565b60006001600160401b0382111561294f5761294f6128f0565b5060051b60200190565b600082601f83011261296a57600080fd5b813561297d61297882612936565b612906565b8082825260208201915060208360051b86010192508583111561299f57600080fd5b602085015b838110156129bc5780358352602092830192016129a4565b5095945050505050565b801515811461224857600080fd5b600082601f8301126129e557600080fd5b81356129f361297882612936565b8082825260208201915060208360051b860101925085831115612a1557600080fd5b602085015b838110156129bc578035612a2d816129c6565b835260209283019201612a1a565b600080600080600060a08688031215612a5357600080fd5b85356001600160401b03811115612a6957600080fd5b612a7588828901612959565b95505060208601356001600160401b03811115612a9157600080fd5b612a9d88828901612959565b94505060408601356001600160401b03811115612ab957600080fd5b612ac588828901612959565b93505060608601356001600160401b03811115612ae157600080fd5b612aed88828901612959565b92505060808601356001600160401b03811115612b0957600080fd5b612b15888289016129d4565b9150509295509295909350565b600060208284031215612b3457600080fd5b813561287f816128af565b600080600060608486031215612b5457600080fd5b833592506020840135612b66816128af565b929592945050506040919091013590565b600060208284031215612b8957600080fd5b5035919050565b600082601f830112612ba157600080fd5b8135612baf61297882612936565b8082825260208201915060208360051b860101925085831115612bd157600080fd5b602085015b838110156129bc578035612be9816128af565b835260209283019201612bd6565b600080600060608486031215612c0c57600080fd5b8335612c17816128af565b925060208401356001600160401b03811115612c3257600080fd5b612c3e86828701612b90565b92505060408401356001600160401b03811115612c5a57600080fd5b612c6686828701612b90565b9150509250925092565b60008060408385031215612c8357600080fd5b8235612c8e816128af565b915060208301356001600160401b03811115612ca957600080fd5b8301601f81018513612cba57600080fd5b80356001600160401b03811115612cd357612cd36128f0565b612ce6601f8201601f1916602001612906565b818152866020838501011115612cfb57600080fd5b816020840160208301376000602083830101528093505050509250929050565b60008060408385031215612d2e57600080fd5b82356001600160401b03811115612d4457600080fd5b612d5085828601612b90565b92505060208301356001600160401b03811115612d6c57600080fd5b612d7885828601612959565b9150509250929050565b602080825282518282018190526000918401906040840190835b81811015612dbc5783511515835260209384019390920191600101612d9c565b509095945050505050565b81518152602080830151908201526040808301511515908201526060810161071c565b600080600060608486031215612dff57600080fd5b83356001600160401b03811115612e1557600080fd5b612e2186828701612959565b9350506020840135612e32816128af565b915060408401356001600160401b03811115612e4d57600080fd5b612c6686828701612959565b600080600060608486031215612e6e57600080fd5b83356001600160401b03811115612e8457600080fd5b612e9086828701612959565b9350506020840135612b66816128af565b60005b83811015612ebc578181015183820152602001612ea4565b50506000910152565b6020815260008251806020840152612ee4816040850160208701612ea1565b601f01601f19169190910160400192915050565b600080600080600060a08688031215612f1057600080fd5b853594506020860135935060408601359250606086013591506080860135612f37816129c6565b809150509295509295909350565b60008060408385031215612f5857600080fd5b8235612f63816128af565b915060208301356001600160401b03811115612d6c57600080fd5b602080825282518282018190526000918401906040840190835b81811015612dbc57612fc183855180518252602080820151908301526040908101511515910152565b6020939093019260609290920191600101612f98565b600081518084526020840193506020830160005b82811015613009578151865260209586019590910190600101612feb565b5093949350505050565b60208152600060e082018351602084015260208401516040840152604084015115156060840152606084015160c0608085015281815180845261010086019150602083019350600092505b808310156130895783516001600160a01b03168252602093840193600193909301929091019061305e565b506080860151858203601f190160a087015292506130a78184612fd7565b9250505060a084015161127e60c085018215159052565b634e487b7160e01b600052601160045260246000fd5b8082018082111561071c5761071c6130be565b6000816130f6576130f66130be565b506000190190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561312657600080fd5b815161287f816128af565b60006020828403121561314357600080fd5b815161287f816129c6565b6060815260006131616060830186612fd7565b6001600160a01b039490941660208301525060400152919050565b60006020828403121561318e57600080fd5b5051919050565b6000600182016131a7576131a76130be565b5060010190565b600082516131c0818460208701612ea1565b919091019291505056fe2ccc6c74b339e9d58b89aa6bb58d0519712aeff106f7981d466f54572cb88b42360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a26469706673582212205360a02460f8e8d4dfce4cfc45d45f74b6c93829f4b3e42714bf9ccaa698894a64736f6c634300081c0033",
  "deployedBytecode": "0x60806040526004361061019c5760003560e01c806370480275116100ec57806399ea24fe1161008a578063b303f53f11610064578063b303f53f146104b9578063b6f1d140146104e6578063b8e8f98e146104f9578063caae24b31461052657600080fd5b806399ea24fe14610448578063ad3cb1cc1461045b578063b1b105fe1461049957600080fd5b806386778641116100c657806386778641146103c65780638d13660e146103e65780638f0ff11b146104135780638fd3ab801461043357600080fd5b8063704802751461037157806376319190146103915780638456cb59146103b157600080fd5b806340033b3d11610159578063529e2b3211610133578063529e2b32146102ec57806352d1902d1461031957806354fd4d501461033c5780636d69fcaf1461035157600080fd5b806340033b3d146102865780634a200fa5146102b95780634f1ef286146102d957600080fd5b806305059571146101a157806309b952be146101d65780631785f53c146101f8578063240028e8146102185780633428cebb146102515780633f4ba83a14610271575b600080fd5b3480156101ad57600080fd5b506101c16101bc3660046128c4565b610546565b60405190151581526020015b60405180910390f35b3480156101e257600080fd5b506101f66101f1366004612a3b565b610722565b005b34801561020457600080fd5b506101f6610213366004612b22565b610952565b34801561022457600080fd5b506101c1610233366004612b22565b6001600160a01b031660009081526004602052604090205460ff1690565b34801561025d57600080fd5b506101f661026c366004612b3f565b6109ed565b34801561027d57600080fd5b506101f6610ade565b34801561029257600080fd5b506101c16102a1366004612b77565b60009081526002602052604090206004015460ff1690565b3480156102c557600080fd5b506101f66102d4366004612bf7565b610b3e565b6101f66102e7366004612c70565b610e74565b3480156102f857600080fd5b5061030c610307366004612d1b565b610e93565b6040516101cd9190612d82565b34801561032557600080fd5b5061032e611286565b6040519081526020016101cd565b34801561034857600080fd5b5060065461032e565b34801561035d57600080fd5b506101f661036c366004612b22565b6112a3565b34801561037d57600080fd5b506101f661038c366004612b22565b61131f565b34801561039d57600080fd5b506101f66103ac366004612b22565b6113c0565b3480156103bd57600080fd5b506101f6611439565b3480156103d257600080fd5b506101f66103e1366004612b3f565b61149c565b3480156103f257600080fd5b506104066104013660046128c4565b611661565b6040516101cd9190612dc7565b34801561041f57600080fd5b506101f661042e366004612dea565b6116da565b34801561043f57600080fd5b506101f66118b0565b6101f6610456366004612e59565b6118dd565b34801561046757600080fd5b5061048c604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101cd9190612ec5565b3480156104a557600080fd5b506101f66104b4366004612ef8565b611bc7565b3480156104c557600080fd5b506104d96104d4366004612f45565b611c5a565b6040516101cd9190612f7e565b6101f66104f4366004612b3f565b611d75565b34801561050557600080fd5b50610519610514366004612b77565b611fdc565b6040516101cd9190613013565b34801561053257600080fd5b506101c16105413660046128c4565b61207d565b3360009081526001602052604081205460ff1661057657604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b03831660009081526003602090815260408083208584529091529020600281015460ff166105be5760405163fcd7a1b560e01b815260040160405180910390fd5b60008381526002602052604090206003015481546105dc91906130d4565b4211156105fc5760405163fcd7a1b560e01b815260040160405180910390fd5b600083815260026020819052604082200154908190036106545783856001600160a01b03166000805160206131cb833981519152600060405161064191815260200190565b60405180910390a360019250505061071c565b81600101546000036106795760405163fcd7a1b560e01b815260040160405180910390fd5b60018201805490600061068b836130e7565b919050555083856001600160a01b03166000805160206131cb83398151915284600101546040516106be91815260200190565b60405180910390a381600101546000036107155760028201805460ff1916905560405184906001600160a01b038716907f294e395c96ee31e4373f6b284b107e5341ffa80f2c53e582bc3cfb1f9efe500e90600090a35b6001925050505b92915050565b3360009081526001602052604090205460ff1661075257604051637bfa4b9f60e01b815260040160405180910390fd5b8351855114158061076557508251855114155b8061077257508151855114155b8061077f57508051855114155b1561079d5760405163512509d360e11b815260040160405180910390fd5b60005b855181101561094a578481815181106107bb576107bb6130fe565b6020026020010151600060020160008884815181106107dc576107dc6130fe565b602002602001015181526020019081526020016000206001018190555083818151811061080b5761080b6130fe565b60200260200101516000600201600088848151811061082c5761082c6130fe565b602002602001015181526020019081526020016000206002018190555082818151811061085b5761085b6130fe565b60200260200101516000600201600088848151811061087c5761087c6130fe565b60200260200101518152602001908152602001600020600301819055508181815181106108ab576108ab6130fe565b6020026020010151600060020160008884815181106108cc576108cc6130fe565b6020026020010151815260200190815260200160002060040160006101000a81548160ff02191690831515021790555085818151811061090e5761090e6130fe565b60200260200101517fa7c3f5f04f0c05ad82fcdf81039da5a01bf41ce2769b7b347afa43bb65e4426660405160405180910390a26001016107a0565b505050505050565b6000546001600160a01b0316331461097d576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b0381166109a45760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038116600081815260016020526040808220805460ff19169055517fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f9190a250565b3360009081526001602052604090205460ff16610a1d57604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b03821660009081526004602052604090205460ff16610a565760405163350b944160e11b815260040160405180910390fd5b60008381526002602090815260408083206001600160a01b0386168085529252909120829055610a955760008381526002602052604090206001018190555b816001600160a01b0316837f376716bd86293ff8b34061b9af3cac5116f15e0f2cbf689d822b6d6d7b1eeca983604051610ad191815260200190565b60405180910390a3505050565b6000546001600160a01b03163314610b09576040516330cd747160e01b815260040160405180910390fd5b6005805460ff191690556040517fa45f47fdea8a1efdd9029a5691c7f759c32b7c698632b563573e155625d1693390600090a1565b6000610b48612137565b805490915060ff600160401b82041615906001600160401b0316600081158015610b6f5750825b90506000826001600160401b03166001148015610b8b5750303b155b905081158015610b99575080155b15610bb75760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610be157845460ff60401b1916600160401b1785555b6001600160a01b038816610c085760405163d92e233d60e01b815260040160405180910390fd5b610c10612160565b610c18612168565b600080546001600160a01b0319166001600160a01b038a1617815560016006556005805460ff191690555b8751811015610d315760006001600160a01b0316888281518110610c6957610c696130fe565b60200260200101516001600160a01b031614610d29576001600060010160008a8481518110610c9a57610c9a6130fe565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550878181518110610ceb57610ceb6130fe565b60200260200101516001600160a01b03167f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e33960405160405180910390a25b600101610c43565b5060005b8651811015610e235760006001600160a01b0316878281518110610d5b57610d5b6130fe565b60200260200101516001600160a01b031614610e1b57600160006004016000898481518110610d8c57610d8c6130fe565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908315150217905550868181518110610ddd57610ddd6130fe565b60200260200101516001600160a01b03167fd1be2e90bd3d24839d9dd94ad871068e1f9688b02fa43f2a62c9975dfa9de2d760405160405180910390a25b600101610d35565b508315610e6a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b610e7c612178565b610e858261221d565b610e8f828261224b565b5050565b3360009081526001602052604090205460609060ff16610ec657604051637bfa4b9f60e01b815260040160405180910390fd5b8151835114610ee85760405163512509d360e11b815260040160405180910390fd5b600083516001600160401b03811115610f0357610f036128f0565b604051908082528060200260200182016040528015610f2c578160200160208202803683370190505b50905060005b845181101561127e576000806003016000878481518110610f5557610f556130fe565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000868481518110610f9157610f916130fe565b6020026020010151815260200190815260200160002090508060020160009054906101000a900460ff16610fe9576000838381518110610fd357610fd36130fe565b9115156020928302919091019091015250611276565b60006002016000868481518110611002576110026130fe565b6020026020010151815260200190815260200160002060030154816000015461102b91906130d4565b421115611046576000838381518110610fd357610fd36130fe565b6000806002016000878581518110611060576110606130fe565b602002602001015181526020019081526020016000206002015490508060000361111257858381518110611096576110966130fe565b60200260200101518784815181106110b0576110b06130fe565b60200260200101516001600160a01b03166000805160206131cb83398151915260006040516110e191815260200190565b60405180910390a360018484815181106110fd576110fd6130fe565b91151560209283029190910190910152611273565b816001015460000361114b576000848481518110611132576111326130fe565b6020026020010190151590811515815250505050611276565b60018201805490600061115d836130e7565b9190505550858381518110611174576111746130fe565b602002602001015187848151811061118e5761118e6130fe565b60200260200101516001600160a01b03166000805160206131cb83398151915284600101546040516111c291815260200190565b60405180910390a3816001015460000361124e5760028201805460ff1916905585518690849081106111f6576111f66130fe565b6020026020010151878481518110611210576112106130fe565b60200260200101516001600160a01b03167f294e395c96ee31e4373f6b284b107e5341ffa80f2c53e582bc3cfb1f9efe500e60405160405180910390a35b6001848481518110611262576112626130fe565b911515602092830291909101909101525b50505b600101610f32565b509392505050565b600061129061230d565b506000805160206131eb83398151915290565b3360009081526001602052604090205460ff166112d357604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b038116600081815260046020526040808220805460ff19166001179055517fd1be2e90bd3d24839d9dd94ad871068e1f9688b02fa43f2a62c9975dfa9de2d79190a250565b6000546001600160a01b0316331461134a576040516330cd747160e01b815260040160405180910390fd5b6001600160a01b0381166113715760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0381166000818152600160208190526040808320805460ff1916909217909155517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e3399190a250565b3360009081526001602052604090205460ff166113f057604051637bfa4b9f60e01b815260040160405180910390fd5b6001600160a01b038116600081815260046020526040808220805460ff19169055517fbea12876694c4055c71f74308f752b9027cf3d554194000a366abddfc239a3069190a250565b6000546001600160a01b03163314611464576040516330cd747160e01b815260040160405180910390fd5b6005805460ff191660011790556040517f9e87fac88ff661f02d44f95383c817fece4bce600a3dab7a54406878b965e75290600090a1565b6114a4612356565b60055460ff16156114c85760405163ab35696f60e01b815260040160405180910390fd5b600083815260026020526040902060040154839060ff166114fc5760405163ab4142cf60e01b815260040160405180910390fd5b6040516331a9108f60e11b81526004810183905233906001600160a01b03851690636352211e90602401602060405180830381865afa158015611543573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115679190613114565b6001600160a01b03161461158e5760405163fcd7a1b560e01b815260040160405180910390fd5b6040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b038416906323b872dd90606401600060405180830381600087803b1580156115dc57600080fd5b505af11580156115f0573d6000803e3d6000fd5b505050506115fe338561238e565b604080516001600160a01b038516815260208101849052859133917fd0de3e759b6d8ae4ab8dfd56f0869b691034bf2f14b896155287e5cd61d66a70910160405180910390a35061165c600160008051602061320b83398151915255565b505050565b611687604051806060016040528060008152602001600081526020016000151581525090565b506001600160a01b03821660009081526003602090815260408083208484528252918290208251606081018452815481526001820154928101929092526002015460ff1615159181019190915292915050565b3360009081526001602052604090205460ff1661170a57604051637bfa4b9f60e01b815260040160405180910390fd5b805183511461172c5760405163512509d360e11b815260040160405180910390fd5b6001600160a01b03821660009081526004602052604090205460ff166117655760405163350b944160e11b815260040160405180910390fd5b60005b83518110156118aa57818181518110611783576117836130fe565b6020026020010151600060020160008684815181106117a4576117a46130fe565b602090810291909101810151825281810192909252604090810160009081206001600160a01b0388168083529352209190915561182c578181815181106117ed576117ed6130fe565b60200260200101516000600201600086848151811061180e5761180e6130fe565b60200260200101518152602001908152602001600020600101819055505b826001600160a01b0316848281518110611848576118486130fe565b60200260200101517f376716bd86293ff8b34061b9af3cac5116f15e0f2cbf689d822b6d6d7b1eeca9848481518110611883576118836130fe565b602002602001015160405161189a91815260200190565b60405180910390a3600101611768565b50505050565b6000546001600160a01b031633146118db576040516330cd747160e01b815260040160405180910390fd5b565b6118e5612356565b60055460ff16156119095760405163ab35696f60e01b815260040160405180910390fd5b6001600160a01b03821660009081526004602052604090205460ff166119425760405163350b944160e11b815260040160405180910390fd5b6000805b8451811015611a655760006002016000868381518110611968576119686130fe565b60209081029190910181015182528101919091526040016000206004015460ff166119a65760405163ab4142cf60e01b815260040160405180910390fd5b6001600160a01b0384166119f957600060020160008683815181106119cd576119cd6130fe565b6020026020010151815260200190815260200160002060010154826119f291906130d4565b9150611a5d565b60006002016000868381518110611a1257611a126130fe565b602002602001015181526020019081526020016000206000016000856001600160a01b03166001600160a01b031681526020019081526020016000205482611a5a91906130d4565b91505b600101611946565b50808214611a865760405163cd1c886760e01b815260040160405180910390fd5b6001600160a01b038316611ab957813414611ab45760405163cd1c886760e01b815260040160405180910390fd5b611b32565b6040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b038416906323b872dd906064016020604051808303816000875af1158015611b0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b309190613131565b505b60005b8451811015611b6957611b6133868381518110611b5457611b546130fe565b602002602001015161238e565b600101611b35565b50336001600160a01b03167f2be07a645f06bfa8b189b4f0aba9bf2109d098d03cbede0449641495bba5d53d858585604051611ba79392919061314e565b60405180910390a25061165c600160008051602061320b83398151915255565b3360009081526001602052604090205460ff16611bf757604051637bfa4b9f60e01b815260040160405180910390fd5b600085815260026020819052604080832060018101889055918201869055600382018590556004909101805460ff19168415151790555186917fa7c3f5f04f0c05ad82fcdf81039da5a01bf41ce2769b7b347afa43bb65e4426691a25050505050565b6060600082516001600160401b03811115611c7757611c776128f0565b604051908082528060200260200182016040528015611cce57816020015b611cbb604051806060016040528060008152602001600081526020016000151581525090565b815260200190600190039081611c955790505b50905060005b835181101561127e576001600160a01b03851660009081526003602052604081208551909190869084908110611d0c57611d0c6130fe565b60209081029190910181015182528181019290925260409081016000208151606081018352815481526001820154938101939093526002015460ff161515908201528251839083908110611d6257611d626130fe565b6020908102919091010152600101611cd4565b611d7d612356565b60055460ff1615611da15760405163ab35696f60e01b815260040160405180910390fd5b600083815260026020526040902060040154839060ff16611dd55760405163ab4142cf60e01b815260040160405180910390fd5b6001600160a01b03831660009081526004602052604090205460ff16611e0e5760405163350b944160e11b815260040160405180910390fd5b60006001600160a01b038416611e765750600084815260026020526040902060010154348114611e515760405163cd1c886760e01b815260040160405180910390fd5b348314611e715760405163cd1c886760e01b815260040160405180910390fd5b611f33565b5060008481526002602090815260408083206001600160a01b0387168452909152902054828114611eba5760405163cd1c886760e01b815260040160405180910390fd5b6040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b038516906323b872dd906064016020604051808303816000875af1158015611f0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f319190613131565b505b611f3d338661238e565b600085815260026020526040812060030154611f5990426130d4565b6000878152600260208181526040928390209091015482516001600160a01b038a16815291820188905281830152606081018390529051919250879133917f180fe4b156a592a405cdd866f58883063db683348215e97cf864d6bf9679261c919081900360800190a350505061165c600160008051602061320b83398151915255565b6120196040518060c00160405280600081526020016000815260200160001515815260200160608152602001606081526020016000151581525090565b60008281526002602052604081209080612032856124e2565b6040805160c08101825260028701548082526003880154602083015260049097015460ff1615159181019190915260608101929092526080820152921560a084015250909392505050565b6001600160a01b038216600090815260036020908152604080832084845282528083208151606081018352815481526001820154938101939093526002015460ff1615159082018190526120d557600091505061071c565b60008381526002602052604090206003015481516120f391906130d4565b42111561210457600091505061071c565b600083815260026020819052604082200154908190036121295760019250505061071c565b50602001511515905061071c565b6000807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0061071c565b6118db612690565b612170612690565b6118db6126b5565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806121ff57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166121f36000805160206131eb833981519152546001600160a01b031690565b6001600160a01b031614155b156118db5760405163703e46dd60e11b815260040160405180910390fd5b6000546001600160a01b03163314612248576040516330cd747160e01b815260040160405180910390fd5b50565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156122a5575060408051601f3d908101601f191682019092526122a29181019061317c565b60015b6122d257604051634c9c8ce360e01b81526001600160a01b03831660048201526024015b60405180910390fd5b6000805160206131eb833981519152811461230357604051632a87526960e21b8152600481018290526024016122c9565b61165c83836126bd565b306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146118db5760405163703e46dd60e11b815260040160405180910390fd5b60008051602061320b83398151915280546001190161238857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b6001600160a01b03821660009081526003602081815260408084208585528252808420600292839052908420918201549190920154919290919082900361241d57600283015460ff1680156123ef575082546123eb9082906130d4565b4211155b156123fb575050505050565b428355600060018085019190915560028401805460ff191690911790556124c7565b600283015460ff16801561243d575082546124399082906130d4565b4211155b156124ac578183600101600082825461245691906130d4565b9091555050600183015460408051848152602081019290925285916001600160a01b038816917fb76abe3c068fccae7ac0f9377f48f7261dcf952179a37060c5de877a493e67b7910160405180910390a36124c7565b428355600180840183905560028401805460ff191690911790555b5050505050565b600160008051602061320b83398151915255565b600080805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec54606091829160ff168015612532575060008481526002602052604090206001015415155b15612545578061254181613195565b9150505b806001600160401b0381111561255d5761255d6128f0565b604051908082528060200260200182016040528015612586578160200160208202803683370190505b509250806001600160401b038111156125a1576125a16128f0565b6040519080825280602002602001820160405280156125ca578160200160208202803683370190505b50600080805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec549193509060ff16801561261a575060008581526002602052604090206001015415155b15612689576000848281518110612633576126336130fe565b6001600160a01b039092166020928302919091018201526000868152600290915260409020600101548351849083908110612670576126706130fe565b60209081029190910101528061268581613195565b9150505b5050915091565b612698612713565b6118db57604051631afcd79f60e31b815260040160405180910390fd5b6124ce612690565b6126c68261272d565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a280511561270b5761165c8282612792565b610e8f612808565b600061271d612137565b54600160401b900460ff16919050565b806001600160a01b03163b60000361276357604051634c9c8ce360e01b81526001600160a01b03821660048201526024016122c9565b6000805160206131eb83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b6060600080846001600160a01b0316846040516127af91906131ae565b600060405180830381855af49150503d80600081146127ea576040519150601f19603f3d011682016040523d82523d6000602084013e6127ef565b606091505b50915091506127ff858383612827565b95945050505050565b34156118db5760405163b398979f60e01b815260040160405180910390fd5b60608261283c5761283782612886565b61287f565b815115801561285357506001600160a01b0384163b155b1561287c57604051639996b31560e01b81526001600160a01b03851660048201526024016122c9565b50805b9392505050565b8051156128965780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b6001600160a01b038116811461224857600080fd5b600080604083850312156128d757600080fd5b82356128e2816128af565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561292e5761292e6128f0565b604052919050565b60006001600160401b0382111561294f5761294f6128f0565b5060051b60200190565b600082601f83011261296a57600080fd5b813561297d61297882612936565b612906565b8082825260208201915060208360051b86010192508583111561299f57600080fd5b602085015b838110156129bc5780358352602092830192016129a4565b5095945050505050565b801515811461224857600080fd5b600082601f8301126129e557600080fd5b81356129f361297882612936565b8082825260208201915060208360051b860101925085831115612a1557600080fd5b602085015b838110156129bc578035612a2d816129c6565b835260209283019201612a1a565b600080600080600060a08688031215612a5357600080fd5b85356001600160401b03811115612a6957600080fd5b612a7588828901612959565b95505060208601356001600160401b03811115612a9157600080fd5b612a9d88828901612959565b94505060408601356001600160401b03811115612ab957600080fd5b612ac588828901612959565b93505060608601356001600160401b03811115612ae157600080fd5b612aed88828901612959565b92505060808601356001600160401b03811115612b0957600080fd5b612b15888289016129d4565b9150509295509295909350565b600060208284031215612b3457600080fd5b813561287f816128af565b600080600060608486031215612b5457600080fd5b833592506020840135612b66816128af565b929592945050506040919091013590565b600060208284031215612b8957600080fd5b5035919050565b600082601f830112612ba157600080fd5b8135612baf61297882612936565b8082825260208201915060208360051b860101925085831115612bd157600080fd5b602085015b838110156129bc578035612be9816128af565b835260209283019201612bd6565b600080600060608486031215612c0c57600080fd5b8335612c17816128af565b925060208401356001600160401b03811115612c3257600080fd5b612c3e86828701612b90565b92505060408401356001600160401b03811115612c5a57600080fd5b612c6686828701612b90565b9150509250925092565b60008060408385031215612c8357600080fd5b8235612c8e816128af565b915060208301356001600160401b03811115612ca957600080fd5b8301601f81018513612cba57600080fd5b80356001600160401b03811115612cd357612cd36128f0565b612ce6601f8201601f1916602001612906565b818152866020838501011115612cfb57600080fd5b816020840160208301376000602083830101528093505050509250929050565b60008060408385031215612d2e57600080fd5b82356001600160401b03811115612d4457600080fd5b612d5085828601612b90565b92505060208301356001600160401b03811115612d6c57600080fd5b612d7885828601612959565b9150509250929050565b602080825282518282018190526000918401906040840190835b81811015612dbc5783511515835260209384019390920191600101612d9c565b509095945050505050565b81518152602080830151908201526040808301511515908201526060810161071c565b600080600060608486031215612dff57600080fd5b83356001600160401b03811115612e1557600080fd5b612e2186828701612959565b9350506020840135612e32816128af565b915060408401356001600160401b03811115612e4d57600080fd5b612c6686828701612959565b600080600060608486031215612e6e57600080fd5b83356001600160401b03811115612e8457600080fd5b612e9086828701612959565b9350506020840135612b66816128af565b60005b83811015612ebc578181015183820152602001612ea4565b50506000910152565b6020815260008251806020840152612ee4816040850160208701612ea1565b601f01601f19169190910160400192915050565b600080600080600060a08688031215612f1057600080fd5b853594506020860135935060408601359250606086013591506080860135612f37816129c6565b809150509295509295909350565b60008060408385031215612f5857600080fd5b8235612f63816128af565b915060208301356001600160401b03811115612d6c57600080fd5b602080825282518282018190526000918401906040840190835b81811015612dbc57612fc183855180518252602080820151908301526040908101511515910152565b6020939093019260609290920191600101612f98565b600081518084526020840193506020830160005b82811015613009578151865260209586019590910190600101612feb565b5093949350505050565b60208152600060e082018351602084015260208401516040840152604084015115156060840152606084015160c0608085015281815180845261010086019150602083019350600092505b808310156130895783516001600160a01b03168252602093840193600193909301929091019061305e565b506080860151858203601f190160a087015292506130a78184612fd7565b9250505060a084015161127e60c085018215159052565b634e487b7160e01b600052601160045260246000fd5b8082018082111561071c5761071c6130be565b6000816130f6576130f66130be565b506000190190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561312657600080fd5b815161287f816128af565b60006020828403121561314357600080fd5b815161287f816129c6565b6060815260006131616060830186612fd7565b6001600160a01b039490941660208301525060400152919050565b60006020828403121561318e57600080fd5b5051919050565b6000600182016131a7576131a76130be565b5060010190565b600082516131c0818460208701612ea1565b919091019291505056fe2ccc6c74b339e9d58b89aa6bb58d0519712aeff106f7981d466f54572cb88b42360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a26469706673582212205360a02460f8e8d4dfce4cfc45d45f74b6c93829f4b3e42714bf9ccaa698894a64736f6c634300081c0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
