{
  "contractName": "TestStorageManagerV2",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "agreementReference",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "AgreementFundsDeposited",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "agreementReference",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "AgreementFundsPayout",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "agreementReference",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "AgreementFundsWithdrawn",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "agreementReference",
          "type": "bytes32"
        }
      ],
      "name": "AgreementStopped",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "provider",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "period",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "uint128",
          "name": "price",
          "type": "uint128"
        }
      ],
      "name": "BillingPlanSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "provider",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes32[]",
          "name": "message",
          "type": "bytes32[]"
        }
      ],
      "name": "MessageEmitted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "bytes32[]",
          "name": "dataReference",
          "type": "bytes32[]"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "agreementCreator",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "provider",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "size",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "billingPeriod",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "uint128",
          "name": "billingPrice",
          "type": "uint128"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "availableFunds",
          "type": "uint256"
        }
      ],
      "name": "NewAgreement",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "Paused",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "provider",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "capacity",
          "type": "uint64"
        }
      ],
      "name": "TotalCapacitySet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "Unpaused",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "bytes32[]",
          "name": "dataReference",
          "type": "bytes32[]"
        },
        {
          "internalType": "address",
          "name": "provider",
          "type": "address"
        }
      ],
      "name": "depositFunds",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32[]",
          "name": "message",
          "type": "bytes32[]"
        }
      ],
      "name": "emitMessage",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32[]",
          "name": "dataReference",
          "type": "bytes32[]"
        },
        {
          "internalType": "address",
          "name": "creator",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "getAgreementReference",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "storer",
          "type": "address"
        }
      ],
      "name": "hasUtilizedCapacity",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "isWhitelistedProvider",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "isWhitelistedToken",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32[]",
          "name": "dataReference",
          "type": "bytes32[]"
        },
        {
          "internalType": "address",
          "name": "provider",
          "type": "address"
        },
        {
          "internalType": "uint64",
          "name": "size",
          "type": "uint64"
        },
        {
          "internalType": "uint64",
          "name": "billingPeriod",
          "type": "uint64"
        },
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "internalType": "bytes32[][]",
          "name": "dataReferencesOfAgreementToPayOut",
          "type": "bytes32[][]"
        },
        {
          "internalType": "address[]",
          "name": "creatorsOfAgreementToPayOut",
          "type": "address[]"
        },
        {
          "internalType": "address",
          "name": "tokenOfAgreementsToPayOut",
          "type": "address"
        }
      ],
      "name": "newAgreement",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "offerRegistry",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "utilizedCapacity",
          "type": "uint64"
        },
        {
          "internalType": "uint64",
          "name": "totalCapacity",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "pause",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "paused",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32[][]",
          "name": "dataReferencesOfAgreementToPayOut",
          "type": "bytes32[][]"
        },
        {
          "internalType": "address[]",
          "name": "creatorsOfAgreementToPayOut",
          "type": "address[]"
        },
        {
          "internalType": "address",
          "name": "tokensOfAgreementsToPayOut",
          "type": "address"
        },
        {
          "internalType": "address payable",
          "name": "provider",
          "type": "address"
        }
      ],
      "name": "payoutFunds",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64[][]",
          "name": "billingPeriods",
          "type": "uint64[][]"
        },
        {
          "internalType": "uint128[][]",
          "name": "billingPrices",
          "type": "uint128[][]"
        },
        {
          "internalType": "address[]",
          "name": "tokens",
          "type": "address[]"
        }
      ],
      "name": "setBillingPlans",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "capacity",
          "type": "uint64"
        },
        {
          "internalType": "uint64[][]",
          "name": "billingPeriods",
          "type": "uint64[][]"
        },
        {
          "internalType": "uint128[][]",
          "name": "billingPrices",
          "type": "uint128[][]"
        },
        {
          "internalType": "address[]",
          "name": "tokens",
          "type": "address[]"
        },
        {
          "internalType": "bytes32[]",
          "name": "message",
          "type": "bytes32[]"
        }
      ],
      "name": "setOffer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "capacity",
          "type": "uint64"
        }
      ],
      "name": "setTotalCapacity",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "providerAddress",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "isWhiteListed",
          "type": "bool"
        }
      ],
      "name": "setWhitelistedProvider",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "isWhiteListed",
          "type": "bool"
        }
      ],
      "name": "setWhitelistedTokens",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "terminateOffer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "unpause",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32[]",
          "name": "dataReference",
          "type": "bytes32[]"
        },
        {
          "internalType": "address",
          "name": "provider",
          "type": "address"
        },
        {
          "internalType": "address[]",
          "name": "tokens",
          "type": "address[]"
        },
        {
          "internalType": "uint256[]",
          "name": "amounts",
          "type": "uint256[]"
        }
      ],
      "name": "withdrawFunds",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getVersion",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"agreementReference\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"AgreementFundsDeposited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"agreementReference\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"AgreementFundsPayout\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"agreementReference\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"AgreementFundsWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"agreementReference\",\"type\":\"bytes32\"}],\"name\":\"AgreementStopped\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"period\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"price\",\"type\":\"uint128\"}],\"name\":\"BillingPlanSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32[]\",\"name\":\"message\",\"type\":\"bytes32[]\"}],\"name\":\"MessageEmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32[]\",\"name\":\"dataReference\",\"type\":\"bytes32[]\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"agreementCreator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"size\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"billingPeriod\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"billingPrice\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"availableFunds\",\"type\":\"uint256\"}],\"name\":\"NewAgreement\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"capacity\",\"type\":\"uint64\"}],\"name\":\"TotalCapacitySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"dataReference\",\"type\":\"bytes32[]\"},{\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"}],\"name\":\"depositFunds\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"message\",\"type\":\"bytes32[]\"}],\"name\":\"emitMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"dataReference\",\"type\":\"bytes32[]\"},{\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getAgreementReference\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"storer\",\"type\":\"address\"}],\"name\":\"hasUtilizedCapacity\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isWhitelistedProvider\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isWhitelistedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"dataReference\",\"type\":\"bytes32[]\"},{\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"size\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"billingPeriod\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[][]\",\"name\":\"dataReferencesOfAgreementToPayOut\",\"type\":\"bytes32[][]\"},{\"internalType\":\"address[]\",\"name\":\"creatorsOfAgreementToPayOut\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"tokenOfAgreementsToPayOut\",\"type\":\"address\"}],\"name\":\"newAgreement\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"offerRegistry\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"utilizedCapacity\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"totalCapacity\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[][]\",\"name\":\"dataReferencesOfAgreementToPayOut\",\"type\":\"bytes32[][]\"},{\"internalType\":\"address[]\",\"name\":\"creatorsOfAgreementToPayOut\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"tokensOfAgreementsToPayOut\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"provider\",\"type\":\"address\"}],\"name\":\"payoutFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64[][]\",\"name\":\"billingPeriods\",\"type\":\"uint64[][]\"},{\"internalType\":\"uint128[][]\",\"name\":\"billingPrices\",\"type\":\"uint128[][]\"},{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"setBillingPlans\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"capacity\",\"type\":\"uint64\"},{\"internalType\":\"uint64[][]\",\"name\":\"billingPeriods\",\"type\":\"uint64[][]\"},{\"internalType\":\"uint128[][]\",\"name\":\"billingPrices\",\"type\":\"uint128[][]\"},{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"message\",\"type\":\"bytes32[]\"}],\"name\":\"setOffer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"capacity\",\"type\":\"uint64\"}],\"name\":\"setTotalCapacity\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"providerAddress\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isWhiteListed\",\"type\":\"bool\"}],\"name\":\"setWhitelistedProvider\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"isWhiteListed\",\"type\":\"bool\"}],\"name\":\"setWhitelistedTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"terminateOffer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"dataReference\",\"type\":\"bytes32[]\"},{\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"withdrawFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"depositFunds(address,uint256,bytes32[],address)\":{\"details\":\"- depositing funds to Agreement that is linked to terminated Offer is not possible - depositing funds to Agreement that already is expired (eq. ran out of funds at some point) is not possible. Call NewAgreement instead. The data needs to be re-provided though. - if the token is not the native currency, then the contract must be first be given allowance to transfer tokens in it's posession.\",\"params\":{\"dataReference\":\"data reference where should be deposited funds.\",\"provider\":\"the address of the provider of the Offer.\"}},\"emitMessage(bytes32[])\":{\"params\":{\"message\":\"the Provider may send a message (e.g. his nodeID). Message should be structured such that the first two bits specify the message type, followed with the message). 0x01 == nodeID\"}},\"getAgreementReference(bytes32[],address,address)\":{\"params\":{\"creator\":\"the creator of the agreement\",\"dataReference\":\"the dataReference of the agreement\",\"token\":\"the token, which is used as a means of payment for the agreement.\"}},\"newAgreement(bytes32[],address,uint64,uint64,address,uint256,bytes32[][],address[],address)\":{\"details\":\"- The to-be-pinned data reference's size in MB (rounded up) must be equal in size to param size. - Provider can reject to pin data reference when it exceeds specified size. - The ownership of Agreement is enforced with agreementReference structure which is calculated as: hash(msg.sender, dataReference) - if the token is not the native currency, then the contract must be first be given allowance to transfer tokens in it's posession. Contains execution of the transferFrom on external token contract before all the stage changes are performed. As a result if a token will perform a callback to the StorageManager, it may lead to a reentrancy attack. Hence additional attention should be paid while reviewing this method of a token before whitelisting.\",\"params\":{\"amount\":\"if token is set, this is the amount of tokens that is transfered\",\"billingPeriod\":\"the chosen period for billing.\",\"creatorsOfAgreementToPayOut\":\"the creators of agreements which must be payed out. Pass this when there is no capacity. The order should match the order of dataReferenceOfAgreementToPayOut and tokensOfAgreementToPayOut\",\"dataReference\":\"the reference to an Data Source, can be several things.\",\"dataReferencesOfAgreementToPayOut\":\"the data references of agreements which must be payed out. Pass this when there is no capacity. Order should equal order of creatorsOfAgreementToPayOut and tokensOfAgreementToPayOut\",\"provider\":\"the provider from which is proposed to take a Offer.\",\"size\":\"the size of the to-be-pinned file in MB (rounded up).\",\"token\":\"the token in which you want to make the agreement. By convention: address(0) is the native currency\",\"tokenOfAgreementsToPayOut\":\"the token address of agreements which must be payed out. Pass this when there is no capacity.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pause()\":{\"details\":\"Called by a pauser to pause, triggers stopped state.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"payoutFunds(bytes32[][],address[],address,address)\":{\"details\":\"- Provider must call an expired agreement themselves as soon as the agreement is expired, to add back the capacity to their Offer. - Payout can be triggered by other events as well. Like in newAgreement call with either existing agreement or when other Agreements are passed to the agreementsReferencesToBePayedOut array.\",\"params\":{\"creatorsOfAgreementToPayOut\":\"the creators that made the agreement to pay\",\"dataReferencesOfAgreementToPayOut\":\"the data references of the agreement to pay\",\"tokensOfAgreementsToPayOut\":\"the tokens of the agreement to pay out\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"setBillingPlans(uint64[][],uint128[][],address[])\":{\"details\":\"- setting the price to 0 means that a particular period is not offered, which can be used to remove a period from the offer. - make sure that any period * prices does not cause an overflow, as this can never be accepted and hence is pointless. - the length of tokens array must always be one shorter than the length of the boundaries array (otherwise you get an array index out of bounds error) - make sure that the length of billingPeriods and billingPrices is of equal length. If billingPeriods is longer than prices => array index out of bounds error. If prices longer than period => the prices in higher indeces won't be considered\",\"params\":{\"billingPeriods\":\"the offered periods. Length must be equal to billingPrices. The first index of the multi dem array corresponds with the address in tokens at the same index\",\"billingPrices\":\"the prices for the offered periods. Each entry at index corresponds to the same index at periods. 0 means that the particular period is not offered. The first index of the multi dem array corresponds with the address in tokens at the same index\"}},\"setOffer(uint64,uint64[][],uint128[][],address[],bytes32[])\":{\"details\":\"- Use this function when initiating an Offer or when the users wants to change more than one parameter at once. - make sure that any period * prices does not cause an overflow, as this can never be accepted (REF_MAX_PRICE) and hence is pointless - only whitelisted tokens are allowed to make an offer for - if there are two tokens, and two billingPrice/periods pairs per token, then boundaries[0] == 1. This makes the first two billingPeriod/prices pairs to apply to the first token ([tokens[0]]) and the second pairs to the second token. - make sure that the length of billingPeriods and billingPrices is of equal length. If billingPeriods is longer than prices => array index out of bounds error. If prices longer than period => the prices in higher indeces won't be considered\",\"params\":{\"billingPeriods\":\"the offered periods. Length must be equal to the length of billingPrices. The first index of the multi dem array corresponds with the address in tokens at the same index\",\"billingPrices\":\"the prices for the offered periods. Each entry at index corresponds to the same index at periods. The first index of the multi dem array corresponds with the address in tokens at the same index\",\"capacity\":\"the amount of MB offered. If already active before and set to 0, existing contracts can't be prolonged / re-started, no new contracts can be started.\",\"message\":\"the Provider may include a message (e.g. his nodeID).  Message should be structured such that the first two bits specify the message type, followed with the message). 0x01 == nodeID\",\"tokens\":\"the tokens for which an offer is made. By convention, address(0) is the native currency.\"}},\"setTotalCapacity(uint64)\":{\"params\":{\"capacity\":\"the new capacity\"}},\"setWhitelistedProvider(address,bool)\":{\"params\":{\"isWhiteListed\":\"whether you want to whitelist the provider or put it from the whitelist.\",\"providerAddress\":\"the providerAddress from whom you want to set the whitelisted\"}},\"setWhitelistedTokens(address,bool)\":{\"params\":{\"isWhiteListed\":\"whether you want to whitelist the token or put it from the whitelist.\",\"token\":\"the token from whom you want to set the whitelisted\"}},\"terminateOffer()\":{\"details\":\"no new Agreement can be created and no existing Agreement can be prolonged. All existing Agreement are still valid for the amount of periods still deposited.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"unpause()\":{\"details\":\"Called by a pauser to unpause, returns to normal state.\"},\"withdrawFunds(bytes32[],address,address[],uint256[])\":{\"details\":\"- if amount is zero then all withdrawable funds are transferred (eq. all available funds minus funds for still non-payed out periods and current period) - if Agreement is terminated Consumer can withdraw all remaining funds - if the token is not the native currency, then the contract must be first be given allowance to transfer tokens in it's posession.\",\"params\":{\"amounts\":\"the value you want to withdraw for each token\",\"dataReference\":\"the data reference of agreement to be funds withdrawn from\",\"provider\":\"the address of the provider of the Offer.\",\"tokens\":\"the tokens in which to withdraw. By convention, address(0) is the native currency.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"depositFunds(address,uint256,bytes32[],address)\":{\"notice\":\">> FOR CONSUMERdeposits new funds to the Agreement.\"},\"emitMessage(bytes32[])\":{\"notice\":\">> FOR PROVIDER\"},\"getAgreementReference(bytes32[],address,address)\":{\"notice\":\"get the agreementReference. the agreementReference consists of the hash of the dataReference, msg.sender and the tokenAdddress, to allow: - multiple people to register an agreement for the same file - one person to register multiple agreements for the same file, but with different tokens - link the token to the agreement, such that we do the accounting properly\"},\"newAgreement(bytes32[],address,uint64,uint64,address,uint256,bytes32[][],address[],address)\":{\"notice\":\">> FOR CONSUMERnew Agreement for given Offer\"},\"payoutFunds(bytes32[][],address[],address,address)\":{\"notice\":\">> FOR PROVIDERpayout already earned funds of one or more Agreement\"},\"setBillingPlans(uint64[][],uint128[][],address[])\":{\"notice\":\">> FOR PROVIDERset the billing plans for an Offer.\"},\"setOffer(uint64,uint64[][],uint128[][],address[],bytes32[])\":{\"notice\":\">> FOR PROVIDERset the totalCapacity and billingPlans of a Offer.\"},\"setTotalCapacity(uint64)\":{\"notice\":\">> FOR PROVIDERsets total capacity of Offer.\"},\"setWhitelistedProvider(address,bool)\":{\"notice\":\"whitelist a provider or remove the provider from whitelist\"},\"setWhitelistedTokens(address,bool)\":{\"notice\":\"whitelist a token or remove the token from whitelist\"},\"terminateOffer()\":{\"notice\":\">> FOR PROVIDERstops the Offer. It sets the totalCapacity to 0 which indicates terminated Offer.\"},\"withdrawFunds(bytes32[],address,address[],uint256[])\":{\"notice\":\">> FOR CONSUMERwithdraw funds from Agreement.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/naz_dou/Documents/Projects/IovLabs/rif-marketplace-storage/contracts/tests/TestStorageManagerV2.sol\":\"TestStorageManagerV2\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/naz_dou/Documents/Projects/IovLabs/rif-marketplace-storage/contracts/StorageManager.sol\":{\"keccak256\":\"0xb39dec9f5da8aa5bf10ca169d3e1ea12d08678d2f9d999dcbd22f52711dab8f0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://07fab32db88ce5f2f79e08db9c81095fc398d8ce7ac8dde69e6885197396ebd1\",\"dweb:/ipfs/QmXHa2SsauGepF6TbDkGsMeqKYgxHsFKsrVWbvC8Cw5q1m\"]},\"/Users/naz_dou/Documents/Projects/IovLabs/rif-marketplace-storage/contracts/tests/TestStorageManagerV2.sol\":{\"keccak256\":\"0x8c0badbff6c52aa5520bbee1091e79e08eabb1e6eafd646c87cad3d9785dce16\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b35b83a4d57140a193110c4cec00378d9e0d5dc7ba179f67dfdb5b6fb63d4a91\",\"dweb:/ipfs/QmYcLP4bWGdJYd7zP5xUasFXL9FwcFgz6XKRdCPxLBNLCn\"]},\"@openzeppelin/contracts-ethereum-package/contracts/GSN/Context.sol\":{\"keccak256\":\"0xe81686511d62f18b2d9c693c2c94c0a789c690de63aa90e15451ebf65c5bfd3e\",\"urls\":[\"bzz-raw://1332ee1d2b096456bf2e5795b5871d0fed47be6a31c9a2f2cef9206a299565ea\",\"dweb:/ipfs/Qmdu1847Y4UL3gTjbLUManMGfxYEoyGPSodM3Br89SKzwx\"]},\"@openzeppelin/contracts-ethereum-package/contracts/Initializable.sol\":{\"keccak256\":\"0x9bfec92e36234ecc99b5d37230acb6cd1f99560233753162204104a4897e8721\",\"urls\":[\"bzz-raw://5cf7c208583d4d046d75bd99f5507412ab01cce9dd9f802ce9768a416d93ea2f\",\"dweb:/ipfs/QmcQS1BBMPpVEkXP3qzwSjxHNrqDek8YeR7xbVWDC9ApC7\"]},\"@openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol\":{\"keccak256\":\"0x04a69a78363214b4e3055db8e620bed222349f0c81e9d1cbe769eb849b69b73f\",\"urls\":[\"bzz-raw://b3115459376196d6c2c3817439c169d9b052b27b70e8ee2e28963cda760736da\",\"dweb:/ipfs/QmXaNF5rmcDSAzBiFMQjf979qb9xNXqD9eZtgo4uM9VEis\"]},\"@openzeppelin/contracts-ethereum-package/contracts/utils/Pausable.sol\":{\"keccak256\":\"0x2ad5473fe88d9ab30c6cd495ab8895daae8c4a48cf8231282a2d339387b35006\",\"urls\":[\"bzz-raw://a737c60474c063efc28e5922b6a1d073588c010eb67f883273d3ec29d8e52d6b\",\"dweb:/ipfs/QmWCeqeZhR45S1mcjPRYEMy1DCHMy9sXDfwYLPycFRh2Nk\"]},\"@openzeppelin/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x3b21f2c8d626de3b9925ae33e972d8bf5c8b1bffb3f4ee94daeed7d0679036e6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7f8d45329fecbf0836ad7543330c3ecd0f8d0ffa42d4016278c3eb2215fdcdfe\",\"dweb:/ipfs/QmXWLT7GcnHtA5NiD6MFi2CV3EWJY4wv5mLNnypqYDrxL3\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x5f02220344881ce43204ae4a6281145a67bc52c2bb1290a791857df3d19d78f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://24427744bd3e6cb73c17010119af12a318289c0253a4d9acb8576c9fb3797b08\",\"dweb:/ipfs/QmTLDqpKRBuxGxRAmjgXt9AkXyACW3MtKzi7PYjm5iMfGC\"]},\"@openzeppelin/contracts/token/ERC20/SafeERC20.sol\":{\"keccak256\":\"0xf12dfbe97e6276980b83d2830bb0eb75e0cf4f3e626c2471137f82158ae6a0fc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b3a849c2d95e85463909e5b5c920b13e7a11216ca14127085e16d22b9379d52a\",\"dweb:/ipfs/QmUg3CZDbCCcQdroEpexBy5ZFd5vD1UWijWQq9qHZjtJNQ\"]},\"@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xa6a15ddddcbf29d2922a1e0d4151b5d2d33da24b93cc9ebc12390e0d855532f8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7c119bcaecfa853d564ac88d312777f75fa1126a3bca88a3371adb0ad9f35cb0\",\"dweb:/ipfs/QmY9UPuXeSKq86Zh38fE43VGQPhKMN34mkuFSFqPcr6nvZ\"]}},\"version\":1}",
  "bytecode": "0x608060405234801561001057600080fd5b5061354b806100206000396000f3fe60806040526004361061014b5760003560e01c80638456cb59116100b6578063bf317abb1161006f578063bf317abb1461036b578063d245599e14610398578063dc4aac9e146103ab578063ec5cdf99146103cb578063f2fde38b146103eb578063f650ca741461040b5761014b565b80638456cb59146102b15780638da5cb5b146102c65780638f5c5fc8146102e85780639aad18ca14610316578063ab37f48614610336578063b5859693146103565761014b565b8063398887051161010857806339888705146102105780633f4ba83a146102305780635c975abb14610245578063715018a6146102675780638129fc1c1461027c57806382c4dba5146102915761014b565b80630d8e6e2c146101505780631f3477a51461017b5780632691c0851461019d5780632fd09ef9146101b0578063325b2941146101d057806337f4329d146101f0575b600080fd5b34801561015c57600080fd5b5061016561042b565b6040516101729190612c10565b60405180910390f35b34801561018757600080fd5b5061019b610196366004612778565b610447565b005b61019b6101ab36600461257f565b6106f6565b3480156101bc57600080fd5b5061019b6101cb3660046126e5565b6109f3565b3480156101dc57600080fd5b5061019b6101eb366004612662565b6109ff565b3480156101fc57600080fd5b5061019b61020b36600461298c565b610aa1565b34801561021c57600080fd5b5061019b61022b366004612547565b610b30565b34801561023c57600080fd5b5061019b610b90565b34801561025157600080fd5b5061025a610bf1565b6040516101729190612be8565b34801561027357600080fd5b5061019b610bfa565b34801561028857600080fd5b5061019b610c79565b34801561029d57600080fd5b5061019b6102ac366004612547565b610d0b565b3480156102bd57600080fd5b5061019b610d6b565b3480156102d257600080fd5b506102db610dcb565b6040516101729190612af7565b3480156102f457600080fd5b5061030861030336600461252b565b610dda565b604051610172929190613452565b34801561032257600080fd5b5061025a61033136600461252b565b610e00565b34801561034257600080fd5b5061025a61035136600461252b565b610e15565b34801561036257600080fd5b5061019b610e2a565b34801561037757600080fd5b5061038b610386366004612717565b610ee7565b6040516101729190612bf3565b61019b6103a6366004612863565b610f1e565b3480156103b757600080fd5b5061019b6103c63660046125e8565b611392565b3480156103d757600080fd5b5061025a6103e636600461252b565b6113d8565b3480156103f757600080fd5b5061019b61040636600461252b565b6113fe565b34801561041757600080fd5b5061019b610426366004612965565b6114b5565b6040805180820190915260028152612b1960f11b602082015290565b6001600160a01b038316600090815260c960205260408120905b83518110156106ee57600083828151811061047857fe5b60200260200101519050600085838151811061049057fe5b6020026020010151905060006104a7893384610ee7565b60008181526002808801602052604090912090810154919250906001600160401b03166104ef5760405162461bcd60e51b81526004016104e690613093565b60405180910390fd5b6002810154600090600160401b90046001600160801b03166105165750600181015461059d565b600282015482546040805160a0810182526001600160801b03808416808352600160801b9094046001600160401b03908116602084015260018801549383019390935291841660608201819052600160401b9094048216608082015261059a9392909202169061059490610589906115a0565b60018601549061164c565b9061164c565b90505b846105a6578094505b808511156105c65760405162461bcd60e51b81526004016104e690612e92565b60018201546105d5908661164c565b6001830155846105f75760405162461bcd60e51b81526004016104e690612ed3565b61060084611697565b15610687576000336001600160a01b03168660405161061e90612af4565b60006040518083038185875af1925050503d806000811461065b576040519150601f19603f3d011682016040523d82523d6000602084013e610660565b606091505b50509050806106815760405162461bcd60e51b81526004016104e69061331d565b5061069b565b61069b6001600160a01b03851633876116a4565b836001600160a01b0316837f579b45b1ee6c41a979ca183763f8a18021bb54fcd590cf1be2821e4abe31fd8e876040516106d59190612bf3565b60405180910390a3505060019093019250610461915050565b505050505050565b60975460ff16156107195760405162461bcd60e51b81526004016104e690613069565b6001600160a01b038116600090815260cb6020526040902054819060ff166107535760405162461bcd60e51b81526004016104e690613131565b6000610760843388610ee7565b6001600160a01b038716600090815260ca602052604090205490915060ff1661079b5760405162461bcd60e51b81526004016104e6906130e9565b6001600160a01b038316600090815260c9602052604090208054600160401b90046001600160401b03166107e15760405162461bcd60e51b81526004016104e690612deb565b600082815260028083016020526040909120908101546001600160401b031661081c5760405162461bcd60e51b81526004016104e690613093565b6002810154600160401b90046001600160801b031661084d5760405162461bcd60e51b81526004016104e69061317c565b80546001600160a01b038916600090815260018401602090815260408083206001600160401b03600160801b86041684529091529020546001600160801b039081169116146108ae5760405162461bcd60e51b81526004016104e69061301e565b600281015481546108d3916001600160801b03909116906001600160401b03166116ff565b6040805160a08101825283546001600160801b0380821683526001600160401b03600160801b9092048216602084015260018601549383019390935260028501549081166060830152600160401b9004909116608082015261094390610938906115a0565b60018401549061164c565b10156109615760405162461bcd60e51b81526004016104e690612e40565b600061096c89611697565b90508015610978573497505b60018201546109879089611739565b6001830155806109a6576109a66001600160a01b038a1633308b61175e565b886001600160a01b0316847f5ac5c9c49f143d64d36d4eb69c1624c8670cb426b3f952830187c279a51009cc8a6040516109e09190612bf3565b60405180910390a3505050505050505050565b6109fc81611785565b50565b60975460ff1615610a225760405162461bcd60e51b81526004016104e690613069565b33600081815260cb602052604090205460ff16610a515760405162461bcd60e51b81526004016104e690613131565b33600090815260c9602052604090208054600160401b90046001600160401b0316610a8e5760405162461bcd60e51b81526004016104e690612deb565b610a9a818686866117c9565b5050505050565b60975460ff1615610ac45760405162461bcd60e51b81526004016104e690613069565b33600081815260cb602052604090205460ff16610af35760405162461bcd60e51b81526004016104e690613131565b33600090815260c960205260409020610b0b876114b5565b610b17818787876117c9565b825115610b2757610b2783611785565b50505050505050565b610b38611870565b6065546001600160a01b03908116911614610b655760405162461bcd60e51b81526004016104e690613201565b6001600160a01b0391909116600090815260ca60205260409020805460ff1916911515919091179055565b610b98611870565b6065546001600160a01b03908116911614610bc55760405162461bcd60e51b81526004016104e690613201565b60975460ff16610be75760405162461bcd60e51b81526004016104e690612c43565b610bef611874565b565b60975460ff1690565b610c02611870565b6065546001600160a01b03908116911614610c2f5760405162461bcd60e51b81526004016104e690613201565b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b600054610100900460ff1680610c925750610c926118e0565b80610ca0575060005460ff16155b610cbc5760405162461bcd60e51b81526004016104e69061328a565b600054610100900460ff16158015610ce7576000805460ff1961ff0019909116610100171660011790555b610cef6118e6565b610cf7611964565b80156109fc576000805461ff001916905550565b610d13611870565b6065546001600160a01b03908116911614610d405760405162461bcd60e51b81526004016104e690613201565b6001600160a01b0391909116600090815260cb60205260409020805460ff1916911515919091179055565b610d73611870565b6065546001600160a01b03908116911614610da05760405162461bcd60e51b81526004016104e690613201565b60975460ff1615610dc35760405162461bcd60e51b81526004016104e690613069565b610bef6119e2565b6065546001600160a01b031690565b60c9602052600090815260409020546001600160401b0380821691600160401b90041682565b60cb6020526000908152604090205460ff1681565b60ca6020526000908152604090205460ff1681565b33600081815260cb602052604090205460ff16610e595760405162461bcd60e51b81526004016104e690613131565b33600090815260c9602052604090208054600160401b90046001600160401b0316610e965760405162461bcd60e51b81526004016104e690612deb565b805467ffffffffffffffff60401b1916815560405133907f7267987f11d91dd9b618677a5f4e5596eca75f9e97d880452c73c2dbd8ebfae390610edb90600090612bfc565b60405180910390a25050565b6000828483604051602001610efe93929190612a7f565b6040516020818303038152906040528051906020012090505b9392505050565b60975460ff1615610f415760405162461bcd60e51b81526004016104e690613069565b6001600160a01b038816600090815260cb602052604090205460ff16610f795760405162461bcd60e51b81526004016104e690613131565b6001600160a01b038816600090815260c9602052604090206001600160401b038716610fb75760405162461bcd60e51b81526004016104e690612c71565b6000886001600160401b031611610fe05760405162461bcd60e51b81526004016104e690612fd2565b8054600160401b90046001600160401b031661100e5760405162461bcd60e51b81526004016104e690612deb565b6001600160a01b038616600090815260ca602052604090205460ff166110465760405162461bcd60e51b81526004016104e690612d3d565b835115611059576110598484848c611a3b565b60006110668b3389610ee7565b6000818152600284810160205260409091200154909150600160401b90046001600160801b03161561113957604080516001808252818301909252606091816020015b60608152602001906001900390816110a957505060408051600180825281830190925291925060609190602080830190803683370190505090508c826000815181106110f157fe5b6020026020010181905250338160008151811061110a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505061113682828b8f611a3b565b50505b6001600160a01b038716600090815260018301602090815260408083206001600160401b038c1684529091529020546001600160801b03168061118e5760405162461bcd60e51b81526004016104e69061337e565b600082815260028401602052604090206111a789611697565b156111b0573497505b60018101546111bf9089611739565b60018201556111e06001600160401b038c166001600160801b0384166116ff565b816001015410156112035760405162461bcd60e51b81526004016104e690612f16565b60028101805467ffffffffffffffff19166001600160401b038d81169190911790915581546001600160801b0319166001600160801b0384161767ffffffffffffffff60801b1916600160801b918c1691909102178155611262611d6b565b6002820180546001600160801b0392909216600160401b02600160401b600160c01b03199092169190911790556001600160a01b038c16600090815260c96020526040902080549094506112c3906001600160401b03908116908d16611739565b845467ffffffffffffffff19166001600160401b0391821617808655600160401b81048216911611156113085760405162461bcd60e51b81526004016104e690612f85565b61131189611697565b61132a5761132a6001600160a01b038a1633308b61175e565b8b6001600160a01b0316336001600160a01b03167f8c1ead7cd014d31bcde974cc4762a98cce33de4fbda569fbcc73f8f276212fff8f8e8e878f886001015460405161137b96959493929190612b8e565b60405180910390a350505050505050505050505050565b6001600160a01b038116600090815260cb6020526040902054819060ff166113cc5760405162461bcd60e51b81526004016104e690613131565b610a9a85858585611a3b565b6001600160a01b0316600090815260c960205260409020546001600160401b0316151590565b611406611870565b6065546001600160a01b039081169116146114335760405162461bcd60e51b81526004016104e690613201565b6001600160a01b0381166114595760405162461bcd60e51b81526004016104e690612cc0565b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b60975460ff16156114d85760405162461bcd60e51b81526004016104e690613069565b33600081815260cb602052604090205460ff166115075760405162461bcd60e51b81526004016104e690613131565b6001600160401b03821661152d5760405162461bcd60e51b81526004016104e690613236565b33600081815260c9602052604090819020805467ffffffffffffffff60401b1916600160401b6001600160401b0387160217815590519091907f7267987f11d91dd9b618677a5f4e5596eca75f9e97d880452c73c2dbd8ebfae390611593908690612bfc565b60405180910390a2505050565b6000806115d083600001516001600160801b031684606001516001600160401b03166116ff90919063ffffffff16565b9050600061160484602001516001600160401b03166115fe86608001516001600160801b0316610594611d6b565b90611d6f565b9050600061161282846116ff565b90508460400151811115611644576116418361163b858860400151611d6f90919063ffffffff16565b906116ff565b90505b949350505050565b600061168e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611db1565b90505b92915050565b6001600160a01b03161590565b6116fa8363a9059cbb60e01b84846040516024016116c3929190612b2f565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611ddd565b505050565b60008261170e57506000611691565b8282028284828161171b57fe5b041461168e5760405162461bcd60e51b81526004016104e6906131c0565b60008282018381101561168e5760405162461bcd60e51b81526004016104e690612d06565b61177f846323b872dd60e01b8585856040516024016116c393929190612b0b565b50505050565b336001600160a01b03167f8e9ae80d46259102dfbf4ae6121dbe6548e85c8c0494163e8e0bf0e87bcd5876826040516117be9190612b7b565b60405180910390a250565b60005b8151811015610a9a5760005b8482815181106117e457fe5b6020026020010151518110156118675761185f8684848151811061180457fe5b602002602001015187858151811061181857fe5b6020026020010151848151811061182b57fe5b602002602001015187868151811061183f57fe5b6020026020010151858151811061185257fe5b6020026020010151611e6c565b6001016117d8565b506001016117cc565b3390565b60975460ff166118965760405162461bcd60e51b81526004016104e690612c43565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6118c9611870565b6040516118d69190612af7565b60405180910390a1565b303b1590565b600054610100900460ff16806118ff57506118ff6118e0565b8061190d575060005460ff16155b6119295760405162461bcd60e51b81526004016104e69061328a565b600054610100900460ff16158015611954576000805460ff1961ff0019909116610100171660011790555b61195c611f5b565b610cf7611fdc565b600054610100900460ff168061197d575061197d6118e0565b8061198b575060005460ff16155b6119a75760405162461bcd60e51b81526004016104e69061328a565b600054610100900460ff161580156119d2576000805460ff1961ff0019909116610100171660011790555b6119da611f5b565b610cf76120b6565b60975460ff1615611a055760405162461bcd60e51b81526004016104e690613069565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118c9611870565b6001600160a01b038116600090815260c96020526040812090805b86518160ff161015611cc0576000611a9b888360ff1681518110611a7657fe5b6020026020010151888460ff1681518110611a8d57fe5b602002602001015188610ee7565b60008181526002808701602052604090912090810154919250906001600160401b0316611ada5760405162461bcd60e51b81526004016104e690613093565b6002810154600160401b90046001600160801b0316611b0b5760405162461bcd60e51b81526004016104e6906132d8565b6040805160a08101825282546001600160801b0380821683526001600160401b03600160801b9092048216602084015260018501549383019390935260028401549081166060830152600160401b90049091166080820152600090611b6f906115a0565b90508015611cb5576001820154611b86908261164c565b6001830155611b958582611739565b60028301548354919650611bbb916001600160801b0316906001600160401b03166116ff565b82600101541015611c4157600282018054600160401b600160c01b031981169091558654611bf5916001600160401b03918216911661164c565b865467ffffffffffffffff19166001600160401b039190911617865560405183907f28b8eb5ccfb9c485b6ee9be3b0153679351f87ca0753786218a455bc3bbe5fdf90600090a2611c72565b611c49611d6b565b8260020160086101000a8154816001600160801b0302191690836001600160801b031602179055505b876001600160a01b0316837f14f0f588a0fd7eb2bc9954bd5b8b1ff7006d486ac28b7541bc966bf102b9756183604051611cac9190612bf3565b60405180910390a35b505050600101611a56565b5080156106ee57611cd084611697565b15611d57576000836001600160a01b031682604051611cee90612af4565b60006040518083038185875af1925050503d8060008114611d2b576040519150601f19603f3d011682016040523d82523d6000602084013e611d30565b606091505b5050905080611d515760405162461bcd60e51b81526004016104e69061341d565b506106ee565b6106ee6001600160a01b03851684836116a4565b4290565b600061168e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612142565b60008184841115611dd55760405162461bcd60e51b81526004016104e69190612c10565b505050900390565b6060611e32826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166121799092919063ffffffff16565b8051909150156116fa5780806020019051810190611e509190612949565b6116fa5760405162461bcd60e51b81526004016104e6906133d3565b62ed4e006001600160401b0383161115611e985760405162461bcd60e51b81526004016104e690612d9a565b6001600160a01b038316600090815260ca602052604090205460ff16611ed05760405162461bcd60e51b81526004016104e6906130e9565b6001600160a01b038316600090815260018501602090815260408083206001600160401b03861684529091529081902080546001600160801b0319166001600160801b0384161790555133907f7eec1797ef3c639736e76e7f22565caf759bb674dab35235349e6879d0a2c14890611f4d90869086908690612b48565b60405180910390a250505050565b600054610100900460ff1680611f745750611f746118e0565b80611f82575060005460ff16155b611f9e5760405162461bcd60e51b81526004016104e69061328a565b600054610100900460ff16158015610cf7576000805460ff1961ff00199091166101001716600117905580156109fc576000805461ff001916905550565b600054610100900460ff1680611ff55750611ff56118e0565b80612003575060005460ff16155b61201f5760405162461bcd60e51b81526004016104e69061328a565b600054610100900460ff1615801561204a576000805460ff1961ff0019909116610100171660011790555b6000612054611870565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156109fc576000805461ff001916905550565b600054610100900460ff16806120cf57506120cf6118e0565b806120dd575060005460ff16155b6120f95760405162461bcd60e51b81526004016104e69061328a565b600054610100900460ff16158015612124576000805460ff1961ff0019909116610100171660011790555b6097805460ff1916905580156109fc576000805461ff001916905550565b600081836121635760405162461bcd60e51b81526004016104e69190612c10565b50600083858161216f57fe5b0495945050505050565b606061164484846000858561218d85612223565b6121a95760405162461bcd60e51b81526004016104e690613347565b60006060866001600160a01b031685876040516121c69190612ad8565b60006040518083038185875af1925050503d8060008114612203576040519150601f19603f3d011682016040523d82523d6000602084013e612208565b606091505b5091509150612218828286612229565b979650505050505050565b3b151590565b60608315612238575081610f17565b8251156122485782518084602001fd5b8160405162461bcd60e51b81526004016104e69190612c10565b8035611691816134dd565b600082601f83011261227d578081fd5b813561229061228b82613492565b61346c565b8181529150602080830190848101818402860182018710156122b157600080fd5b60005b848110156122d95781356122c7816134dd565b845292820192908201906001016122b4565b505050505092915050565b600082601f8301126122f4578081fd5b813561230261228b82613492565b818152915060208083019084810160005b848110156122d95761232a888484358a01016124b6565b84529282019290820190600101612313565b600082601f83011261234c578081fd5b813561235a61228b82613492565b818152915060208083019084810160005b848110156122d9578135870188603f82011261238657600080fd5b8381013561239661228b82613492565b818152858101906040848101888502860182018e10156123b557600080fd5b600095505b848610156123e457803591506123cf82613500565b818452600195909501949288019288016123ba565b50508752505050928201929082019060010161236b565b600082601f83011261240b578081fd5b813561241961228b82613492565b818152915060208083019084810160005b848110156122d9578135870188603f82011261244557600080fd5b8381013561245561228b82613492565b818152858101906040848101888502860182018e101561247457600080fd5b600095505b8486101561249f5761248b8e82612514565b845260019590950194928801928801612479565b50508752505050928201929082019060010161242a565b600082601f8301126124c6578081fd5b81356124d461228b82613492565b8181529150602080830190848101818402860182018710156124f557600080fd5b60005b848110156122d9578135845292820192908201906001016124f8565b80356001600160401b038116811461169157600080fd5b60006020828403121561253c578081fd5b813561168e816134dd565b60008060408385031215612559578081fd5b8235612564816134dd565b91506020830135612574816134f2565b809150509250929050565b60008060008060808587031215612594578182fd5b843561259f816134dd565b93506020850135925060408501356001600160401b038111156125c0578283fd5b6125cc878288016124b6565b92505060608501356125dd816134dd565b939692955090935050565b600080600080608085870312156125fd578384fd5b84356001600160401b0380821115612613578586fd5b61261f888389016122e4565b95506020870135915080821115612634578485fd5b506126418782880161226d565b9350506040850135612652816134dd565b915060608501356125dd816134dd565b600080600060608486031215612676578081fd5b83356001600160401b038082111561268c578283fd5b612698878388016123fb565b945060208601359150808211156126ad578283fd5b6126b98783880161233c565b935060408601359150808211156126ce578283fd5b506126db8682870161226d565b9150509250925092565b6000602082840312156126f6578081fd5b81356001600160401b0381111561270b578182fd5b611644848285016124b6565b60008060006060848603121561272b578081fd5b83356001600160401b03811115612740578182fd5b61274c868287016124b6565b935050602084013561275d816134dd565b9150604084013561276d816134dd565b809150509250925092565b6000806000806080858703121561278d578182fd5b84356001600160401b03808211156127a3578384fd5b6127af888389016124b6565b955060209150818701356127c2816134dd565b94506040870135818111156127d5578485fd5b6127e189828a0161226d565b9450506060870135818111156127f5578384fd5b87019050601f81018813612807578283fd5b803561281561228b82613492565b81815283810190838501858402850186018c1015612831578687fd5b8694505b83851015612853578035835260019490940193918501918501612835565b50979a9699509497505050505050565b60008060008060008060008060006101208a8c031215612881578687fd5b89356001600160401b0380821115612897578889fd5b6128a38d838e016124b6565b9a506128b28d60208e01612262565b99506128c18d60408e01612514565b98506128d08d60608e01612514565b97506128df8d60808e01612262565b965060a08c0135955060c08c01359150808211156128fb578485fd5b6129078d838e016122e4565b945060e08c013591508082111561291c578384fd5b506129298c828d0161226d565b92505061293a8b6101008c01612262565b90509295985092959850929598565b60006020828403121561295a578081fd5b815161168e816134f2565b600060208284031215612976578081fd5b81356001600160401b038116811461168e578182fd5b600080600080600060a086880312156129a3578283fd5b6129ad8787612514565b945060208601356001600160401b03808211156129c8578485fd5b6129d489838a016123fb565b955060408801359150808211156129e9578485fd5b6129f589838a0161233c565b94506060880135915080821115612a0a578283fd5b612a1689838a0161226d565b93506080880135915080821115612a2b578283fd5b50612a38888289016124b6565b9150509295509295909350565b6000815180845260208085019450808401835b83811015612a7457815187529582019590820190600101612a58565b509495945050505050565b60006bffffffffffffffffffffffff19808660601b1683526014830185516020808801855b83811015612ac057815185529382019390820190600101612aa4565b5050505060609490941b168352505060140192915050565b60008251612aea8184602087016134b1565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526001600160401b039190911660208301526001600160801b0316604082015260600190565b60006020825261168e6020830184612a45565b600060c08252612ba160c0830189612a45565b6001600160401b0397881660208401529590961660408201526001600160801b039390931660608401526001600160a01b0391909116608083015260a09091015292915050565b901515815260200190565b90815260200190565b6001600160401b0391909116815260200190565b6000602082528251806020840152612c2f8160408501602087016134b1565b601f01601f19169190910160400192915050565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252602f908201527f53746f726167654d616e616765723a2042696c6c696e6720706572696f64206f60408201526e19880c081b9bdd08185b1b1bddd959608a1b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526039908201527f53746f726167654d616e616765723a206e6f7420706f737369626c6520746f2060408201527f696e746572616374207769746874207468697320746f6b656e00000000000000606082015260800190565b60208082526031908201527f53746f726167654d616e616765723a2042696c6c696e6720706572696f6420656040820152700f0c6cacac840dac2f05c40d8cadccee8d607b1b606082015260800190565b60208082526035908201527f53746f726167654d616e616765723a204f6666657220666f72207468697320506040820152741c9bdd9a59195c88191bd95cdb89dd08195e1a5cdd605a1b606082015260800190565b60208082526032908201527f53746f726167654d616e616765723a2041677265656d656e7420616c72656164604082015271792072616e206f7574206f662066756e647360701b606082015260800190565b60208082526021908201527f53746f726167654d616e616765723a20416d6f756e7420697320746f6f2062696040820152606760f81b606082015260800190565b60208082526023908201527f53746f726167654d616e616765723a204e6f7468696e6720746f20776974686460408201526272617760e81b606082015260800190565b60208082526049908201527f53746f726167654d616e616765723a2046756e6473206465706f73697465642060408201527f68617320746f20626520666f72206174206c65617374206f6e652062696c6c696060820152681b99c81c195c9a5bd960ba1b608082015260a00190565b6020808252602d908201527f53746f726167654d616e616765723a20496e73756666696369656e74204f666660408201526c6572277320636170616369747960981b606082015260800190565b6020808252602c908201527f53746f726167654d616e616765723a2053697a652068617320746f206265206260408201526b06967676572207468656e20360a41b606082015260800190565b6020808252602b908201527f53746f726167654d616e616765723a205072696365206e6f7420617661696c6160408201526a626c6520616e796d6f726560a81b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526036908201527f53746f726167654d616e616765723a2041677265656d656e7420666f722074686040820152751a5cc813d999995c88191bd95cdb89dd08195e1a5cdd60521b606082015260800190565b60208082526028908201527f53746f726167654d616e616765723a20546f6b656e206973206e6f74207768696040820152671d195b1a5cdd195960c21b606082015260800190565b6020808252602b908201527f53746f726167654d616e616765723a2070726f7669646572206973206e6f742060408201526a1dda1a5d195b1a5cdd195960aa1b606082015260800190565b60208082526024908201527f53746f726167654d616e616765723a2041677265656d656e74206e6f742061636040820152637469766560e01b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526034908201527f53746f726167654d616e616765723a2043617061636974792068617320746f2060408201527362652067726561746572207468656e207a65726f60601b606082015260800190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526025908201527f53746f726167654d616e616765723a2041677265656d656e7420697320696e61604082015264637469766560d81b606082015260800190565b60208082526010908201526f2a3930b739b332b9103330b4b632b21760811b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526035908201527f53746f726167654d616e616765723a2042696c6c696e6720707269636520646f60408201527432b9b713ba1032bc34b9ba103337b91027b33332b960591b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252818101527f53746f726167654d616e616765723a205472616e73666572206661696c65642e604082015260600190565b6001600160401b0392831681529116602082015260400190565b6040518181016001600160401b038111828210171561348a57600080fd5b604052919050565b60006001600160401b038211156134a7578081fd5b5060209081020190565b60005b838110156134cc5781810151838201526020016134b4565b8381111561177f5750506000910152565b6001600160a01b03811681146109fc57600080fd5b80151581146109fc57600080fd5b6001600160801b03811681146109fc57600080fdfea2646970667358221220bb64db1a8fac4403415397692d2f4ba16460157b13ebceffd355bee9611a942b64736f6c634300060c0033",
  "deployedBytecode": "0x60806040526004361061014b5760003560e01c80638456cb59116100b6578063bf317abb1161006f578063bf317abb1461036b578063d245599e14610398578063dc4aac9e146103ab578063ec5cdf99146103cb578063f2fde38b146103eb578063f650ca741461040b5761014b565b80638456cb59146102b15780638da5cb5b146102c65780638f5c5fc8146102e85780639aad18ca14610316578063ab37f48614610336578063b5859693146103565761014b565b8063398887051161010857806339888705146102105780633f4ba83a146102305780635c975abb14610245578063715018a6146102675780638129fc1c1461027c57806382c4dba5146102915761014b565b80630d8e6e2c146101505780631f3477a51461017b5780632691c0851461019d5780632fd09ef9146101b0578063325b2941146101d057806337f4329d146101f0575b600080fd5b34801561015c57600080fd5b5061016561042b565b6040516101729190612c10565b60405180910390f35b34801561018757600080fd5b5061019b610196366004612778565b610447565b005b61019b6101ab36600461257f565b6106f6565b3480156101bc57600080fd5b5061019b6101cb3660046126e5565b6109f3565b3480156101dc57600080fd5b5061019b6101eb366004612662565b6109ff565b3480156101fc57600080fd5b5061019b61020b36600461298c565b610aa1565b34801561021c57600080fd5b5061019b61022b366004612547565b610b30565b34801561023c57600080fd5b5061019b610b90565b34801561025157600080fd5b5061025a610bf1565b6040516101729190612be8565b34801561027357600080fd5b5061019b610bfa565b34801561028857600080fd5b5061019b610c79565b34801561029d57600080fd5b5061019b6102ac366004612547565b610d0b565b3480156102bd57600080fd5b5061019b610d6b565b3480156102d257600080fd5b506102db610dcb565b6040516101729190612af7565b3480156102f457600080fd5b5061030861030336600461252b565b610dda565b604051610172929190613452565b34801561032257600080fd5b5061025a61033136600461252b565b610e00565b34801561034257600080fd5b5061025a61035136600461252b565b610e15565b34801561036257600080fd5b5061019b610e2a565b34801561037757600080fd5b5061038b610386366004612717565b610ee7565b6040516101729190612bf3565b61019b6103a6366004612863565b610f1e565b3480156103b757600080fd5b5061019b6103c63660046125e8565b611392565b3480156103d757600080fd5b5061025a6103e636600461252b565b6113d8565b3480156103f757600080fd5b5061019b61040636600461252b565b6113fe565b34801561041757600080fd5b5061019b610426366004612965565b6114b5565b6040805180820190915260028152612b1960f11b602082015290565b6001600160a01b038316600090815260c960205260408120905b83518110156106ee57600083828151811061047857fe5b60200260200101519050600085838151811061049057fe5b6020026020010151905060006104a7893384610ee7565b60008181526002808801602052604090912090810154919250906001600160401b03166104ef5760405162461bcd60e51b81526004016104e690613093565b60405180910390fd5b6002810154600090600160401b90046001600160801b03166105165750600181015461059d565b600282015482546040805160a0810182526001600160801b03808416808352600160801b9094046001600160401b03908116602084015260018801549383019390935291841660608201819052600160401b9094048216608082015261059a9392909202169061059490610589906115a0565b60018601549061164c565b9061164c565b90505b846105a6578094505b808511156105c65760405162461bcd60e51b81526004016104e690612e92565b60018201546105d5908661164c565b6001830155846105f75760405162461bcd60e51b81526004016104e690612ed3565b61060084611697565b15610687576000336001600160a01b03168660405161061e90612af4565b60006040518083038185875af1925050503d806000811461065b576040519150601f19603f3d011682016040523d82523d6000602084013e610660565b606091505b50509050806106815760405162461bcd60e51b81526004016104e69061331d565b5061069b565b61069b6001600160a01b03851633876116a4565b836001600160a01b0316837f579b45b1ee6c41a979ca183763f8a18021bb54fcd590cf1be2821e4abe31fd8e876040516106d59190612bf3565b60405180910390a3505060019093019250610461915050565b505050505050565b60975460ff16156107195760405162461bcd60e51b81526004016104e690613069565b6001600160a01b038116600090815260cb6020526040902054819060ff166107535760405162461bcd60e51b81526004016104e690613131565b6000610760843388610ee7565b6001600160a01b038716600090815260ca602052604090205490915060ff1661079b5760405162461bcd60e51b81526004016104e6906130e9565b6001600160a01b038316600090815260c9602052604090208054600160401b90046001600160401b03166107e15760405162461bcd60e51b81526004016104e690612deb565b600082815260028083016020526040909120908101546001600160401b031661081c5760405162461bcd60e51b81526004016104e690613093565b6002810154600160401b90046001600160801b031661084d5760405162461bcd60e51b81526004016104e69061317c565b80546001600160a01b038916600090815260018401602090815260408083206001600160401b03600160801b86041684529091529020546001600160801b039081169116146108ae5760405162461bcd60e51b81526004016104e69061301e565b600281015481546108d3916001600160801b03909116906001600160401b03166116ff565b6040805160a08101825283546001600160801b0380821683526001600160401b03600160801b9092048216602084015260018601549383019390935260028501549081166060830152600160401b9004909116608082015261094390610938906115a0565b60018401549061164c565b10156109615760405162461bcd60e51b81526004016104e690612e40565b600061096c89611697565b90508015610978573497505b60018201546109879089611739565b6001830155806109a6576109a66001600160a01b038a1633308b61175e565b886001600160a01b0316847f5ac5c9c49f143d64d36d4eb69c1624c8670cb426b3f952830187c279a51009cc8a6040516109e09190612bf3565b60405180910390a3505050505050505050565b6109fc81611785565b50565b60975460ff1615610a225760405162461bcd60e51b81526004016104e690613069565b33600081815260cb602052604090205460ff16610a515760405162461bcd60e51b81526004016104e690613131565b33600090815260c9602052604090208054600160401b90046001600160401b0316610a8e5760405162461bcd60e51b81526004016104e690612deb565b610a9a818686866117c9565b5050505050565b60975460ff1615610ac45760405162461bcd60e51b81526004016104e690613069565b33600081815260cb602052604090205460ff16610af35760405162461bcd60e51b81526004016104e690613131565b33600090815260c960205260409020610b0b876114b5565b610b17818787876117c9565b825115610b2757610b2783611785565b50505050505050565b610b38611870565b6065546001600160a01b03908116911614610b655760405162461bcd60e51b81526004016104e690613201565b6001600160a01b0391909116600090815260ca60205260409020805460ff1916911515919091179055565b610b98611870565b6065546001600160a01b03908116911614610bc55760405162461bcd60e51b81526004016104e690613201565b60975460ff16610be75760405162461bcd60e51b81526004016104e690612c43565b610bef611874565b565b60975460ff1690565b610c02611870565b6065546001600160a01b03908116911614610c2f5760405162461bcd60e51b81526004016104e690613201565b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b600054610100900460ff1680610c925750610c926118e0565b80610ca0575060005460ff16155b610cbc5760405162461bcd60e51b81526004016104e69061328a565b600054610100900460ff16158015610ce7576000805460ff1961ff0019909116610100171660011790555b610cef6118e6565b610cf7611964565b80156109fc576000805461ff001916905550565b610d13611870565b6065546001600160a01b03908116911614610d405760405162461bcd60e51b81526004016104e690613201565b6001600160a01b0391909116600090815260cb60205260409020805460ff1916911515919091179055565b610d73611870565b6065546001600160a01b03908116911614610da05760405162461bcd60e51b81526004016104e690613201565b60975460ff1615610dc35760405162461bcd60e51b81526004016104e690613069565b610bef6119e2565b6065546001600160a01b031690565b60c9602052600090815260409020546001600160401b0380821691600160401b90041682565b60cb6020526000908152604090205460ff1681565b60ca6020526000908152604090205460ff1681565b33600081815260cb602052604090205460ff16610e595760405162461bcd60e51b81526004016104e690613131565b33600090815260c9602052604090208054600160401b90046001600160401b0316610e965760405162461bcd60e51b81526004016104e690612deb565b805467ffffffffffffffff60401b1916815560405133907f7267987f11d91dd9b618677a5f4e5596eca75f9e97d880452c73c2dbd8ebfae390610edb90600090612bfc565b60405180910390a25050565b6000828483604051602001610efe93929190612a7f565b6040516020818303038152906040528051906020012090505b9392505050565b60975460ff1615610f415760405162461bcd60e51b81526004016104e690613069565b6001600160a01b038816600090815260cb602052604090205460ff16610f795760405162461bcd60e51b81526004016104e690613131565b6001600160a01b038816600090815260c9602052604090206001600160401b038716610fb75760405162461bcd60e51b81526004016104e690612c71565b6000886001600160401b031611610fe05760405162461bcd60e51b81526004016104e690612fd2565b8054600160401b90046001600160401b031661100e5760405162461bcd60e51b81526004016104e690612deb565b6001600160a01b038616600090815260ca602052604090205460ff166110465760405162461bcd60e51b81526004016104e690612d3d565b835115611059576110598484848c611a3b565b60006110668b3389610ee7565b6000818152600284810160205260409091200154909150600160401b90046001600160801b03161561113957604080516001808252818301909252606091816020015b60608152602001906001900390816110a957505060408051600180825281830190925291925060609190602080830190803683370190505090508c826000815181106110f157fe5b6020026020010181905250338160008151811061110a57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505061113682828b8f611a3b565b50505b6001600160a01b038716600090815260018301602090815260408083206001600160401b038c1684529091529020546001600160801b03168061118e5760405162461bcd60e51b81526004016104e69061337e565b600082815260028401602052604090206111a789611697565b156111b0573497505b60018101546111bf9089611739565b60018201556111e06001600160401b038c166001600160801b0384166116ff565b816001015410156112035760405162461bcd60e51b81526004016104e690612f16565b60028101805467ffffffffffffffff19166001600160401b038d81169190911790915581546001600160801b0319166001600160801b0384161767ffffffffffffffff60801b1916600160801b918c1691909102178155611262611d6b565b6002820180546001600160801b0392909216600160401b02600160401b600160c01b03199092169190911790556001600160a01b038c16600090815260c96020526040902080549094506112c3906001600160401b03908116908d16611739565b845467ffffffffffffffff19166001600160401b0391821617808655600160401b81048216911611156113085760405162461bcd60e51b81526004016104e690612f85565b61131189611697565b61132a5761132a6001600160a01b038a1633308b61175e565b8b6001600160a01b0316336001600160a01b03167f8c1ead7cd014d31bcde974cc4762a98cce33de4fbda569fbcc73f8f276212fff8f8e8e878f886001015460405161137b96959493929190612b8e565b60405180910390a350505050505050505050505050565b6001600160a01b038116600090815260cb6020526040902054819060ff166113cc5760405162461bcd60e51b81526004016104e690613131565b610a9a85858585611a3b565b6001600160a01b0316600090815260c960205260409020546001600160401b0316151590565b611406611870565b6065546001600160a01b039081169116146114335760405162461bcd60e51b81526004016104e690613201565b6001600160a01b0381166114595760405162461bcd60e51b81526004016104e690612cc0565b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b60975460ff16156114d85760405162461bcd60e51b81526004016104e690613069565b33600081815260cb602052604090205460ff166115075760405162461bcd60e51b81526004016104e690613131565b6001600160401b03821661152d5760405162461bcd60e51b81526004016104e690613236565b33600081815260c9602052604090819020805467ffffffffffffffff60401b1916600160401b6001600160401b0387160217815590519091907f7267987f11d91dd9b618677a5f4e5596eca75f9e97d880452c73c2dbd8ebfae390611593908690612bfc565b60405180910390a2505050565b6000806115d083600001516001600160801b031684606001516001600160401b03166116ff90919063ffffffff16565b9050600061160484602001516001600160401b03166115fe86608001516001600160801b0316610594611d6b565b90611d6f565b9050600061161282846116ff565b90508460400151811115611644576116418361163b858860400151611d6f90919063ffffffff16565b906116ff565b90505b949350505050565b600061168e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611db1565b90505b92915050565b6001600160a01b03161590565b6116fa8363a9059cbb60e01b84846040516024016116c3929190612b2f565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611ddd565b505050565b60008261170e57506000611691565b8282028284828161171b57fe5b041461168e5760405162461bcd60e51b81526004016104e6906131c0565b60008282018381101561168e5760405162461bcd60e51b81526004016104e690612d06565b61177f846323b872dd60e01b8585856040516024016116c393929190612b0b565b50505050565b336001600160a01b03167f8e9ae80d46259102dfbf4ae6121dbe6548e85c8c0494163e8e0bf0e87bcd5876826040516117be9190612b7b565b60405180910390a250565b60005b8151811015610a9a5760005b8482815181106117e457fe5b6020026020010151518110156118675761185f8684848151811061180457fe5b602002602001015187858151811061181857fe5b6020026020010151848151811061182b57fe5b602002602001015187868151811061183f57fe5b6020026020010151858151811061185257fe5b6020026020010151611e6c565b6001016117d8565b506001016117cc565b3390565b60975460ff166118965760405162461bcd60e51b81526004016104e690612c43565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6118c9611870565b6040516118d69190612af7565b60405180910390a1565b303b1590565b600054610100900460ff16806118ff57506118ff6118e0565b8061190d575060005460ff16155b6119295760405162461bcd60e51b81526004016104e69061328a565b600054610100900460ff16158015611954576000805460ff1961ff0019909116610100171660011790555b61195c611f5b565b610cf7611fdc565b600054610100900460ff168061197d575061197d6118e0565b8061198b575060005460ff16155b6119a75760405162461bcd60e51b81526004016104e69061328a565b600054610100900460ff161580156119d2576000805460ff1961ff0019909116610100171660011790555b6119da611f5b565b610cf76120b6565b60975460ff1615611a055760405162461bcd60e51b81526004016104e690613069565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118c9611870565b6001600160a01b038116600090815260c96020526040812090805b86518160ff161015611cc0576000611a9b888360ff1681518110611a7657fe5b6020026020010151888460ff1681518110611a8d57fe5b602002602001015188610ee7565b60008181526002808701602052604090912090810154919250906001600160401b0316611ada5760405162461bcd60e51b81526004016104e690613093565b6002810154600160401b90046001600160801b0316611b0b5760405162461bcd60e51b81526004016104e6906132d8565b6040805160a08101825282546001600160801b0380821683526001600160401b03600160801b9092048216602084015260018501549383019390935260028401549081166060830152600160401b90049091166080820152600090611b6f906115a0565b90508015611cb5576001820154611b86908261164c565b6001830155611b958582611739565b60028301548354919650611bbb916001600160801b0316906001600160401b03166116ff565b82600101541015611c4157600282018054600160401b600160c01b031981169091558654611bf5916001600160401b03918216911661164c565b865467ffffffffffffffff19166001600160401b039190911617865560405183907f28b8eb5ccfb9c485b6ee9be3b0153679351f87ca0753786218a455bc3bbe5fdf90600090a2611c72565b611c49611d6b565b8260020160086101000a8154816001600160801b0302191690836001600160801b031602179055505b876001600160a01b0316837f14f0f588a0fd7eb2bc9954bd5b8b1ff7006d486ac28b7541bc966bf102b9756183604051611cac9190612bf3565b60405180910390a35b505050600101611a56565b5080156106ee57611cd084611697565b15611d57576000836001600160a01b031682604051611cee90612af4565b60006040518083038185875af1925050503d8060008114611d2b576040519150601f19603f3d011682016040523d82523d6000602084013e611d30565b606091505b5050905080611d515760405162461bcd60e51b81526004016104e69061341d565b506106ee565b6106ee6001600160a01b03851684836116a4565b4290565b600061168e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612142565b60008184841115611dd55760405162461bcd60e51b81526004016104e69190612c10565b505050900390565b6060611e32826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166121799092919063ffffffff16565b8051909150156116fa5780806020019051810190611e509190612949565b6116fa5760405162461bcd60e51b81526004016104e6906133d3565b62ed4e006001600160401b0383161115611e985760405162461bcd60e51b81526004016104e690612d9a565b6001600160a01b038316600090815260ca602052604090205460ff16611ed05760405162461bcd60e51b81526004016104e6906130e9565b6001600160a01b038316600090815260018501602090815260408083206001600160401b03861684529091529081902080546001600160801b0319166001600160801b0384161790555133907f7eec1797ef3c639736e76e7f22565caf759bb674dab35235349e6879d0a2c14890611f4d90869086908690612b48565b60405180910390a250505050565b600054610100900460ff1680611f745750611f746118e0565b80611f82575060005460ff16155b611f9e5760405162461bcd60e51b81526004016104e69061328a565b600054610100900460ff16158015610cf7576000805460ff1961ff00199091166101001716600117905580156109fc576000805461ff001916905550565b600054610100900460ff1680611ff55750611ff56118e0565b80612003575060005460ff16155b61201f5760405162461bcd60e51b81526004016104e69061328a565b600054610100900460ff1615801561204a576000805460ff1961ff0019909116610100171660011790555b6000612054611870565b606580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156109fc576000805461ff001916905550565b600054610100900460ff16806120cf57506120cf6118e0565b806120dd575060005460ff16155b6120f95760405162461bcd60e51b81526004016104e69061328a565b600054610100900460ff16158015612124576000805460ff1961ff0019909116610100171660011790555b6097805460ff1916905580156109fc576000805461ff001916905550565b600081836121635760405162461bcd60e51b81526004016104e69190612c10565b50600083858161216f57fe5b0495945050505050565b606061164484846000858561218d85612223565b6121a95760405162461bcd60e51b81526004016104e690613347565b60006060866001600160a01b031685876040516121c69190612ad8565b60006040518083038185875af1925050503d8060008114612203576040519150601f19603f3d011682016040523d82523d6000602084013e612208565b606091505b5091509150612218828286612229565b979650505050505050565b3b151590565b60608315612238575081610f17565b8251156122485782518084602001fd5b8160405162461bcd60e51b81526004016104e69190612c10565b8035611691816134dd565b600082601f83011261227d578081fd5b813561229061228b82613492565b61346c565b8181529150602080830190848101818402860182018710156122b157600080fd5b60005b848110156122d95781356122c7816134dd565b845292820192908201906001016122b4565b505050505092915050565b600082601f8301126122f4578081fd5b813561230261228b82613492565b818152915060208083019084810160005b848110156122d95761232a888484358a01016124b6565b84529282019290820190600101612313565b600082601f83011261234c578081fd5b813561235a61228b82613492565b818152915060208083019084810160005b848110156122d9578135870188603f82011261238657600080fd5b8381013561239661228b82613492565b818152858101906040848101888502860182018e10156123b557600080fd5b600095505b848610156123e457803591506123cf82613500565b818452600195909501949288019288016123ba565b50508752505050928201929082019060010161236b565b600082601f83011261240b578081fd5b813561241961228b82613492565b818152915060208083019084810160005b848110156122d9578135870188603f82011261244557600080fd5b8381013561245561228b82613492565b818152858101906040848101888502860182018e101561247457600080fd5b600095505b8486101561249f5761248b8e82612514565b845260019590950194928801928801612479565b50508752505050928201929082019060010161242a565b600082601f8301126124c6578081fd5b81356124d461228b82613492565b8181529150602080830190848101818402860182018710156124f557600080fd5b60005b848110156122d9578135845292820192908201906001016124f8565b80356001600160401b038116811461169157600080fd5b60006020828403121561253c578081fd5b813561168e816134dd565b60008060408385031215612559578081fd5b8235612564816134dd565b91506020830135612574816134f2565b809150509250929050565b60008060008060808587031215612594578182fd5b843561259f816134dd565b93506020850135925060408501356001600160401b038111156125c0578283fd5b6125cc878288016124b6565b92505060608501356125dd816134dd565b939692955090935050565b600080600080608085870312156125fd578384fd5b84356001600160401b0380821115612613578586fd5b61261f888389016122e4565b95506020870135915080821115612634578485fd5b506126418782880161226d565b9350506040850135612652816134dd565b915060608501356125dd816134dd565b600080600060608486031215612676578081fd5b83356001600160401b038082111561268c578283fd5b612698878388016123fb565b945060208601359150808211156126ad578283fd5b6126b98783880161233c565b935060408601359150808211156126ce578283fd5b506126db8682870161226d565b9150509250925092565b6000602082840312156126f6578081fd5b81356001600160401b0381111561270b578182fd5b611644848285016124b6565b60008060006060848603121561272b578081fd5b83356001600160401b03811115612740578182fd5b61274c868287016124b6565b935050602084013561275d816134dd565b9150604084013561276d816134dd565b809150509250925092565b6000806000806080858703121561278d578182fd5b84356001600160401b03808211156127a3578384fd5b6127af888389016124b6565b955060209150818701356127c2816134dd565b94506040870135818111156127d5578485fd5b6127e189828a0161226d565b9450506060870135818111156127f5578384fd5b87019050601f81018813612807578283fd5b803561281561228b82613492565b81815283810190838501858402850186018c1015612831578687fd5b8694505b83851015612853578035835260019490940193918501918501612835565b50979a9699509497505050505050565b60008060008060008060008060006101208a8c031215612881578687fd5b89356001600160401b0380821115612897578889fd5b6128a38d838e016124b6565b9a506128b28d60208e01612262565b99506128c18d60408e01612514565b98506128d08d60608e01612514565b97506128df8d60808e01612262565b965060a08c0135955060c08c01359150808211156128fb578485fd5b6129078d838e016122e4565b945060e08c013591508082111561291c578384fd5b506129298c828d0161226d565b92505061293a8b6101008c01612262565b90509295985092959850929598565b60006020828403121561295a578081fd5b815161168e816134f2565b600060208284031215612976578081fd5b81356001600160401b038116811461168e578182fd5b600080600080600060a086880312156129a3578283fd5b6129ad8787612514565b945060208601356001600160401b03808211156129c8578485fd5b6129d489838a016123fb565b955060408801359150808211156129e9578485fd5b6129f589838a0161233c565b94506060880135915080821115612a0a578283fd5b612a1689838a0161226d565b93506080880135915080821115612a2b578283fd5b50612a38888289016124b6565b9150509295509295909350565b6000815180845260208085019450808401835b83811015612a7457815187529582019590820190600101612a58565b509495945050505050565b60006bffffffffffffffffffffffff19808660601b1683526014830185516020808801855b83811015612ac057815185529382019390820190600101612aa4565b5050505060609490941b168352505060140192915050565b60008251612aea8184602087016134b1565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526001600160401b039190911660208301526001600160801b0316604082015260600190565b60006020825261168e6020830184612a45565b600060c08252612ba160c0830189612a45565b6001600160401b0397881660208401529590961660408201526001600160801b039390931660608401526001600160a01b0391909116608083015260a09091015292915050565b901515815260200190565b90815260200190565b6001600160401b0391909116815260200190565b6000602082528251806020840152612c2f8160408501602087016134b1565b601f01601f19169190910160400192915050565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252602f908201527f53746f726167654d616e616765723a2042696c6c696e6720706572696f64206f60408201526e19880c081b9bdd08185b1b1bddd959608a1b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526039908201527f53746f726167654d616e616765723a206e6f7420706f737369626c6520746f2060408201527f696e746572616374207769746874207468697320746f6b656e00000000000000606082015260800190565b60208082526031908201527f53746f726167654d616e616765723a2042696c6c696e6720706572696f6420656040820152700f0c6cacac840dac2f05c40d8cadccee8d607b1b606082015260800190565b60208082526035908201527f53746f726167654d616e616765723a204f6666657220666f72207468697320506040820152741c9bdd9a59195c88191bd95cdb89dd08195e1a5cdd605a1b606082015260800190565b60208082526032908201527f53746f726167654d616e616765723a2041677265656d656e7420616c72656164604082015271792072616e206f7574206f662066756e647360701b606082015260800190565b60208082526021908201527f53746f726167654d616e616765723a20416d6f756e7420697320746f6f2062696040820152606760f81b606082015260800190565b60208082526023908201527f53746f726167654d616e616765723a204e6f7468696e6720746f20776974686460408201526272617760e81b606082015260800190565b60208082526049908201527f53746f726167654d616e616765723a2046756e6473206465706f73697465642060408201527f68617320746f20626520666f72206174206c65617374206f6e652062696c6c696060820152681b99c81c195c9a5bd960ba1b608082015260a00190565b6020808252602d908201527f53746f726167654d616e616765723a20496e73756666696369656e74204f666660408201526c6572277320636170616369747960981b606082015260800190565b6020808252602c908201527f53746f726167654d616e616765723a2053697a652068617320746f206265206260408201526b06967676572207468656e20360a41b606082015260800190565b6020808252602b908201527f53746f726167654d616e616765723a205072696365206e6f7420617661696c6160408201526a626c6520616e796d6f726560a81b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526036908201527f53746f726167654d616e616765723a2041677265656d656e7420666f722074686040820152751a5cc813d999995c88191bd95cdb89dd08195e1a5cdd60521b606082015260800190565b60208082526028908201527f53746f726167654d616e616765723a20546f6b656e206973206e6f74207768696040820152671d195b1a5cdd195960c21b606082015260800190565b6020808252602b908201527f53746f726167654d616e616765723a2070726f7669646572206973206e6f742060408201526a1dda1a5d195b1a5cdd195960aa1b606082015260800190565b60208082526024908201527f53746f726167654d616e616765723a2041677265656d656e74206e6f742061636040820152637469766560e01b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526034908201527f53746f726167654d616e616765723a2043617061636974792068617320746f2060408201527362652067726561746572207468656e207a65726f60601b606082015260800190565b6020808252602e908201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560408201526d195b881a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526025908201527f53746f726167654d616e616765723a2041677265656d656e7420697320696e61604082015264637469766560d81b606082015260800190565b60208082526010908201526f2a3930b739b332b9103330b4b632b21760811b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526035908201527f53746f726167654d616e616765723a2042696c6c696e6720707269636520646f60408201527432b9b713ba1032bc34b9ba103337b91027b33332b960591b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252818101527f53746f726167654d616e616765723a205472616e73666572206661696c65642e604082015260600190565b6001600160401b0392831681529116602082015260400190565b6040518181016001600160401b038111828210171561348a57600080fd5b604052919050565b60006001600160401b038211156134a7578081fd5b5060209081020190565b60005b838110156134cc5781810151838201526020016134b4565b8381111561177f5750506000910152565b6001600160a01b03811681146109fc57600080fd5b80151581146109fc57600080fd5b6001600160801b03811681146109fc57600080fdfea2646970667358221220bb64db1a8fac4403415397692d2f4ba16460157b13ebceffd355bee9611a942b64736f6c634300060c0033",
  "immutableReferences": {},
  "sourceMap": "123:144:5:-:0;;;;;;;;;;;;;;;;;;;",
  "deployedSourceMap": "123:144:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;177:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19283:1931:2;;;;;;;;;;-1:-1:-1;19283:1931:2;;;;;:::i;:::-;;:::i;:::-;;16849:1649;;;;;;:::i;:::-;;:::i;9831:92::-;;;;;;;;;;-1:-1:-1;9831:92:2;;;;;:::i;:::-;;:::i;9138:455::-;;;;;;;;;;-1:-1:-1;9138:455:2;;;;;:::i;:::-;;:::i;6343:522::-;;;;;;;;;;-1:-1:-1;6343:522:2;;;;;:::i;:::-;;:::i;3947:140::-;;;;;;;;;;-1:-1:-1;3947:140:2;;;;;:::i;:::-;;:::i;26959:74::-;;;;;;;;;;;;;:::i;1248:76:9:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1894:145:8:-;;;;;;;;;;;;;:::i;3596:101:2:-;;;;;;;;;;;;;:::i;4366:165::-;;;;;;;;;;-1:-1:-1;4366:165:2;;;;;:::i;:::-;;:::i;26796:73::-;;;;;;;;;;;;;:::i;1271:77:8:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;2326:46:2:-;;;;;;;;;;-1:-1:-1;2326:46:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;2629:53::-;;;;;;;;;;-1:-1:-1;2629:53:2;;;;;:::i;:::-;;:::i;2495:50::-;;;;;;;;;;-1:-1:-1;2495:50:2;;;;;:::i;:::-;;:::i;7628:308::-;;;;;;;;;;;;;:::i;27640:237::-;;;;;;;;;;-1:-1:-1;27640:237:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11869:4319::-;;;;;;:::i;:::-;;:::i;21915:447::-;;;;;;;;;;-1:-1:-1;21915:447:2;;;;;:::i;:::-;;:::i;24124:141::-;;;;;;;;;;-1:-1:-1;24124:141:2;;;;;:::i;:::-;;:::i;2188:240:8:-;;;;;;;;;;-1:-1:-1;2188:240:8;;;;;:::i;:::-;;:::i;6985:341:2:-;;;;;;;;;;-1:-1:-1;6985:341:2;;;;;:::i;:::-;;:::i;177:88:5:-;247:11;;;;;;;;;;;;-1:-1:-1;;;247:11:5;;;;177:88;:::o;19283:1931:2:-;-1:-1:-1;;;;;19484:23:2;;19462:19;19484:23;;;:13;:23;;;;;;19517:1691;19537:6;:13;19533:1;:17;19517:1691;;;19571:14;19588:7;19596:1;19588:10;;;;;;;;;;;;;;19571:27;;19612:13;19628:6;19635:1;19628:9;;;;;;;;;;;;;;19612:25;;19651:26;19680:55;19702:13;19717:10;19729:5;19680:21;:55::i;:::-;19749:27;19779:43;;;:23;;;;:43;;;;;;19844:14;;;;19651:84;;-1:-1:-1;19779:43:2;-1:-1:-1;;;;;19844:14:2;19836:86;;;;-1:-1:-1;;;19836:86:2;;;;;;;:::i;:::-;;;;;;;;;19982:24;;;;19936:28;;-1:-1:-1;;;19982:24:2;;-1:-1:-1;;;;;19982:24:2;19978:545;;-1:-1:-1;20128:24:2;;;;19978:545;;;20475:14;;;;20450:22;;20391:31;;;;;;;;-1:-1:-1;;;;;20450:22:2;;;20391:31;;;-1:-1:-1;;;20391:31:2;;;-1:-1:-1;;;;;20391:31:2;;;;;;;20475:14;20391:31;;;;;;;;;;20475:14;;;20391:31;;;;;;-1:-1:-1;;;20391:31:2;;;;;;;;;20362:146;;20450:39;;;;20362:146;;:61;;20391:31;;:20;:31::i;:::-;20362:24;;;;;:28;:61::i;:::-;:65;;:146::i;:::-;20339:169;;19978:545;20541:11;20537:79;;20581:20;20572:29;;20537:79;20647:20;20637:6;:30;;20629:76;;;;-1:-1:-1;;;20629:76:2;;;;;;;:::i;:::-;20746:24;;;;:36;;20775:6;20746:28;:36::i;:::-;20719:24;;;:63;20804:10;20796:58;;;;-1:-1:-1;;;20796:58:2;;;;;;;:::i;:::-;20873:21;20888:5;20873:14;:21::i;:::-;20869:252;;;20915:12;20933:10;-1:-1:-1;;;;;20933:15:2;20956:6;20933:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20914:53;;;20993:7;20985:36;;;;-1:-1:-1;;;20985:36:2;;;;;;;:::i;:::-;20869:252;;;;21060:46;-1:-1:-1;;;;;21060:26:2;;21087:10;21099:6;21060:26;:46::i;:::-;21191:5;-1:-1:-1;;;;;21139:58:2;21163:18;21139:58;21183:6;21139:58;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;19552:3:2;;;;;-1:-1:-1;19517:1691:2;;-1:-1:-1;;19517:1691:2;;;19283:1931;;;;;:::o;16849:1649::-;1477:7:9;;;;1476:8;1468:37;;;;-1:-1:-1;;;1468:37:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;29673:31:2;::::1;;::::0;;;:21:::1;:31;::::0;;;;;17039:8;;29673:31:::1;;29665:87;;;;-1:-1:-1::0;;;29665:87:2::1;;;;;;;:::i;:::-;17059:26:::2;17088:55;17110:13;17125:10;17137:5;17088:21;:55::i;:::-;-1:-1:-1::0;;;;;17161:25:2;::::2;;::::0;;;:18:::2;:25;::::0;;;;;17059:84;;-1:-1:-1;17161:25:2::2;;17153:78;;;;-1:-1:-1::0;;;17153:78:2::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;17263:23:2;::::2;17241:19;17263:23:::0;;;:13:::2;:23;::::0;;;;17304:19;;-1:-1:-1;;;17304:19:2;::::2;-1:-1:-1::0;;;;;17304:19:2::2;17296:90;;;;-1:-1:-1::0;;;17296:90:2::2;;;;;;;:::i;:::-;17396:27;17426:43:::0;;;:23:::2;::::0;;::::2;:43;::::0;;;;;17487:14;;::::2;::::0;-1:-1:-1;;;;;17487:14:2::2;17479:86;;;;-1:-1:-1::0;;;17479:86:2::2;;;;;;;:::i;:::-;17583:24;::::0;::::2;::::0;-1:-1:-1;;;17583:24:2;::::2;-1:-1:-1::0;;;;;17583:24:2::2;17575:78;;;;-1:-1:-1::0;;;17575:78:2::2;;;;;;;:::i;:::-;17746:22:::0;;-1:-1:-1;;;;;17684:33:2;::::2;17746:22;17684:33:::0;;;17746:22;17684:26;::::2;:33;::::0;;;;;;;-1:-1:-1;;;;;;;;17718:23:2;::::2;;17684:58:::0;;;;;;;;-1:-1:-1;;;;;17684:58:2;;::::2;17746:22:::0;::::2;17684:84;17663:174;;;;-1:-1:-1::0;;;17663:174:2::2;;;;;;;:::i;:::-;17960:14;::::0;::::2;::::0;17933:22;;:42:::2;::::0;-1:-1:-1;;;;;17933:22:2;;::::2;::::0;-1:-1:-1;;;;;17960:14:2::2;17933:26;:42::i;:::-;17897:31;::::0;;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;;;17897:31:2;;::::2;::::0;;-1:-1:-1;;;;;;;;17897:31:2;;::::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;;;;;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;;;-1:-1:-1;;;17897:31:2;::::2;::::0;;::::2;::::0;;;;17868:61:::2;::::0;17897:31:::2;::::0;:20:::2;:31::i;:::-;17868:24;::::0;::::2;::::0;;:28:::2;:61::i;:::-;:107;;17847:204;;;;-1:-1:-1::0;;;17847:204:2::2;;;;;;;:::i;:::-;18061:18;18082:21;18097:5;18082:14;:21::i;:::-;18061:42;;18117:13;18113:62;;;18155:9;18146:18;;18113:62;18211:24;::::0;::::2;::::0;:36:::2;::::0;18240:6;18211:28:::2;:36::i;:::-;18184:24;::::0;::::2;:63:::0;18262:13;18257:162:::2;;18343:65;-1:-1:-1::0;;;;;18343:30:2;::::2;18374:10;18394:4;18401:6:::0;18343:30:::2;:65::i;:::-;18485:5;-1:-1:-1::0;;;;;18433:58:2::2;18457:18;18433:58;18477:6;18433:58;;;;;;:::i;:::-;;;;;;;;29762:1;;;;1515::9::1;16849:1649:2::0;;;;:::o;9831:92::-;9895:21;9908:7;9895:12;:21::i;:::-;9831:92;:::o;9138:455::-;1477:7:9;;;;1476:8;1468:37;;;;-1:-1:-1;;;1468:37:9;;;;;;;:::i;:::-;9327:10:2::1;29673:31;::::0;;;:21:::1;:31;::::0;;;;;::::1;;29665:87;;;;-1:-1:-1::0;;;29665:87:2::1;;;;;;;:::i;:::-;9385:10:::2;9349:19;9371:25:::0;;;:13:::2;:25;::::0;;;;9414:19;;-1:-1:-1;;;9414:19:2;::::2;-1:-1:-1::0;;;;;9414:19:2::2;9406:90;;;;-1:-1:-1::0;;;9406:90:2::2;;;;;;;:::i;:::-;9506:80;9541:5;9548:14;9564:13;9579:6;9506:34;:80::i;:::-;29762:1;1515::9::1;9138:455:2::0;;;:::o;6343:522::-;1477:7:9;;;;1476:8;1468:37;;;;-1:-1:-1;;;1468:37:9;;;;;;;:::i;:::-;6584:10:2::1;29673:31;::::0;;;:21:::1;:31;::::0;;;;;::::1;;29665:87;;;;-1:-1:-1::0;;;29665:87:2::1;;;;;;;:::i;:::-;6642:10:::2;6606:19;6628:25:::0;;;:13:::2;:25;::::0;;;;6663:26:::2;6680:8:::0;6663:16:::2;:26::i;:::-;6699:80;6734:5;6741:14;6757:13;6772:6;6699:34;:80::i;:::-;6793:14:::0;;:18;6789:70:::2;;6827:21;6840:7;6827:12;:21::i;:::-;29762:1;1515::9::1;6343:522:2::0;;;;;:::o;3947:140::-;1485:12:8;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:8;;;:22;;;1467:67;;;;-1:-1:-1;;;1467:67:8;;;;;;;:::i;:::-;-1:-1:-1;;;;;4039:25:2;;;::::1;;::::0;;;:18:::1;:25;::::0;;;;:41;;-1:-1:-1;;4039:41:2::1;::::0;::::1;;::::0;;;::::1;::::0;;3947:140::o;26959:74::-;1485:12:8;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:8;;;:22;;;1467:67;;;;-1:-1:-1;;;1467:67:8;;;;;;;:::i;:::-;1668:7:9::1;::::0;::::1;;1660:40;;;;-1:-1:-1::0;;;1660:40:9::1;;;;;;;:::i;:::-;27016:10:2::2;:8;:10::i;:::-;26959:74::o:0;1248:76:9:-;1310:7;;;;1248:76;:::o;1894:145:8:-;1485:12;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:8;;;:22;;;1467:67;;;;-1:-1:-1;;;1467:67:8;;;;;;;:::i;:::-;1984:6:::1;::::0;1963:40:::1;::::0;2000:1:::1;::::0;-1:-1:-1;;;;;1984:6:8::1;::::0;1963:40:::1;::::0;2000:1;;1963:40:::1;2013:6;:19:::0;;-1:-1:-1;;;;;;2013:19:8::1;::::0;;1894:145::o;3596:101:2:-;1024:12:7;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:7;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:7;;;;;;;:::i;:::-;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:7;;;;;1225:18;1213:4;1225:18;;;1170:80;3647:16:2::1;:14;:16::i;:::-;3673:17;:15;:17::i;:::-;1268:14:7::0;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:7;;;3596:101:2;:::o;4366:165::-;1485:12:8;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:8;;;:22;;;1467:67;;;;-1:-1:-1;;;1467:67:8;;;;;;;:::i;:::-;-1:-1:-1;;;;;4470:38:2;;;::::1;;::::0;;;:21:::1;:38;::::0;;;;:54;;-1:-1:-1;;4470:54:2::1;::::0;::::1;;::::0;;;::::1;::::0;;4366:165::o;26796:73::-;1485:12:8;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:8;;;:22;;;1467:67;;;;-1:-1:-1;;;1467:67:8;;;;;;;:::i;:::-;1477:7:9::1;::::0;::::1;;1476:8;1468:37;;;;-1:-1:-1::0;;;1468:37:9::1;;;;;;;:::i;:::-;26854:8:2::2;:6;:8::i;1271:77:8:-:0;1335:6;;-1:-1:-1;;;;;1335:6:8;1271:77;:::o;2326:46:2:-;;;;;;;;;;;;-1:-1:-1;;;;;2326:46:2;;;;-1:-1:-1;;;2326:46:2;;;;:::o;2629:53::-;;;;;;;;;;;;;;;:::o;2495:50::-;;;;;;;;;;;;;;;:::o;7628:308::-;7681:10;29673:31;;;;:21;:31;;;;;;;;29665:87;;;;-1:-1:-1;;;29665:87:2;;;;;;;:::i;:::-;7739:10:::1;7703:19;7725:25:::0;;;:13:::1;:25;::::0;;;;7768:19;;-1:-1:-1;;;7768:19:2;::::1;-1:-1:-1::0;;;;;7768:19:2::1;7760:90;;;;-1:-1:-1::0;;;7760:90:2::1;;;;;;;:::i;:::-;7860:23:::0;;-1:-1:-1;;;;7860:23:2::1;::::0;;7898:31:::1;::::0;7915:10:::1;::::0;7898:31:::1;::::0;::::1;::::0;7882:1:::1;::::0;7898:31:::1;:::i;:::-;;;;;;;;29762:1;7628:308:::0;:::o;27640:237::-;27786:7;27839;27848:13;27863:5;27822:47;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27812:58;;;;;;27805:65;;27640:237;;;;;;:::o;11869:4319::-;1477:7:9;;;;1476:8;1468:37;;;;-1:-1:-1;;;1468:37:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;12350:31:2;::::1;;::::0;;;:21:::1;:31;::::0;;;;;::::1;;12342:87;;;;-1:-1:-1::0;;;12342:87:2::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;12461:23:2;::::1;12439:19;12461:23:::0;;;:13:::1;:23;::::0;;;;-1:-1:-1;;;;;12502:18:2;::::1;12494:78;;;;-1:-1:-1::0;;;12494:78:2::1;;;;;;;:::i;:::-;12597:1;12590:4;-1:-1:-1::0;;;;;12590:8:2::1;;12582:65;;;;-1:-1:-1::0;;;12582:65:2::1;;;;;;;:::i;:::-;12665:19:::0;;-1:-1:-1;;;12665:19:2;::::1;-1:-1:-1::0;;;;;12665:19:2::1;12657:90;;;;-1:-1:-1::0;;;12657:90:2::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;12765:25:2;::::1;;::::0;;;:18:::1;:25;::::0;;;;;::::1;;12757:95;;;;-1:-1:-1::0;;;12757:95:2::1;;;;;;;:::i;:::-;13041:40:::0;;:44;13037:275:::1;;13101:200;13131:33;13182:27;13227:25;13278:8;13101:12;:200::i;:::-;13701:26;13730:55;13752:13;13767:10;13779:5;13730:21;:55::i;:::-;14023:43;::::0;;;:23:::1;::::0;;::::1;:43;::::0;;;;;:58:::1;::::0;:43;;-1:-1:-1;;;;14023:58:2;::::1;-1:-1:-1::0;;;;;14023:58:2::1;:63:::0;14019:423:::1;;14156:18;::::0;;14172:1:::1;14156:18:::0;;;;;::::1;::::0;;;14102:51:::1;::::0;14156:18:::1;;;;;;;;;;;;;;;;;-1:-1:-1::0;;14216:16:2::1;::::0;;14230:1:::1;14216:16:::0;;;;;::::1;::::0;;;14102:72;;-1:-1:-1;14188:25:2::1;::::0;14216:16;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;14216:16:2::1;14188:44;;14284:13;14246:32;14279:1;14246:35;;;;;;;;;;;;;:51;;;;14325:10;14311:8;14320:1;14311:11;;;;;;;;;;;;;:24;-1:-1:-1::0;;;;;14311:24:2::1;;;-1:-1:-1::0;;;;;14311:24:2::1;;;::::0;::::1;14349:82;14362:32;14396:8;14406:5;14421:8;14349:12;:82::i;:::-;14019:423;;;-1:-1:-1::0;;;;;14474:33:2;::::1;14451:20;14474:33:::0;;;:26:::1;::::0;::::1;:33;::::0;;;;;;;-1:-1:-1;;;;;14474:48:2;::::1;::::0;;;;;;;;-1:-1:-1;;;;;14474:48:2::1;14540:17:::0;14532:83:::1;;;;-1:-1:-1::0;;;14532:83:2::1;;;;;;;:::i;:::-;14705:27;14735:43:::0;;;:23:::1;::::0;::::1;:43;::::0;;;;14967:21:::1;14982:5:::0;14967:14:::1;:21::i;:::-;14963:70;;;15013:9;15004:18;;14963:70;15070:24;::::0;::::1;::::0;:36:::1;::::0;15099:6;15070:28:::1;:36::i;:::-;15043:24;::::0;::::1;:63:::0;15165:22:::1;-1:-1:-1::0;;;;;15165:8:2;::::1;-1:-1:-1::0;;;;;15165:22:2;::::1;:8;:22::i;:::-;15137:9;:24;;;:50;;15116:170;;;;-1:-1:-1::0;;;15116:170:2::1;;;;;;;:::i;:::-;15296:14;::::0;::::1;:21:::0;;-1:-1:-1;;15296:21:2::1;-1:-1:-1::0;;;;;15296:21:2;;::::1;::::0;;;::::1;::::0;;;15327:37;;-1:-1:-1;;;;;;15327:37:2::1;-1:-1:-1::0;;;;;15327:37:2;::::1;;-1:-1:-1::0;;;;15374:39:2::1;-1:-1:-1::0;;;15374:39:2;;::::1;::::0;;;::::1;;::::0;;15578:7:::1;:5;:7::i;:::-;15543:24;::::0;::::1;:43:::0;;-1:-1:-1;;;;;15543:43:2;;;::::1;-1:-1:-1::0;;;15543:43:2::1;-1:-1:-1::0;;;;;;;;15543:43:2;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;15604:23:2;::::1;-1:-1:-1::0;15604:23:2;;;:13:::1;:23;::::0;;;;15669:22;;15604:23;;-1:-1:-1;15669:32:2::1;::::0;-1:-1:-1;;;;;15669:22:2;;::::1;::::0;:32;::::1;:26;:32::i;:::-;15637:65:::0;;-1:-1:-1;;15637:65:2::1;-1:-1:-1::0;;;;;15637:65:2;;::::1;;::::0;;;-1:-1:-1;;;15746:19:2;::::1;::::0;::::1;15720:22:::0;::::1;:45;;15712:103;;;;-1:-1:-1::0;;;15712:103:2::1;;;;;;;:::i;:::-;15831:21;15846:5;15831:14;:21::i;:::-;15826:118;;15868:65;-1:-1:-1::0;;;;;15868:30:2;::::1;15899:10;15919:4;15926:6:::0;15868:30:::1;:65::i;:::-;16035:8;-1:-1:-1::0;;;;;15958:223:2::1;16011:10;-1:-1:-1::0;;;;;15958:223:2::1;;15984:13;16057:4;16075:13;16102:12;16128:5;16147:9;:24;;;15958:223;;;;;;;;;;;:::i;:::-;;;;;;;;1515:1:9;;;;11869:4319:2::0;;;;;;;;;:::o;21915:447::-;-1:-1:-1;;;;;29673:31:2;;;;;;:21;:31;;;;;;22163:8;;29673:31;;29665:87;;;;-1:-1:-1;;;29665:87:2;;;;;;;:::i;:::-;22183:172:::1;22209:33;22256:27;22297:26;22337:8;22183:12;:172::i;24124:141::-:0;-1:-1:-1;;;;;24214:21:2;24190:4;24214:21;;;:13;:21;;;;;:38;-1:-1:-1;;;;;24214:38:2;:43;;;24124:141::o;2188:240:8:-;1485:12;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:8;;;:22;;;1467:67;;;;-1:-1:-1;;;1467:67:8;;;;;;;:::i;:::-;-1:-1:-1;;;;;2276:22:8;::::1;2268:73;;;;-1:-1:-1::0;;;2268:73:8::1;;;;;;;:::i;:::-;2377:6;::::0;2356:38:::1;::::0;-1:-1:-1;;;;;2356:38:8;;::::1;::::0;2377:6:::1;::::0;2356:38:::1;::::0;2377:6:::1;::::0;2356:38:::1;2404:6;:17:::0;;-1:-1:-1;;;;;;2404:17:8::1;-1:-1:-1::0;;;;;2404:17:8;;;::::1;::::0;;;::::1;::::0;;2188:240::o;6985:341:2:-;1477:7:9;;;;1476:8;1468:37;;;;-1:-1:-1;;;1468:37:9;;;;;;;:::i;:::-;7069:10:2::1;29673:31;::::0;;;:21:::1;:31;::::0;;;;;::::1;;29665:87;;;;-1:-1:-1::0;;;29665:87:2::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7099:13:2;::::2;7091:78;;;;-1:-1:-1::0;;;7091:78:2::2;;;;;;;:::i;:::-;7215:10;7179:19;7201:25:::0;;;:13:::2;:25;::::0;;;;;;7236:30;;-1:-1:-1;;;;7236:30:2::2;-1:-1:-1::0;;;;;;;;7236:30:2;::::2;;;::::0;;7281:38;;7201:25;;7215:10;7281:38:::2;::::0;::::2;::::0;7236:30;;7281:38:::2;:::i;:::-;;;;;;;;29762:1;1515::9::1;6985:341:2::0;:::o;27883:662::-;27964:7;28042:24;28069:42;28088:9;:22;;;-1:-1:-1;;;;;28069:42:2;:9;:14;;;-1:-1:-1;;;;;28069:18:2;;;:42;;;;:::i;:::-;28042:69;;28121:30;28154:66;28196:9;:23;;;-1:-1:-1;;;;;28154:66:2;:37;28166:9;:24;;;-1:-1:-1;;;;;28154:37:2;:7;:5;:7::i;:37::-;:41;;:66::i;:::-;28121:99;-1:-1:-1;28230:18:2;28251:44;28121:99;28278:16;28251:26;:44::i;:::-;28230:65;;28379:9;:24;;;28366:10;:37;28362:149;;;28432:68;28483:16;28432:46;28461:16;28432:9;:24;;;:28;;:46;;;;:::i;:::-;:50;;:68::i;:::-;28419:81;;28362:149;28528:10;27883:662;-1:-1:-1;;;;27883:662:2:o;1329:134:12:-;1387:7;1413:43;1417:1;1420;1413:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1406:50;;1329:134;;;;;:::o;29491:111:2:-;-1:-1:-1;;;;;29576:19:2;;;29491:111::o;704:175:15:-;786:86;806:5;836:23;;;861:2;865:5;813:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;813:58:15;;;;;;;;;;;;;;-1:-1:-1;;;;;813:58:15;-1:-1:-1;;;;;;813:58:15;;;;;;;;;;786:19;:86::i;:::-;704:175;;;:::o;2188:459:12:-;2246:7;2487:6;2483:45;;-1:-1:-1;2516:1:12;2509:8;;2483:45;2550:5;;;2554:1;2550;:5;:1;2573:5;;;;;:10;2565:56;;;;-1:-1:-1;;;2565:56:12;;;;;;;:::i;882:176::-;940:7;971:5;;;994:6;;;;986:46;;;;-1:-1:-1;;;986:46:12;;;;;;;:::i;885:203:15:-;985:96;1005:5;1035:27;;;1064:4;1070:2;1074:5;1012:68;;;;;;;;;;:::i;985:96::-;885:203;;;;:::o;29141:114:2:-;29228:10;-1:-1:-1;;;;;29213:35:2;;29240:7;29213:35;;;;;;:::i;:::-;;;;;;;;29141:114;:::o;23567:551::-;23826:9;23821:291;23841:6;:13;23837:1;:17;23821:291;;;23939:9;23934:168;23954:14;23969:1;23954:17;;;;;;;;;;;;;;:24;23950:1;:28;23934:168;;;24003:84;24027:5;24034:6;24041:1;24034:9;;;;;;;;;;;;;;24045:14;24060:1;24045:17;;;;;;;;;;;;;;24063:1;24045:20;;;;;;;;;;;;;;24067:13;24081:1;24067:16;;;;;;;;;;;;;;24084:1;24067:19;;;;;;;;;;;;;;24003:23;:84::i;:::-;23980:3;;23934:168;;;-1:-1:-1;23856:3:2;;23821:291;;931:104:6;1018:10;931:104;:::o;1950:117:9:-;1668:7;;;;1660:40;;;;-1:-1:-1;;;1660:40:9;;;;;;;:::i;:::-;2008:7:::1;:15:::0;;-1:-1:-1;;2008:15:9::1;::::0;;2038:22:::1;2047:12;:10;:12::i;:::-;2038:22;;;;;;:::i;:::-;;;;;;;;1950:117::o:0;1409:498:7:-;1820:4;1864:17;1895:7;1409:498;:::o;867:126:8:-;1024:12:7;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:7;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:7;;;;;;;:::i;:::-;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:7;;;;;1225:18;1213:4;1225:18;;;1170:80;924:26:8::1;:24;:26::i;:::-;960;:24;:26::i;925:128:9:-:0;1024:12:7;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:7;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:7;;;;;;;:::i;:::-;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:7;;;;;1225:18;1213:4;1225:18;;;1170:80;983:26:9::1;:24;:26::i;:::-;1019:27;:25;:27::i;1776:115::-:0;1477:7;;;;1476:8;1468:37;;;;-1:-1:-1;;;1468:37:9;;;;;;;:::i;:::-;1835:7:::1;:14:::0;;-1:-1:-1;;1835:14:9::1;1845:4;1835:14;::::0;;1864:20:::1;1871:12;:10;:12::i;24316:2393:2:-:0;-1:-1:-1;;;;;24577:23:2;;24555:19;24577:23;;;:13;:23;;;;;;24555:19;24639:1698;24661:32;:39;24657:1;:43;;;24639:1698;;;24721:26;24766:195;24809:32;24842:1;24809:35;;;;;;;;;;;;;;;;24866:27;24894:1;24866:30;;;;;;;;;;;;;;;;24918:25;24766:21;:195::i;:::-;24975:27;25005:43;;;:23;;;;:43;;;;;;25070:14;;;;24721:240;;-1:-1:-1;25005:43:2;-1:-1:-1;;;;;25070:14:2;25062:86;;;;-1:-1:-1;;;25062:86:2;;;;;;;:::i;:::-;25222:24;;;;-1:-1:-1;;;25222:24:2;;-1:-1:-1;;;;;25222:24:2;25214:79;;;;-1:-1:-1;;;25214:79:2;;;;;;;:::i;:::-;25329:31;;;;;;;;;;-1:-1:-1;;;;;25329:31:2;;;;;-1:-1:-1;;;;;;;;25329:31:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25329:31:2;;;;;;;;;25308:18;;25329:31;;:20;:31::i;:::-;25308:52;-1:-1:-1;25378:14:2;;25374:953;;25439:24;;;;:40;;25468:10;25439:28;:40::i;:::-;25412:24;;;:67;25510:26;:10;25525;25510:14;:26::i;:::-;25685:14;;;;25658:22;;25497:39;;-1:-1:-1;25658:42:2;;-1:-1:-1;;;;;25658:22:2;;-1:-1:-1;;;;;25685:14:2;25658:26;:42::i;:::-;25631:9;:24;;;:69;25627:583;;;25774:24;;;:28;;-1:-1:-1;;;;;;;;25774:28:2;;;;;25898:22;;:42;;-1:-1:-1;;;;;25898:22:2;;;;25925:14;25898:26;:42::i;:::-;25866:75;;-1:-1:-1;;25866:75:2;-1:-1:-1;;;;;25866:75:2;;;;;;;25968:36;;25985:18;;25968:36;;-1:-1:-1;;25968:36:2;25627:583;;;26183:7;:5;:7::i;:::-;26148:9;:24;;;:43;;;;;-1:-1:-1;;;;;26148:43:2;;;;;-1:-1:-1;;;;;26148:43:2;;;;;;25627:583;26286:25;-1:-1:-1;;;;;26233:79:2;26254:18;26233:79;26274:10;26233:79;;;;;;:::i;:::-;;;;;;;;25374:953;-1:-1:-1;;;24702:3:2;;24639:1698;;;-1:-1:-1;26351:14:2;;26347:356;;26385:41;26400:25;26385:14;:41::i;:::-;26381:312;;;26447:12;26465:8;-1:-1:-1;;;;;26465:13:2;26486:10;26465:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26446:55;;;26527:7;26519:52;;;;-1:-1:-1;;;26519:52:2;;;;;;;:::i;:::-;26381:312;;;;26610:68;-1:-1:-1;;;;;26610:46:2;;26657:8;26667:10;26610:46;:68::i;29351:84::-;29425:3;29351:84;:::o;3109:130:12:-;3167:7;3193:39;3197:1;3200;3193:39;;;;;;;;;;;;;;;;;:3;:39::i;1754:187::-;1840:7;1875:12;1867:6;;;;1859:29;;;;-1:-1:-1;;;1859:29:12;;;;;;;;:::i;:::-;-1:-1:-1;;;1910:5:12;;;1754:187::o;2967:751:15:-;3386:23;3412:69;3440:4;3412:69;;;;;;;;;;;;;;;;;3420:5;-1:-1:-1;;;;;3412:27:15;;;:69;;;;;:::i;:::-;3495:17;;3386:95;;-1:-1:-1;3495:21:15;3491:221;;3635:10;3624:30;;;;;;;;;;;;:::i;:::-;3616:85;;;;-1:-1:-1;;;3616:85:15;;;;;;;:::i;28672:463:2:-;893:8;-1:-1:-1;;;;;28836:28:2;;;;28828:90;;;;-1:-1:-1;;;28828:90:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;28936:25:2;;;;;;:18;:25;;;;;;;;28928:78;;;;-1:-1:-1;;;28928:78:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;29016:33:2;;;;;;:26;;;:33;;;;;;;;-1:-1:-1;;;;;29016:41:2;;;;;;;;;;;:49;;-1:-1:-1;;;;;;29016:49:2;-1:-1:-1;;;;;29016:49:2;;;;;29080:48;29095:10;;29080:48;;;;29016:33;;:41;;:49;;29080:48;:::i;:::-;;;;;;;;28672:463;;;;:::o;858:66:6:-;1024:12:7;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:7;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:7;;;;;;;:::i;:::-;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:7;;;;;1225:18;1213:4;1225:18;;;1268:14;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:7;;;858:66:6;:::o;999:195:8:-;1024:12:7;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:7;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:7;;;;;;;:::i;:::-;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:7;;;;;1225:18;1213:4;1225:18;;;1170:80;1068:17:8::1;1088:12;:10;:12::i;:::-;1110:6;:18:::0;;-1:-1:-1;;;;;;1110:18:8::1;-1:-1:-1::0;;;;;1110:18:8;::::1;::::0;;::::1;::::0;;;1143:43:::1;::::0;1110:18;;-1:-1:-1;1110:18:8;-1:-1:-1;;1143:43:8::1;::::0;-1:-1:-1;;1143:43:8::1;1256:1:7;1268:14:::0;1264:55;;;1307:5;1292:20;;-1:-1:-1;;1292:20:7;;;999:195:8;:::o;1059:93:9:-;1024:12:7;;;;;;;;:31;;;1040:15;:13;:15::i;:::-;1024:47;;;-1:-1:-1;1060:11:7;;;;1059:12;1024:47;1016:106;;;;-1:-1:-1;;;1016:106:7;;;;;;;:::i;:::-;1129:19;1152:12;;;;;;1151:13;1170:80;;;;1198:12;:19;;-1:-1:-1;;;;1198:19:7;;;;;1225:18;1213:4;1225:18;;;1170:80;1129:7:9::1;:15:::0;;-1:-1:-1;;1129:15:9::1;::::0;;1264:55:7;;;;1307:5;1292:20;;-1:-1:-1;;1292:20:7;;;1059:93:9;:::o;3721:272:12:-;3807:7;3841:12;3834:5;3826:28;;;;-1:-1:-1;;;3826:28:12;;;;;;;;:::i;:::-;;3864:9;3880:1;3876;:5;;;;;;;3721:272;-1:-1:-1;;;;;3721:272:12:o;3581:193:16:-;3684:12;3715:52;3737:6;3745:4;3751:1;3754:12;3684;4858:18;4869:6;4858:10;:18::i;:::-;4850:60;;;;-1:-1:-1;;;4850:60:16;;;;;;;:::i;:::-;4981:12;4995:23;5022:6;-1:-1:-1;;;;;5022:11:16;5042:5;5050:4;5022:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4980:75;;;;5072:52;5090:7;5099:10;5111:12;5072:17;:52::i;:::-;5065:59;4608:523;-1:-1:-1;;;;;;;4608:523:16:o;726:413::-;1086:20;1124:8;;;726:413::o;6111:725::-;6226:12;6254:7;6250:580;;;-1:-1:-1;6284:10:16;6277:17;;6250:580;6395:17;;:21;6391:429;;6653:10;6647:17;6713:15;6700:10;6696:2;6692:19;6685:44;6602:145;6792:12;6785:20;;-1:-1:-1;;;6785:20:16;;;;;;;;:::i;5:130:-1:-;72:20;;97:33;72:20;97:33;:::i;313:707::-;;430:3;423:4;415:6;411:17;407:27;397:2;;-1:-1;;438:12;397:2;485:6;472:20;507:80;522:64;579:6;522:64;:::i;:::-;507:80;:::i;:::-;615:21;;;498:89;-1:-1;659:4;672:14;;;;647:17;;;761;;;752:27;;;;749:36;-1:-1;746:2;;;798:1;;788:12;746:2;823:1;808:206;833:6;830:1;827:13;808:206;;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;901:50;;965:14;;;;993;;;;855:1;848:9;808:206;;;812:14;;;;;390:630;;;;:::o;1048:753::-;;1190:3;1183:4;1175:6;1171:17;1167:27;1157:2;;-1:-1;;1198:12;1157:2;1245:6;1232:20;1267:105;1282:89;1364:6;1282:89;:::i;1267:105::-;1400:21;;;1258:114;-1:-1;1444:4;1457:14;;;;1432:17;;;1552:1;1537:258;1562:6;1559:1;1556:13;1537:258;;;1669:62;1727:3;1444:4;1645:3;1632:17;1436:6;1620:30;;1669:62;:::i;:::-;1657:75;;1746:14;;;;1774;;;;1584:1;1577:9;1537:258;;1829:753;;1971:3;1964:4;1956:6;1952:17;1948:27;1938:2;;-1:-1;;1979:12;1938:2;2026:6;2013:20;2048:105;2063:89;2145:6;2063:89;:::i;2048:105::-;2181:21;;;2039:114;-1:-1;2225:4;2238:14;;;;2213:17;;;2333:1;2318:258;2343:6;2340:1;2337:13;2318:258;;;2426:3;2413:17;2217:6;2401:30;4235:3;4216:17;2401:30;4216:17;4212:27;4202:2;;2333:1;;4243:12;4202:2;2225:4;2401:30;;4277:20;4312:80;4327:64;4384:6;4327:64;:::i;4312:80::-;4420:21;;;4477:14;;;;4452:17;;;;4566;;;4557:27;;;;4554:36;-1:-1;4551:2;;;2333:1;;4593:12;4551:2;2333:1;4619:10;;4613:206;4638:6;4635:1;4632:13;4613:206;;;6778:6;6765:20;6756:29;;6790:33;6817:5;6790:33;:::i;:::-;4706:50;;;2365:1;4653:9;;;;;4770:14;;;;4798;;4613:206;;;-1:-1;;2438:75;;-1:-1;;;2527:14;;;;2555;;;;2365:1;2358:9;2318:258;;2609:750;;2750:3;2743:4;2735:6;2731:17;2727:27;2717:2;;-1:-1;;2758:12;2717:2;2805:6;2792:20;2827:104;2842:88;2923:6;2842:88;:::i;2827:104::-;2959:21;;;2818:113;-1:-1;3003:4;3016:14;;;;2991:17;;;3111:1;3096:257;3121:6;3118:1;3115:13;3096:257;;;3204:3;3191:17;2995:6;3179:30;5699:3;5680:17;3179:30;5680:17;5676:27;5666:2;;3111:1;;5707:12;5666:2;3003:4;3179:30;;5741:20;5776:79;5791:63;5847:6;5791:63;:::i;5776:79::-;5883:21;;;5940:14;;;;5915:17;;;;6029;;;6020:27;;;;6017:36;-1:-1;6014:2;;;3111:1;;6056:12;6014:2;3111:1;6082:10;;6076:205;6101:6;6098:1;6095:13;6076:205;;;6181:36;6213:3;6201:10;6181:36;:::i;:::-;6169:49;;3143:1;6116:9;;;;;6232:14;;;;6260;;6076:205;;;-1:-1;;3216:74;;-1:-1;;;3304:14;;;;3332;;;;3143:1;3136:9;3096:257;;3385:707;;3502:3;3495:4;3487:6;3483:17;3479:27;3469:2;;-1:-1;;3510:12;3469:2;3557:6;3544:20;3579:80;3594:64;3651:6;3594:64;:::i;3579:80::-;3687:21;;;3570:89;-1:-1;3731:4;3744:14;;;;3719:17;;;3833;;;3824:27;;;;3821:36;-1:-1;3818:2;;;3870:1;;3860:12;3818:2;3895:1;3880:206;3905:6;3902:1;3899:13;3880:206;;;6628:20;;3973:50;;4037:14;;;;4065;;;;3927:1;3920:9;3880:206;;6972:128;7038:20;;-1:-1;;;;;55496:30;;57532:34;;57522:2;;57580:1;;57570:12;7107:241;;7211:2;7199:9;7190:7;7186:23;7182:32;7179:2;;;-1:-1;;7217:12;7179:2;85:6;72:20;97:33;124:5;97:33;:::i;7355:360::-;;;7473:2;7461:9;7452:7;7448:23;7444:32;7441:2;;;-1:-1;;7479:12;7441:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7531:63;-1:-1;7631:2;7667:22;;6359:20;6384:30;6359:20;6384:30;:::i;:::-;7639:60;;;;7435:280;;;;;:::o;7722:753::-;;;;;7902:3;7890:9;7881:7;7877:23;7873:33;7870:2;;;-1:-1;;7909:12;7870:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7961:63;-1:-1;8061:2;8100:22;;6902:20;;-1:-1;8197:2;8182:18;;8169:32;-1:-1;;;;;8210:30;;8207:2;;;-1:-1;;8243:12;8207:2;8273:78;8343:7;8334:6;8323:9;8319:22;8273:78;:::i;:::-;8263:88;;;8388:2;8431:9;8427:22;72:20;97:33;124:5;97:33;:::i;:::-;7864:611;;;;-1:-1;7864:611;;-1:-1;;7864:611::o;8482:955::-;;;;;8720:3;8708:9;8699:7;8695:23;8691:33;8688:2;;;-1:-1;;8727:12;8688:2;8785:17;8772:31;-1:-1;;;;;8823:18;8815:6;8812:30;8809:2;;;-1:-1;;8845:12;8809:2;8875:103;8970:7;8961:6;8950:9;8946:22;8875:103;:::i;:::-;8865:113;;9043:2;9032:9;9028:18;9015:32;9001:46;;8823:18;9059:6;9056:30;9053:2;;;-1:-1;;9089:12;9053:2;;9119:78;9189:7;9180:6;9169:9;9165:22;9119:78;:::i;:::-;9109:88;;;9234:2;9277:9;9273:22;72:20;97:33;124:5;97:33;:::i;:::-;9242:63;-1:-1;9342:2;9389:22;;217:20;242:41;217:20;242:41;:::i;9444:997::-;;;;9706:2;9694:9;9685:7;9681:23;9677:32;9674:2;;;-1:-1;;9712:12;9674:2;9770:17;9757:31;-1:-1;;;;;9808:18;9800:6;9797:30;9794:2;;;-1:-1;;9830:12;9794:2;9860:102;9954:7;9945:6;9934:9;9930:22;9860:102;:::i;:::-;9850:112;;10027:2;10016:9;10012:18;9999:32;9985:46;;9808:18;10043:6;10040:30;10037:2;;;-1:-1;;10073:12;10037:2;10103:103;10198:7;10189:6;10178:9;10174:22;10103:103;:::i;:::-;10093:113;;10271:2;10260:9;10256:18;10243:32;10229:46;;9808:18;10287:6;10284:30;10281:2;;;-1:-1;;10317:12;10281:2;;10347:78;10417:7;10408:6;10397:9;10393:22;10347:78;:::i;:::-;10337:88;;;9668:773;;;;;:::o;10448:377::-;;10577:2;10565:9;10556:7;10552:23;10548:32;10545:2;;;-1:-1;;10583:12;10545:2;10641:17;10628:31;-1:-1;;;;;10671:6;10668:30;10665:2;;;-1:-1;;10701:12;10665:2;10731:78;10801:7;10792:6;10781:9;10777:22;10731:78;:::i;10832:627::-;;;;10995:2;10983:9;10974:7;10970:23;10966:32;10963:2;;;-1:-1;;11001:12;10963:2;11059:17;11046:31;-1:-1;;;;;11089:6;11086:30;11083:2;;;-1:-1;;11119:12;11083:2;11149:78;11219:7;11210:6;11199:9;11195:22;11149:78;:::i;:::-;11139:88;;;11264:2;11307:9;11303:22;72:20;97:33;124:5;97:33;:::i;:::-;11272:63;-1:-1;11372:2;11411:22;;72:20;97:33;72:20;97:33;:::i;:::-;11380:63;;;;10957:502;;;;;:::o;11466:1025::-;;;;;11696:3;11684:9;11675:7;11671:23;11667:33;11664:2;;;-1:-1;;11703:12;11664:2;11761:17;11748:31;-1:-1;;;;;11799:18;11791:6;11788:30;11785:2;;;-1:-1;;11821:12;11785:2;11851:78;11921:7;11912:6;11901:9;11897:22;11851:78;:::i;:::-;11841:88;;11966:2;;;;12009:9;12005:22;72:20;97:33;124:5;97:33;:::i;:::-;11974:63;-1:-1;12102:2;12087:18;;12074:32;12115:30;;;12112:2;;;-1:-1;;12148:12;12112:2;12178:78;12248:7;12239:6;12228:9;12224:22;12178:78;:::i;:::-;12168:88;;;12321:2;12310:9;12306:18;12293:32;11799:18;12337:6;12334:30;12331:2;;;-1:-1;;12367:12;12331:2;12443:22;;;-1:-1;4961:4;4949:17;;4945:27;-1:-1;4935:2;;-1:-1;;4976:12;4935:2;5023:6;5010:20;5045:80;5060:64;5117:6;5060:64;:::i;5045:80::-;5153:21;;;5210:14;;;;5185:17;;;5299;;;5290:27;;;;5287:36;-1:-1;5284:2;;;-1:-1;;5326:12;5284:2;-1:-1;5352:10;;5346:206;5371:6;5368:1;5365:13;5346:206;;;6902:20;;5439:50;;5393:1;5386:9;;;;;5503:14;;;;5531;;5346:206;;;-1:-1;11658:833;;;;-1:-1;11658:833;;-1:-1;;;;;;11658:833::o;12498:1701::-;;;;;;;;;;12836:3;12824:9;12815:7;12811:23;12807:33;12804:2;;;-1:-1;;12843:12;12804:2;12901:17;12888:31;-1:-1;;;;;12939:18;12931:6;12928:30;12925:2;;;-1:-1;;12961:12;12925:2;12991:78;13061:7;13052:6;13041:9;13037:22;12991:78;:::i;:::-;12981:88;;13124:53;13169:7;13106:2;13149:9;13145:22;13124:53;:::i;:::-;13114:63;;13232:52;13276:7;13214:2;13256:9;13252:22;13232:52;:::i;:::-;13222:62;;13339:52;13383:7;13321:2;13363:9;13359:22;13339:52;:::i;:::-;13329:62;;13447:53;13492:7;13428:3;13472:9;13468:22;13447:53;:::i;:::-;13437:63;;13537:3;13581:9;13577:22;6902:20;13546:63;;13674:3;13663:9;13659:19;13646:33;13632:47;;12939:18;13691:6;13688:30;13685:2;;;-1:-1;;13721:12;13685:2;13751:103;13846:7;13837:6;13826:9;13822:22;13751:103;:::i;:::-;13741:113;;13919:3;13908:9;13904:19;13891:33;13877:47;;12939:18;13936:6;13933:30;13930:2;;;-1:-1;;13966:12;13930:2;;13996:78;14066:7;14057:6;14046:9;14042:22;13996:78;:::i;:::-;13986:88;;;14130:53;14175:7;14111:3;14155:9;14151:22;14130:53;:::i;:::-;14120:63;;12798:1401;;;;;;;;;;;:::o;14206:257::-;;14318:2;14306:9;14297:7;14293:23;14289:32;14286:2;;;-1:-1;;14324:12;14286:2;6507:6;6501:13;6519:30;6543:5;6519:30;:::i;14470:239::-;;14573:2;14561:9;14552:7;14548:23;14544:32;14541:2;;;-1:-1;;14579:12;14541:2;7051:6;7038:20;-1:-1;;;;;57559:5;55496:30;57535:5;57532:34;57522:2;;-1:-1;;57570:12;14716:1383;;;;;;15036:3;15024:9;15015:7;15011:23;15007:33;15004:2;;;-1:-1;;15043:12;15004:2;15105:52;15149:7;15125:22;15105:52;:::i;:::-;15095:62;;15222:2;15211:9;15207:18;15194:32;-1:-1;;;;;15246:18;15238:6;15235:30;15232:2;;;-1:-1;;15268:12;15232:2;15298:102;15392:7;15383:6;15372:9;15368:22;15298:102;:::i;:::-;15288:112;;15465:2;15454:9;15450:18;15437:32;15423:46;;15246:18;15481:6;15478:30;15475:2;;;-1:-1;;15511:12;15475:2;15541:103;15636:7;15627:6;15616:9;15612:22;15541:103;:::i;:::-;15531:113;;15709:2;15698:9;15694:18;15681:32;15667:46;;15246:18;15725:6;15722:30;15719:2;;;-1:-1;;15755:12;15719:2;15785:78;15855:7;15846:6;15835:9;15831:22;15785:78;:::i;:::-;15775:88;;15928:3;15917:9;15913:19;15900:33;15886:47;;15246:18;15945:6;15942:30;15939:2;;;-1:-1;;15975:12;15939:2;;16005:78;16075:7;16066:6;16055:9;16051:22;16005:78;:::i;:::-;15995:88;;;14998:1101;;;;;;;;:::o;16945:690::-;;17138:5;53639:12;54183:6;54178:3;54171:19;54220:4;;54215:3;54211:14;17150:93;;54220:4;17314:5;53493:14;-1:-1;17353:260;17378:6;17375:1;17372:13;17353:260;;;17439:13;;18588:37;;16260:14;;;;54026;;;;17400:1;17393:9;17353:260;;;-1:-1;17619:10;;17069:566;-1:-1;;;;;17069:566::o;31772:613::-;;56688:14;;;16894:5;56692:2;56688:14;;16851:3;16844:58;32103:2;32098:3;32094:12;17885:5;53639:12;53502:4;;18079:5;53493:14;-1:-1;18118:268;18143:6;18140:1;18137:13;18118:268;;;18204:13;;18588:37;;16260:14;;;;54026;;;;18165:1;18158:9;18118:268;;;-1:-1;;;;56692:2;56688:14;;;;;16844:58;;-1:-1;;32103:2;32348:12;;31994:391;-1:-1;;31994:391::o;32392:271::-;;19035:5;53639:12;19146:52;19191:6;19186:3;19179:4;19172:5;19168:16;19146:52;:::i;:::-;19210:16;;;;;32526:137;-1:-1;;32526:137::o;32670:379::-;33034:10;32858:191::o;33056:222::-;-1:-1;;;;;55290:54;;;;16706:37;;33183:2;33168:18;;33154:124::o;33530:444::-;-1:-1;;;;;55290:54;;;16706:37;;55290:54;;;;33877:2;33862:18;;16706:37;33960:2;33945:18;;18588:37;;;;33713:2;33698:18;;33684:290::o;33981:333::-;-1:-1;;;;;55290:54;;;;16706:37;;34300:2;34285:18;;18588:37;34136:2;34121:18;;34107:207::o;34321:440::-;-1:-1;;;;;55290:54;;;;16706:37;;-1:-1;;;;;55496:30;;;;34664:2;34649:18;;31724:36;-1:-1;;;;;55170:46;34747:2;34732:18;;31486:37;34502:2;34487:18;;34473:288::o;34768:370::-;;34945:2;34966:17;34959:47;35020:108;34945:2;34934:9;34930:18;35114:6;35020:108;:::i;35145:920::-;;35458:3;35480:17;35473:47;35534:108;35458:3;35447:9;35443:19;35628:6;35534:108;:::i;:::-;-1:-1;;;;;55496:30;;;35719:2;35704:18;;31724:36;55496:30;;;;35800:2;35785:18;;31724:36;-1:-1;;;;;55170:46;;;;35883:2;35868:18;;31486:37;-1:-1;;;;;55290:54;;;;35966:3;35951:19;;16706:37;56688:14;36035:19;;;18588:37;35526:116;35429:636;-1:-1;;35429:636::o;36072:210::-;55003:13;;54996:21;18481:34;;36193:2;36178:18;;36164:118::o;36289:222::-;18588:37;;;36416:2;36401:18;;36387:124::o;36518:236::-;-1:-1;;;;;55496:30;;;;19316:57;;36652:2;36637:18;;36623:131::o;36761:310::-;;36908:2;36929:17;36922:47;19530:5;53639:12;54183:6;36908:2;36897:9;36893:18;54171:19;19624:52;19669:6;54211:14;36897:9;54211:14;36908:2;19650:5;19646:16;19624:52;:::i;:::-;56597:7;56581:14;-1:-1;;56577:28;19688:39;;;;54211:14;19688:39;;36879:192;-1:-1;;36879:192::o;37078:416::-;37278:2;37292:47;;;19964:2;37263:18;;;54171:19;-1:-1;;;54211:14;;;19980:43;20042:12;;;37249:245::o;37501:416::-;37701:2;37715:47;;;20293:2;37686:18;;;54171:19;20329:34;54211:14;;;20309:55;-1:-1;;;20384:12;;;20377:39;20435:12;;;37672:245::o;37924:416::-;38124:2;38138:47;;;20686:2;38109:18;;;54171:19;20722:34;54211:14;;;20702:55;-1:-1;;;20777:12;;;20770:30;20819:12;;;38095:245::o;38347:416::-;38547:2;38561:47;;;21070:2;38532:18;;;54171:19;21106:29;54211:14;;;21086:50;21155:12;;;38518:245::o;38770:416::-;38970:2;38984:47;;;21406:2;38955:18;;;54171:19;21442:34;54211:14;;;21422:55;21511:27;21497:12;;;21490:49;21558:12;;;38941:245::o;39193:416::-;39393:2;39407:47;;;21809:2;39378:18;;;54171:19;21845:34;54211:14;;;21825:55;-1:-1;;;21900:12;;;21893:41;21953:12;;;39364:245::o;39616:416::-;39816:2;39830:47;;;22204:2;39801:18;;;54171:19;22240:34;54211:14;;;22220:55;-1:-1;;;22295:12;;;22288:45;22352:12;;;39787:245::o;40039:416::-;40239:2;40253:47;;;22603:2;40224:18;;;54171:19;22639:34;54211:14;;;22619:55;-1:-1;;;22694:12;;;22687:42;22748:12;;;40210:245::o;40462:416::-;40662:2;40676:47;;;22999:2;40647:18;;;54171:19;23035:34;54211:14;;;23015:55;-1:-1;;;23090:12;;;23083:25;23127:12;;;40633:245::o;41308:416::-;41508:2;41522:47;;;23762:2;41493:18;;;54171:19;23798:34;54211:14;;;23778:55;-1:-1;;;23853:12;;;23846:27;23892:12;;;41479:245::o;41731:416::-;41931:2;41945:47;;;24143:2;41916:18;;;54171:19;24179:34;54211:14;;;24159:55;24248:34;24234:12;;;24227:56;-1:-1;;;24303:12;;;24296:33;24348:12;;;41902:245::o;42154:416::-;42354:2;42368:47;;;24599:2;42339:18;;;54171:19;24635:34;54211:14;;;24615:55;-1:-1;;;24690:12;;;24683:37;24739:12;;;42325:245::o;42577:416::-;42777:2;42791:47;;;24990:2;42762:18;;;54171:19;25026:34;54211:14;;;25006:55;-1:-1;;;25081:12;;;25074:36;25129:12;;;42748:245::o;43000:416::-;43200:2;43214:47;;;25380:2;43185:18;;;54171:19;25416:34;54211:14;;;25396:55;-1:-1;;;25471:12;;;25464:35;25518:12;;;43171:245::o;43423:416::-;43623:2;43637:47;;;25769:2;43608:18;;;54171:19;-1:-1;;;54211:14;;;25785:39;25843:12;;;43594:245::o;43846:416::-;44046:2;44060:47;;;26094:2;44031:18;;;54171:19;26130:34;54211:14;;;26110:55;-1:-1;;;26185:12;;;26178:46;26243:12;;;44017:245::o;44269:416::-;44469:2;44483:47;;;26494:2;44454:18;;;54171:19;26530:34;54211:14;;;26510:55;-1:-1;;;26585:12;;;26578:32;26629:12;;;44440:245::o;44692:416::-;44892:2;44906:47;;;26880:2;44877:18;;;54171:19;26916:34;54211:14;;;26896:55;-1:-1;;;26971:12;;;26964:35;27018:12;;;44863:245::o;45115:416::-;45315:2;45329:47;;;27269:2;45300:18;;;54171:19;27305:34;54211:14;;;27285:55;-1:-1;;;27360:12;;;27353:28;27400:12;;;45286:245::o;45538:416::-;45738:2;45752:47;;;27651:2;45723:18;;;54171:19;27687:34;54211:14;;;27667:55;-1:-1;;;27742:12;;;27735:25;27779:12;;;45709:245::o;45961:416::-;46161:2;46175:47;;;46146:18;;;54171:19;28066:34;54211:14;;;28046:55;28120:12;;;46132:245::o;46384:416::-;46584:2;46598:47;;;28371:2;46569:18;;;54171:19;28407:34;54211:14;;;28387:55;-1:-1;;;28462:12;;;28455:44;28518:12;;;46555:245::o;46807:416::-;47007:2;47021:47;;;28769:2;46992:18;;;54171:19;28805:34;54211:14;;;28785:55;-1:-1;;;28860:12;;;28853:38;28910:12;;;46978:245::o;47230:416::-;47430:2;47444:47;;;29161:2;47415:18;;;54171:19;29197:34;54211:14;;;29177:55;-1:-1;;;29252:12;;;29245:29;29293:12;;;47401:245::o;47653:416::-;47853:2;47867:47;;;29849:2;47838:18;;;54171:19;-1:-1;;;54211:14;;;29865:39;29923:12;;;47824:245::o;48076:416::-;48276:2;48290:47;;;30174:2;48261:18;;;54171:19;30210:31;54211:14;;;30190:52;30261:12;;;48247:245::o;48499:416::-;48699:2;48713:47;;;30512:2;48684:18;;;54171:19;30548:34;54211:14;;;30528:55;-1:-1;;;30603:12;;;30596:45;30660:12;;;48670:245::o;48922:416::-;49122:2;49136:47;;;30911:2;49107:18;;;54171:19;30947:34;54211:14;;;30927:55;-1:-1;;;31002:12;;;30995:34;31048:12;;;49093:245::o;49345:416::-;49545:2;49559:47;;;49530:18;;;54171:19;31335:34;54211:14;;;31315:55;31389:12;;;49516:245::o;50222:325::-;-1:-1;;;;;55496:30;;;31724:36;;55496:30;;50533:2;50518:18;;31724:36;50373:2;50358:18;;50344:203::o;50554:256::-;50616:2;50610:9;50642:17;;;-1:-1;;;;;50702:34;;50738:22;;;50699:62;50696:2;;;50774:1;;50764:12;50696:2;50616;50783:22;50594:216;;-1:-1;50594:216::o;50817:304::-;;-1:-1;;;;;50968:6;50965:30;50962:2;;;-1:-1;;50998:12;50962:2;-1:-1;51043:4;51031:17;;;51096:15;;50899:222::o;56039:268::-;56104:1;56111:101;56125:6;56122:1;56119:13;56111:101;;;56192:11;;;56186:18;56173:11;;;56166:39;56147:2;56140:10;56111:101;;;56227:6;56224:1;56221:13;56218:2;;;-1:-1;;56104:1;56274:16;;56267:27;56088:219::o;56720:117::-;-1:-1;;;;;55290:54;;56779:35;;56769:2;;56828:1;;56818:12;56984:111;57065:5;55003:13;54996:21;57043:5;57040:32;57030:2;;57086:1;;57076:12;57226:117;-1:-1;;;;;57313:5;55170:46;57288:5;57285:35;57275:2;;57334:1;;57324:12",
  "source": "// SPDX-License-Identifier: MIT\npragma solidity 0.6.12;\npragma experimental ABIEncoderV2;\nimport \"../StorageManager.sol\";\n\ncontract TestStorageManagerV2 is StorageManager {\n    function getVersion() external pure returns (string memory) {\n        return \"V2\";\n    }\n}\n",
  "sourcePath": "/Users/naz_dou/Documents/Projects/IovLabs/rif-marketplace-storage/contracts/tests/TestStorageManagerV2.sol",
  "ast": {
    "absolutePath": "/Users/naz_dou/Documents/Projects/IovLabs/rif-marketplace-storage/contracts/tests/TestStorageManagerV2.sol",
    "exportedSymbols": {
      "TestStorageManagerV2": [
        2063
      ]
    },
    "id": 2064,
    "license": "MIT",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 2050,
        "literals": [
          "solidity",
          "0.6",
          ".12"
        ],
        "nodeType": "PragmaDirective",
        "src": "32:23:5"
      },
      {
        "id": 2051,
        "literals": [
          "experimental",
          "ABIEncoderV2"
        ],
        "nodeType": "PragmaDirective",
        "src": "56:33:5"
      },
      {
        "absolutePath": "/Users/naz_dou/Documents/Projects/IovLabs/rif-marketplace-storage/contracts/StorageManager.sol",
        "file": "../StorageManager.sol",
        "id": 2052,
        "nodeType": "ImportDirective",
        "scope": 2064,
        "sourceUnit": 1911,
        "src": "90:31:5",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 2053,
              "name": "StorageManager",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1910,
              "src": "156:14:5",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_StorageManager_$1910",
                "typeString": "contract StorageManager"
              }
            },
            "id": 2054,
            "nodeType": "InheritanceSpecifier",
            "src": "156:14:5"
          }
        ],
        "contractDependencies": [
          1910,
          2108,
          2183,
          2313,
          2424
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 2063,
        "linearizedBaseContracts": [
          2063,
          1910,
          2424,
          2313,
          2108,
          2183
        ],
        "name": "TestStorageManagerV2",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": {
              "id": 2061,
              "nodeType": "Block",
              "src": "237:28:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "5632",
                    "id": 2059,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "string",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "254:4:5",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_stringliteral_23d235efaf569b2b407d10f447247743508d1762a8e3a3aed85ccc0570dde35f",
                      "typeString": "literal_string \"V2\""
                    },
                    "value": "V2"
                  },
                  "functionReturnParameters": 2058,
                  "id": 2060,
                  "nodeType": "Return",
                  "src": "247:11:5"
                }
              ]
            },
            "documentation": null,
            "functionSelector": "0d8e6e2c",
            "id": 2062,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getVersion",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 2055,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "196:2:5"
            },
            "returnParameters": {
              "id": 2058,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2057,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2062,
                  "src": "222:13:5",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 2056,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "222:6:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "221:15:5"
            },
            "scope": 2063,
            "src": "177:88:5",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "scope": 2064,
        "src": "123:144:5"
      }
    ],
    "src": "32:236:5"
  },
  "legacyAST": {
    "absolutePath": "/Users/naz_dou/Documents/Projects/IovLabs/rif-marketplace-storage/contracts/tests/TestStorageManagerV2.sol",
    "exportedSymbols": {
      "TestStorageManagerV2": [
        2063
      ]
    },
    "id": 2064,
    "license": "MIT",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 2050,
        "literals": [
          "solidity",
          "0.6",
          ".12"
        ],
        "nodeType": "PragmaDirective",
        "src": "32:23:5"
      },
      {
        "id": 2051,
        "literals": [
          "experimental",
          "ABIEncoderV2"
        ],
        "nodeType": "PragmaDirective",
        "src": "56:33:5"
      },
      {
        "absolutePath": "/Users/naz_dou/Documents/Projects/IovLabs/rif-marketplace-storage/contracts/StorageManager.sol",
        "file": "../StorageManager.sol",
        "id": 2052,
        "nodeType": "ImportDirective",
        "scope": 2064,
        "sourceUnit": 1911,
        "src": "90:31:5",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 2053,
              "name": "StorageManager",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1910,
              "src": "156:14:5",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_StorageManager_$1910",
                "typeString": "contract StorageManager"
              }
            },
            "id": 2054,
            "nodeType": "InheritanceSpecifier",
            "src": "156:14:5"
          }
        ],
        "contractDependencies": [
          1910,
          2108,
          2183,
          2313,
          2424
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 2063,
        "linearizedBaseContracts": [
          2063,
          1910,
          2424,
          2313,
          2108,
          2183
        ],
        "name": "TestStorageManagerV2",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": {
              "id": 2061,
              "nodeType": "Block",
              "src": "237:28:5",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "5632",
                    "id": 2059,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "string",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "254:4:5",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_stringliteral_23d235efaf569b2b407d10f447247743508d1762a8e3a3aed85ccc0570dde35f",
                      "typeString": "literal_string \"V2\""
                    },
                    "value": "V2"
                  },
                  "functionReturnParameters": 2058,
                  "id": 2060,
                  "nodeType": "Return",
                  "src": "247:11:5"
                }
              ]
            },
            "documentation": null,
            "functionSelector": "0d8e6e2c",
            "id": 2062,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getVersion",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 2055,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "196:2:5"
            },
            "returnParameters": {
              "id": 2058,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2057,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2062,
                  "src": "222:13:5",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 2056,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "222:6:5",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "221:15:5"
            },
            "scope": 2063,
            "src": "177:88:5",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "scope": 2064,
        "src": "123:144:5"
      }
    ],
    "src": "32:236:5"
  },
  "compiler": {
    "name": "solc",
    "version": "0.6.12+commit.27d51765.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.3.2",
  "updatedAt": "2021-03-04T12:24:19.852Z",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "depositFunds(address,uint256,bytes32[],address)": {
        "details": "- depositing funds to Agreement that is linked to terminated Offer is not possible - depositing funds to Agreement that already is expired (eq. ran out of funds at some point) is not possible. Call NewAgreement instead. The data needs to be re-provided though. - if the token is not the native currency, then the contract must be first be given allowance to transfer tokens in it's posession.",
        "params": {
          "dataReference": "data reference where should be deposited funds.",
          "provider": "the address of the provider of the Offer."
        }
      },
      "emitMessage(bytes32[])": {
        "params": {
          "message": "the Provider may send a message (e.g. his nodeID). Message should be structured such that the first two bits specify the message type, followed with the message). 0x01 == nodeID"
        }
      },
      "getAgreementReference(bytes32[],address,address)": {
        "params": {
          "creator": "the creator of the agreement",
          "dataReference": "the dataReference of the agreement",
          "token": "the token, which is used as a means of payment for the agreement."
        }
      },
      "newAgreement(bytes32[],address,uint64,uint64,address,uint256,bytes32[][],address[],address)": {
        "details": "- The to-be-pinned data reference's size in MB (rounded up) must be equal in size to param size. - Provider can reject to pin data reference when it exceeds specified size. - The ownership of Agreement is enforced with agreementReference structure which is calculated as: hash(msg.sender, dataReference) - if the token is not the native currency, then the contract must be first be given allowance to transfer tokens in it's posession. Contains execution of the transferFrom on external token contract before all the stage changes are performed. As a result if a token will perform a callback to the StorageManager, it may lead to a reentrancy attack. Hence additional attention should be paid while reviewing this method of a token before whitelisting.",
        "params": {
          "amount": "if token is set, this is the amount of tokens that is transfered",
          "billingPeriod": "the chosen period for billing.",
          "creatorsOfAgreementToPayOut": "the creators of agreements which must be payed out. Pass this when there is no capacity. The order should match the order of dataReferenceOfAgreementToPayOut and tokensOfAgreementToPayOut",
          "dataReference": "the reference to an Data Source, can be several things.",
          "dataReferencesOfAgreementToPayOut": "the data references of agreements which must be payed out. Pass this when there is no capacity. Order should equal order of creatorsOfAgreementToPayOut and tokensOfAgreementToPayOut",
          "provider": "the provider from which is proposed to take a Offer.",
          "size": "the size of the to-be-pinned file in MB (rounded up).",
          "token": "the token in which you want to make the agreement. By convention: address(0) is the native currency",
          "tokenOfAgreementsToPayOut": "the token address of agreements which must be payed out. Pass this when there is no capacity."
        }
      },
      "owner()": {
        "details": "Returns the address of the current owner."
      },
      "pause()": {
        "details": "Called by a pauser to pause, triggers stopped state."
      },
      "paused()": {
        "details": "Returns true if the contract is paused, and false otherwise."
      },
      "payoutFunds(bytes32[][],address[],address,address)": {
        "details": "- Provider must call an expired agreement themselves as soon as the agreement is expired, to add back the capacity to their Offer. - Payout can be triggered by other events as well. Like in newAgreement call with either existing agreement or when other Agreements are passed to the agreementsReferencesToBePayedOut array.",
        "params": {
          "creatorsOfAgreementToPayOut": "the creators that made the agreement to pay",
          "dataReferencesOfAgreementToPayOut": "the data references of the agreement to pay",
          "tokensOfAgreementsToPayOut": "the tokens of the agreement to pay out"
        }
      },
      "renounceOwnership()": {
        "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
      },
      "setBillingPlans(uint64[][],uint128[][],address[])": {
        "details": "- setting the price to 0 means that a particular period is not offered, which can be used to remove a period from the offer. - make sure that any period * prices does not cause an overflow, as this can never be accepted and hence is pointless. - the length of tokens array must always be one shorter than the length of the boundaries array (otherwise you get an array index out of bounds error) - make sure that the length of billingPeriods and billingPrices is of equal length. If billingPeriods is longer than prices => array index out of bounds error. If prices longer than period => the prices in higher indeces won't be considered",
        "params": {
          "billingPeriods": "the offered periods. Length must be equal to billingPrices. The first index of the multi dem array corresponds with the address in tokens at the same index",
          "billingPrices": "the prices for the offered periods. Each entry at index corresponds to the same index at periods. 0 means that the particular period is not offered. The first index of the multi dem array corresponds with the address in tokens at the same index"
        }
      },
      "setOffer(uint64,uint64[][],uint128[][],address[],bytes32[])": {
        "details": "- Use this function when initiating an Offer or when the users wants to change more than one parameter at once. - make sure that any period * prices does not cause an overflow, as this can never be accepted (REF_MAX_PRICE) and hence is pointless - only whitelisted tokens are allowed to make an offer for - if there are two tokens, and two billingPrice/periods pairs per token, then boundaries[0] == 1. This makes the first two billingPeriod/prices pairs to apply to the first token ([tokens[0]]) and the second pairs to the second token. - make sure that the length of billingPeriods and billingPrices is of equal length. If billingPeriods is longer than prices => array index out of bounds error. If prices longer than period => the prices in higher indeces won't be considered",
        "params": {
          "billingPeriods": "the offered periods. Length must be equal to the length of billingPrices. The first index of the multi dem array corresponds with the address in tokens at the same index",
          "billingPrices": "the prices for the offered periods. Each entry at index corresponds to the same index at periods. The first index of the multi dem array corresponds with the address in tokens at the same index",
          "capacity": "the amount of MB offered. If already active before and set to 0, existing contracts can't be prolonged / re-started, no new contracts can be started.",
          "message": "the Provider may include a message (e.g. his nodeID).  Message should be structured such that the first two bits specify the message type, followed with the message). 0x01 == nodeID",
          "tokens": "the tokens for which an offer is made. By convention, address(0) is the native currency."
        }
      },
      "setTotalCapacity(uint64)": {
        "params": {
          "capacity": "the new capacity"
        }
      },
      "setWhitelistedProvider(address,bool)": {
        "params": {
          "isWhiteListed": "whether you want to whitelist the provider or put it from the whitelist.",
          "providerAddress": "the providerAddress from whom you want to set the whitelisted"
        }
      },
      "setWhitelistedTokens(address,bool)": {
        "params": {
          "isWhiteListed": "whether you want to whitelist the token or put it from the whitelist.",
          "token": "the token from whom you want to set the whitelisted"
        }
      },
      "terminateOffer()": {
        "details": "no new Agreement can be created and no existing Agreement can be prolonged. All existing Agreement are still valid for the amount of periods still deposited."
      },
      "transferOwnership(address)": {
        "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
      },
      "unpause()": {
        "details": "Called by a pauser to unpause, returns to normal state."
      },
      "withdrawFunds(bytes32[],address,address[],uint256[])": {
        "details": "- if amount is zero then all withdrawable funds are transferred (eq. all available funds minus funds for still non-payed out periods and current period) - if Agreement is terminated Consumer can withdraw all remaining funds - if the token is not the native currency, then the contract must be first be given allowance to transfer tokens in it's posession.",
        "params": {
          "amounts": "the value you want to withdraw for each token",
          "dataReference": "the data reference of agreement to be funds withdrawn from",
          "provider": "the address of the provider of the Offer.",
          "tokens": "the tokens in which to withdraw. By convention, address(0) is the native currency."
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {
      "depositFunds(address,uint256,bytes32[],address)": {
        "notice": ">> FOR CONSUMERdeposits new funds to the Agreement."
      },
      "emitMessage(bytes32[])": {
        "notice": ">> FOR PROVIDER"
      },
      "getAgreementReference(bytes32[],address,address)": {
        "notice": "get the agreementReference. the agreementReference consists of the hash of the dataReference, msg.sender and the tokenAdddress, to allow: - multiple people to register an agreement for the same file - one person to register multiple agreements for the same file, but with different tokens - link the token to the agreement, such that we do the accounting properly"
      },
      "newAgreement(bytes32[],address,uint64,uint64,address,uint256,bytes32[][],address[],address)": {
        "notice": ">> FOR CONSUMERnew Agreement for given Offer"
      },
      "payoutFunds(bytes32[][],address[],address,address)": {
        "notice": ">> FOR PROVIDERpayout already earned funds of one or more Agreement"
      },
      "setBillingPlans(uint64[][],uint128[][],address[])": {
        "notice": ">> FOR PROVIDERset the billing plans for an Offer."
      },
      "setOffer(uint64,uint64[][],uint128[][],address[],bytes32[])": {
        "notice": ">> FOR PROVIDERset the totalCapacity and billingPlans of a Offer."
      },
      "setTotalCapacity(uint64)": {
        "notice": ">> FOR PROVIDERsets total capacity of Offer."
      },
      "setWhitelistedProvider(address,bool)": {
        "notice": "whitelist a provider or remove the provider from whitelist"
      },
      "setWhitelistedTokens(address,bool)": {
        "notice": "whitelist a token or remove the token from whitelist"
      },
      "terminateOffer()": {
        "notice": ">> FOR PROVIDERstops the Offer. It sets the totalCapacity to 0 which indicates terminated Offer."
      },
      "withdrawFunds(bytes32[],address,address[],uint256[])": {
        "notice": ">> FOR CONSUMERwithdraw funds from Agreement."
      }
    },
    "version": 1
  }
}