{
  "contractName": "TestCollateralizedErc20",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "underlying",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "name",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "symbol",
          "type": "string"
        },
        {
          "internalType": "uint8",
          "name": "numDecimals",
          "type": "uint8"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "minter",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "tokenAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "kTokenAmount",
          "type": "uint256"
        }
      ],
      "name": "Mint",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "redeemer",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "tokenAmount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "kTokenAmount",
          "type": "uint256"
        }
      ],
      "name": "Redeem",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "allowance",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "balanceOfUnderlying",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "subtractedValue",
          "type": "uint256"
        }
      ],
      "name": "decreaseAllowance",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "addedValue",
          "type": "uint256"
        }
      ],
      "name": "increaseAllowance",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "isUnderlyingEther",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenAmount",
          "type": "uint256"
        }
      ],
      "name": "mint",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "nativeAmount",
          "type": "uint256"
        }
      ],
      "name": "nativeAmountToUnderlyingAmount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "kTokenAmount",
          "type": "uint256"
        }
      ],
      "name": "redeem",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenAmount",
          "type": "uint256"
        }
      ],
      "name": "redeemUnderlying",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalReserve",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "underlying",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "underlyingAmount",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "ceil",
          "type": "bool"
        }
      ],
      "name": "underlyingAmountToNativeAmount",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.7.3+commit.9bfce1f6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"underlying\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"numDecimals\",\"type\":\"uint8\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"minter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"kTokenAmount\",\"type\":\"uint256\"}],\"name\":\"Mint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"redeemer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"kTokenAmount\",\"type\":\"uint256\"}],\"name\":\"Redeem\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOfUnderlying\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isUnderlyingEther\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenAmount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"nativeAmount\",\"type\":\"uint256\"}],\"name\":\"nativeAmountToUnderlyingAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"kTokenAmount\",\"type\":\"uint256\"}],\"name\":\"redeem\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenAmount\",\"type\":\"uint256\"}],\"name\":\"redeemUnderlying\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalReserve\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"underlying\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"underlyingAmount\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"ceil\",\"type\":\"bool\"}],\"name\":\"underlyingAmountToNativeAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/andrekorol/src/kollateral/protocol/contracts/testing/TestCollateralizedErc20.sol\":\"TestCollateralizedErc20\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/andrekorol/src/kollateral/protocol/contracts/common/utils/ExtendedMath.sol\":{\"keccak256\":\"0x5ced249631b5dfe431f449d725d9f318b01ab0785306ca5e73cdf43760ab271a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3f3aef65abfcc02e451ad27a849caba0e6375abb26e28e7605928d19d561c3dd\",\"dweb:/ipfs/QmY5zMeH5x3QMS5xkxkY3DH4SDPWLGJyfPk1R8wPJXH9vr\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/testing/TestCollateralizedErc20.sol\":{\"keccak256\":\"0x0ae9195ad36effb588252b93487d6597b1f001ce977ff2c7eaefe2ada44e4eb6\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://03b4de95b10c9a61c314205758d006ffa17d3a5ba822929f0b74bc5b9e5991ab\",\"dweb:/ipfs/QmUcQoSoNintUuyCUv5gLUiCnpLNmg17ybxdDA8MhX6v6K\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/token/CollateralizedErc20.sol\":{\"keccak256\":\"0xd48c5e41793190f2024f5273abfc93878778c179ea7308aa2585e6c1ff351c8e\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://2d0f9a0fe4164b7dc28751091f7932bfca48b29b06eb6d6db441f27d42f89da9\",\"dweb:/ipfs/QmSEd1zGzECLSeML5K52mk4h3T4Z6FxrhqSFua41nSJyht\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/token/CollateralizedToken.sol\":{\"keccak256\":\"0xfaaaa4324c6cc78d9d1268426eb04fe41d8584ade05bbf22eac4875ecdf174d7\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1e4149a0ecd14003c261b2243adfc19d7a009c83c32341ebdd6a8929c0bdd14d\",\"dweb:/ipfs/QmQbySda22WBU4oycYfrTye1RsJuz1Ub74ksoST7PeegHW\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/token/UnlimitedApprovalErc20.sol\":{\"keccak256\":\"0x407178fcd78f0a19d705e64aaaa26ae997d228f077f3cf6833f9f3eb31c72308\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://097906cbe6f8f35ba1763bd122d551ec302f45cf677021bbcdb8a55c706940d9\",\"dweb:/ipfs/QmVh7kcUWsXt3QApppB1njhGHfzdP813KSTUF6bh3VCmMM\"]},\"@openzeppelin/contracts/GSN/Context.sol\":{\"keccak256\":\"0x910a2e625b71168563edf9eeef55a50d6d699acfe27ceba3921f291829a8f938\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://248246ac66e6479dce1ad7d4945ec5540c98ceb09881e93c93f7c48d5772925c\",\"dweb:/ipfs/QmXr8tmUiZgEYid6ixeeBRmTdUnASWjKzhP3KRxMPy8fRt\"]},\"@openzeppelin/contracts/math/SafeMath.sol\":{\"keccak256\":\"0xba96bc371ba999f452985a98717cca1e4c4abb598dc038a9a9c3db08129b1ba4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26e50e3f7b6482fb6f598f2e006994a74aa492687daa4b3eee7fd4fb5398ce7f\",\"dweb:/ipfs/QmZudqoPSkA4USLMFsBBmt19dDPZFS8aaAmL5R7pECXu6t\"]},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x482b6d82ba1c9c73758ae15068a438361d4187b7a4e342db17ef0f828cb5e21a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://89725e56bc9c6cfb69521ceaa4a489561b928e930b71e30db85b24024c1c2c03\",\"dweb:/ipfs/QmNvpotZA1Fe48msV6TShSTVxeQ2dkaDS9MTKP4bNxyUG3\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xbd74f587ab9b9711801baf667db1426e4a03fd2d7f15af33e0e0d0394e7cef76\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2d0913dfbfce90d170df0d496ad7596c0778518e5fa7aba6c32562522546f66b\",\"dweb:/ipfs/QmR6B8nLj2PJf5e1JWD9Nk7ErkAwkqUwadCnvE82FJr1RU\"]},\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\":{\"keccak256\":\"0x1153f6dd334c01566417b8c551122450542a2b75a2bbb379d59a8c320ed6da28\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://002b4e5c26a2a069ba42486b83bf9c4b5461f3d5def32f9ef52b0aef8905d6d2\",\"dweb:/ipfs/QmPG44XDF4npiqRzzGvqJroDtUKfcR78wcreQ9bXa6guW6\"]}},\"version\":1}",
  "bytecode": "0x60806040523480156200001157600080fd5b50604051620025ea380380620025ea833981810160405260808110156200003757600080fd5b8101908080519060200190929190805160405193929190846401000000008211156200006257600080fd5b838201915060208201858111156200007957600080fd5b82518660018202830111640100000000821117156200009757600080fd5b8083526020830192505050908051906020019080838360005b83811015620000cd578082015181840152602081019050620000b0565b50505050905090810190601f168015620000fb5780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200011f57600080fd5b838201915060208201858111156200013657600080fd5b82518660018202830111640100000000821117156200015457600080fd5b8083526020830192505050908051906020019080838360005b838110156200018a5780820151818401526020810190506200016d565b50505050905090810190601f168015620001b85780820380516001836020036101000a031916815260200191505b50604052602001805190602001909291905050508383838160039080519060200190620001e7929190620002a2565b50806004908051906020019062000200929190620002a2565b506012600560006101000a81548160ff021916908360ff1602179055505050600160068190555080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200027a816200028460201b60201c565b5050505062000348565b80600560006101000a81548160ff021916908360ff16021790555050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002e557805160ff191683800117855562000316565b8280016001018555821562000316579182015b8281111562000315578251825591602001919060010190620002f8565b5b50905062000325919062000329565b5090565b5b80821115620003445760008160009055506001016200032a565b5090565b61229280620003586000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c806370a08231116100ad578063a457c2d711610071578063a457c2d7146105ba578063a9059cbb1461061e578063b15287db14610682578063db006a75146106c4578063dd62ed3e146107085761012c565b806370a0823114610409578063807b9d4214610461578063852a12e3146104af57806395d89b41146104f3578063a0712d68146105765761012c565b806339509351116100f457806339509351146102db5780633af9e6691461033f5780634c68df671461039757806356c04b3b146103b55780636f307dc3146103d55761012c565b806306fdde0314610131578063095ea7b3146101b457806318160ddd1461021857806323b872dd14610236578063313ce567146102ba575b600080fd5b610139610780565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561017957808201518184015260208101905061015e565b50505050905090810190601f1680156101a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610200600480360360408110156101ca57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610822565b60405180821515815260200191505060405180910390f35b610220610840565b6040518082815260200191505060405180910390f35b6102a26004803603606081101561024c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061084a565b60405180821515815260200191505060405180910390f35b6102c26108e8565b604051808260ff16815260200191505060405180910390f35b610327600480360360408110156102f157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506108ff565b60405180821515815260200191505060405180910390f35b6103816004803603602081101561035557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109b2565b6040518082815260200191505060405180910390f35b61039f6109cc565b6040518082815260200191505060405180910390f35b6103bd610a7c565b60405180821515815260200191505060405180910390f35b6103dd610a81565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61044b6004803603602081101561041f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610aab565b6040518082815260200191505060405180910390f35b6104996004803603604081101561047757600080fd5b8101908080359060200190929190803515159060200190929190505050610af3565b6040518082815260200191505060405180910390f35b6104db600480360360208110156104c557600080fd5b8101908080359060200190929190505050610b09565b60405180821515815260200191505060405180910390f35b6104fb610ba4565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561053b578082015181840152602081019050610520565b50505050905090810190601f1680156105685780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105a26004803603602081101561058c57600080fd5b8101908080359060200190929190505050610c46565b60405180821515815260200191505060405180910390f35b610606600480360360408110156105d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d83565b60405180821515815260200191505060405180910390f35b61066a6004803603604081101561063457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610e50565b60405180821515815260200191505060405180910390f35b6106ae6004803603602081101561069857600080fd5b8101908080359060200190929190505050610e6e565b6040518082815260200191505060405180910390f35b6106f0600480360360208110156106da57600080fd5b8101908080359060200190929190505050610ec3565b60405180821515815260200191505060405180910390f35b61076a6004803603604081101561071e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f5a565b6040518082815260200191505060405180910390f35b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108185780601f106107ed57610100808354040283529160200191610818565b820191906000526020600020905b8154815290600101906020018083116107fb57829003601f168201915b5050505050905090565b600061083661082f610fe1565b8484610fe9565b6001905092915050565b6000600254905090565b60006108578484846111e0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61088985610884610fe1565b610f5a565b146108dd576108dc8461089a610fe1565b6108d78560405180606001604052806039815260200161211c603991396108c88a6108c3610fe1565b610f5a565b6114a19092919063ffffffff16565b610fe9565b5b600190509392505050565b6000600560009054906101000a900460ff16905090565b60006109a861090c610fe1565b846109a3856001600061091d610fe1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461156190919063ffffffff16565b610fe9565b6001905092915050565b60006109c56109c083610aab565b610e6e565b9050919050565b60006109d6610a81565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610a3c57600080fd5b505afa158015610a50573d6000803e3d6000fd5b505050506040513d6020811015610a6657600080fd5b8101908080519060200190929190505050905090565b600090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610b01838360006115e9565b905092915050565b600080610b146109cc565b11610b87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f436f6c6c61746572616c697a6564546f6b656e3a206e6f20726573657276650081525060200191505060405180910390fd5b610b9d82610b9884600160006115e9565b611663565b9050919050565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c3c5780601f10610c1157610100808354040283529160200191610c3c565b820191906000526020600020905b815481529060010190602001808311610c1f57829003601f168201915b5050505050905090565b600080610c51610a81565b90508073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015610ce257600080fd5b505af1158015610cf6573d6000803e3d6000fd5b505050506040513d6020811015610d0c57600080fd5b8101908080519060200190929190505050610d72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061222f602e913960400191505060405180910390fd5b610d7b836117be565b915050919050565b6000610e46610d90610fe1565b84610e418560405180606001604052806025815260200161220a6025913960016000610dba610fe1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114a19092919063ffffffff16565b610fe9565b6001905092915050565b6000610e64610e5d610fe1565b84846111e0565b6001905092915050565b600080610e79610840565b1415610e885760009050610ebe565b610ebb610e93610840565b610ead610e9e6109cc565b856118f590919063ffffffff16565b61197b90919063ffffffff16565b90505b919050565b600080610ece610840565b11610f41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f436f6c6c61746572616c697a6564546f6b656e3a206e6f20737570706c79000081525060200191505060405180910390fd5b610f53610f4d83610e6e565b83611663565b9050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561106f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806121e66024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806120d46022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611266576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806121c16025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061208f6023913960400191505060405180910390fd5b6112f78383836119c5565b611362816040518060600160405280602681526020016120f6602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114a19092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113f5816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461156190919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b600083831115829061154e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156115135780820151818401526020810190506114f8565b50505050905090810190601f1680156115405780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000808284019050838110156115df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000806115f46109cc565b1415611603576000905061165c565b600082611617576116126109cc565b611632565b611631856116236109cc565b6119ca90919063ffffffff16565b5b9050611658611651611642610840565b876118f590919063ffffffff16565b8286611a14565b9150505b9392505050565b6000600260065414156116de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026006819055506116f03383611a75565b6116fa3384611c39565b61174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612197602a913960400191505060405180910390fd5b7fe5b754fb1abb7f01b499791d0b820ae3b6af3424ac1c59768edb53f4ec31a929338484604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a160019050600160068190555092915050565b600060026006541415611839576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b600260068190555060008061185e846118506109cc565b6119ca90919063ffffffff16565b11156118785761187183600060016115e9565b905061187c565b8290505b6118863382611cf6565b7f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f338483604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a160019150506001600681905550919050565b6000808314156119085760009050611975565b600082840290508284828161191957fe5b0414611970576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806121556021913960400191505060405180910390fd5b809150505b92915050565b60006119bd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611ebd565b905092915050565b505050565b6000611a0c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506114a1565b905092915050565b600080611a2a848661197b90919063ffffffff16565b9050828015611a4c57506000611a498587611f8390919063ffffffff16565b14155b611a565780611a6b565b611a6a60018261156190919063ffffffff16565b5b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611afb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806121766021913960400191505060405180910390fd5b611b07826000836119c5565b611b72816040518060600160405280602281526020016120b2602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114a19092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611bc9816002546119ca90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000611c43610a81565b73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611cb357600080fd5b505af1158015611cc7573d6000803e3d6000fd5b505050506040513d6020811015611cdd57600080fd5b8101908080519060200190929190505050905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b611da5600083836119c5565b611dba8160025461156190919063ffffffff16565b600281905550611e11816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461156190919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008083118290611f69576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f2e578082015181840152602081019050611f13565b50505050905090810190601f168015611f5b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611f7557fe5b049050809150509392505050565b6000611fc583836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000815250611fcd565b905092915050565b600080831415829061207a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561203f578082015181840152602081019050612024565b50505050905090810190601f16801561206c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082848161208457fe5b069050939250505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365556e6c696d69746564417070726f76616c45726332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a206275726e2066726f6d20746865207a65726f2061646472657373436f6c6c61746572616c697a6564546f6b656e3a20746f6b656e207472616e73666572206661696c656445524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f436f6c6c61746572616c697a656445726332303a20746f6b656e207472616e7366657246726f6d206661696c6564a2646970667358221220b119c3625d9e4bf4a43c6a8699025c2601f1ede1472193102d84ecf314c60b4064736f6c63430007030033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061012c5760003560e01c806370a08231116100ad578063a457c2d711610071578063a457c2d7146105ba578063a9059cbb1461061e578063b15287db14610682578063db006a75146106c4578063dd62ed3e146107085761012c565b806370a0823114610409578063807b9d4214610461578063852a12e3146104af57806395d89b41146104f3578063a0712d68146105765761012c565b806339509351116100f457806339509351146102db5780633af9e6691461033f5780634c68df671461039757806356c04b3b146103b55780636f307dc3146103d55761012c565b806306fdde0314610131578063095ea7b3146101b457806318160ddd1461021857806323b872dd14610236578063313ce567146102ba575b600080fd5b610139610780565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561017957808201518184015260208101905061015e565b50505050905090810190601f1680156101a65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610200600480360360408110156101ca57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610822565b60405180821515815260200191505060405180910390f35b610220610840565b6040518082815260200191505060405180910390f35b6102a26004803603606081101561024c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061084a565b60405180821515815260200191505060405180910390f35b6102c26108e8565b604051808260ff16815260200191505060405180910390f35b610327600480360360408110156102f157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506108ff565b60405180821515815260200191505060405180910390f35b6103816004803603602081101561035557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109b2565b6040518082815260200191505060405180910390f35b61039f6109cc565b6040518082815260200191505060405180910390f35b6103bd610a7c565b60405180821515815260200191505060405180910390f35b6103dd610a81565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61044b6004803603602081101561041f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610aab565b6040518082815260200191505060405180910390f35b6104996004803603604081101561047757600080fd5b8101908080359060200190929190803515159060200190929190505050610af3565b6040518082815260200191505060405180910390f35b6104db600480360360208110156104c557600080fd5b8101908080359060200190929190505050610b09565b60405180821515815260200191505060405180910390f35b6104fb610ba4565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561053b578082015181840152602081019050610520565b50505050905090810190601f1680156105685780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6105a26004803603602081101561058c57600080fd5b8101908080359060200190929190505050610c46565b60405180821515815260200191505060405180910390f35b610606600480360360408110156105d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d83565b60405180821515815260200191505060405180910390f35b61066a6004803603604081101561063457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610e50565b60405180821515815260200191505060405180910390f35b6106ae6004803603602081101561069857600080fd5b8101908080359060200190929190505050610e6e565b6040518082815260200191505060405180910390f35b6106f0600480360360208110156106da57600080fd5b8101908080359060200190929190505050610ec3565b60405180821515815260200191505060405180910390f35b61076a6004803603604081101561071e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f5a565b6040518082815260200191505060405180910390f35b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108185780601f106107ed57610100808354040283529160200191610818565b820191906000526020600020905b8154815290600101906020018083116107fb57829003601f168201915b5050505050905090565b600061083661082f610fe1565b8484610fe9565b6001905092915050565b6000600254905090565b60006108578484846111e0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61088985610884610fe1565b610f5a565b146108dd576108dc8461089a610fe1565b6108d78560405180606001604052806039815260200161211c603991396108c88a6108c3610fe1565b610f5a565b6114a19092919063ffffffff16565b610fe9565b5b600190509392505050565b6000600560009054906101000a900460ff16905090565b60006109a861090c610fe1565b846109a3856001600061091d610fe1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461156190919063ffffffff16565b610fe9565b6001905092915050565b60006109c56109c083610aab565b610e6e565b9050919050565b60006109d6610a81565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610a3c57600080fd5b505afa158015610a50573d6000803e3d6000fd5b505050506040513d6020811015610a6657600080fd5b8101908080519060200190929190505050905090565b600090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610b01838360006115e9565b905092915050565b600080610b146109cc565b11610b87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f436f6c6c61746572616c697a6564546f6b656e3a206e6f20726573657276650081525060200191505060405180910390fd5b610b9d82610b9884600160006115e9565b611663565b9050919050565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c3c5780601f10610c1157610100808354040283529160200191610c3c565b820191906000526020600020905b815481529060010190602001808311610c1f57829003601f168201915b5050505050905090565b600080610c51610a81565b90508073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015610ce257600080fd5b505af1158015610cf6573d6000803e3d6000fd5b505050506040513d6020811015610d0c57600080fd5b8101908080519060200190929190505050610d72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061222f602e913960400191505060405180910390fd5b610d7b836117be565b915050919050565b6000610e46610d90610fe1565b84610e418560405180606001604052806025815260200161220a6025913960016000610dba610fe1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114a19092919063ffffffff16565b610fe9565b6001905092915050565b6000610e64610e5d610fe1565b84846111e0565b6001905092915050565b600080610e79610840565b1415610e885760009050610ebe565b610ebb610e93610840565b610ead610e9e6109cc565b856118f590919063ffffffff16565b61197b90919063ffffffff16565b90505b919050565b600080610ece610840565b11610f41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f436f6c6c61746572616c697a6564546f6b656e3a206e6f20737570706c79000081525060200191505060405180910390fd5b610f53610f4d83610e6e565b83611663565b9050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561106f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806121e66024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806120d46022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611266576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806121c16025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061208f6023913960400191505060405180910390fd5b6112f78383836119c5565b611362816040518060600160405280602681526020016120f6602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114a19092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113f5816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461156190919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b600083831115829061154e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156115135780820151818401526020810190506114f8565b50505050905090810190601f1680156115405780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000808284019050838110156115df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000806115f46109cc565b1415611603576000905061165c565b600082611617576116126109cc565b611632565b611631856116236109cc565b6119ca90919063ffffffff16565b5b9050611658611651611642610840565b876118f590919063ffffffff16565b8286611a14565b9150505b9392505050565b6000600260065414156116de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026006819055506116f03383611a75565b6116fa3384611c39565b61174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180612197602a913960400191505060405180910390fd5b7fe5b754fb1abb7f01b499791d0b820ae3b6af3424ac1c59768edb53f4ec31a929338484604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a160019050600160068190555092915050565b600060026006541415611839576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b600260068190555060008061185e846118506109cc565b6119ca90919063ffffffff16565b11156118785761187183600060016115e9565b905061187c565b8290505b6118863382611cf6565b7f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f338483604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a160019150506001600681905550919050565b6000808314156119085760009050611975565b600082840290508284828161191957fe5b0414611970576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806121556021913960400191505060405180910390fd5b809150505b92915050565b60006119bd83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611ebd565b905092915050565b505050565b6000611a0c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506114a1565b905092915050565b600080611a2a848661197b90919063ffffffff16565b9050828015611a4c57506000611a498587611f8390919063ffffffff16565b14155b611a565780611a6b565b611a6a60018261156190919063ffffffff16565b5b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611afb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806121766021913960400191505060405180910390fd5b611b07826000836119c5565b611b72816040518060600160405280602281526020016120b2602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114a19092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611bc9816002546119ca90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000611c43610a81565b73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611cb357600080fd5b505af1158015611cc7573d6000803e3d6000fd5b505050506040513d6020811015611cdd57600080fd5b8101908080519060200190929190505050905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b611da5600083836119c5565b611dba8160025461156190919063ffffffff16565b600281905550611e11816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461156190919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b60008083118290611f69576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611f2e578082015181840152602081019050611f13565b50505050905090810190601f168015611f5b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611f7557fe5b049050809150509392505050565b6000611fc583836040518060400160405280601881526020017f536166654d6174683a206d6f64756c6f206279207a65726f0000000000000000815250611fcd565b905092915050565b600080831415829061207a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561203f578082015181840152602081019050612024565b50505050905090810190601f16801561206c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5082848161208457fe5b069050939250505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365556e6c696d69746564417070726f76616c45726332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a206275726e2066726f6d20746865207a65726f2061646472657373436f6c6c61746572616c697a6564546f6b656e3a20746f6b656e207472616e73666572206661696c656445524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f436f6c6c61746572616c697a656445726332303a20746f6b656e207472616e7366657246726f6d206661696c6564a2646970667358221220b119c3625d9e4bf4a43c6a8699025c2601f1ede1472193102d84ecf314c60b4064736f6c63430007030033",
  "immutableReferences": {},
  "generatedSources": [],
  "deployedGeneratedSources": [],
  "sourceMap": "752:291:28:-:0;;;814:227;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;985:10;951:4;957:6;2023:5:41;2015;:13;;;;;;;;;;;;:::i;:::-;;2048:7;2038;:17;;;;;;;;;;;;:::i;:::-;;2077:2;2065:9;;:14;;;;;;;;;;;;;;;;;;1948:138;;1637:1:44;1743:7;:22;;;;1252:10:36;1238:11;;:24;;;;;;;;;;;;;;;;;;1196:73;1007:27:28::2;1022:11;1007:14;;;:27;;:::i;:::-;814:227:::0;;;;752:291;;9961:88:41;10033:9;10021;;:21;;;;;;;;;;;;;;;;;;9961:88;:::o;752:291:28:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;",
  "deployedSourceMap": "752:291:28:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2151:81:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4187:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3194:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;863:558:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3053:81:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;5532:215;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;4440:146:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1462:132:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1362:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;4592:87:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3350:117:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3248:302:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1607:318;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2345:85:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;854:314:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;6234:266:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3670:172;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2980:262:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1313:288;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3900:149:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2151:81;2188:13;2220:5;2213:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2151:81;:::o;4187:166::-;4270:4;4286:39;4295:12;:10;:12::i;:::-;4309:7;4318:6;4286:8;:39::i;:::-;4342:4;4335:11;;4187:166;;;;:::o;3194:98::-;3247:7;3273:12;;3266:19;;3194:98;:::o;863:558:37:-;999:4;1015:36;1025:6;1033:9;1044:6;1015:9;:36::i;:::-;1108:2;1065:31;1075:6;1083:12;:10;:12::i;:::-;1065:9;:31::i;:::-;:46;1061:333;;1127:256;1153:6;1177:12;:10;:12::i;:::-;1207:162;1264:6;1207:162;;;;;;;;;;;;;;;;;:31;1217:6;1225:12;:10;:12::i;:::-;1207:9;:31::i;:::-;:35;;:162;;;;;:::i;:::-;1127:8;:256::i;:::-;1061:333;1410:4;1403:11;;863:558;;;;;:::o;3053:81:41:-;3094:5;3118:9;;;;;;;;;;;3111:16;;3053:81;:::o;5532:215::-;5620:4;5636:83;5645:12;:10;:12::i;:::-;5659:7;5668:50;5707:10;5668:11;:25;5680:12;:10;:12::i;:::-;5668:25;;;;;;;;;;;;;;;:34;5694:7;5668:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;5636:8;:83::i;:::-;5736:4;5729:11;;5532:215;;;;:::o;4440:146:36:-;4505:7;4531:48;4562:16;4572:5;4562:9;:16::i;:::-;4531:30;:48::i;:::-;4524:55;;4440:146;;;:::o;1462:132:34:-;1516:7;1549:12;:10;:12::i;:::-;1542:30;;;1581:4;1542:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1535:52;;1462:132;:::o;1362:94::-;1421:4;1362:94;:::o;4592:87:36:-;4635:7;4661:11;;;;;;;;;;;4654:18;;4592:87;:::o;3350:117:41:-;3416:7;3442:9;:18;3452:7;3442:18;;;;;;;;;;;;;;;;3435:25;;3350:117;;;:::o;3248:302:36:-;3370:7;3412:131;3468:16;3502:4;3524:5;3412:38;:131::i;:::-;3393:150;;3248:302;;;;:::o;1607:318::-;1672:4;1713:1;1696:14;:12;:14::i;:::-;:18;1688:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1779:139;1811:11;1840:64;1879:11;1892:4;1898:5;1840:38;:64::i;:::-;1779:14;:139::i;:::-;1760:158;;1607:318;;;:::o;2345:85:41:-;2384:13;2416:7;2409:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2345:85;:::o;854:314:34:-;907:4;923:12;945;:10;:12::i;:::-;923:35;;989:5;:18;;;1008:10;1028:4;1035:11;989:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;968:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1136:25;1149:11;1136:12;:25::i;:::-;1129:32;;;854:314;;;:::o;6234:266:41:-;6327:4;6343:129;6352:12;:10;:12::i;:::-;6366:7;6375:96;6414:15;6375:96;;;;;;;;;;;;;;;;;:11;:25;6387:12;:10;:12::i;:::-;6375:25;;;;;;;;;;;;;;;:34;6401:7;6375:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;6343:8;:129::i;:::-;6489:4;6482:11;;6234:266;;;;:::o;3670:172::-;3756:4;3772:42;3782:12;:10;:12::i;:::-;3796:9;3807:6;3772:9;:42::i;:::-;3831:4;3824:11;;3670:172;;;;:::o;2980:262:36:-;3087:7;3131:1;3114:13;:11;:13::i;:::-;:18;3110:57;;;3155:1;3148:8;;;;3110:57;3184:51;3221:13;:11;:13::i;:::-;3184:32;3201:14;:12;:14::i;:::-;3184:12;:16;;:32;;;;:::i;:::-;:36;;:51;;;;:::i;:::-;3177:58;;2980:262;;;;:::o;1313:288::-;1369:4;1409:1;1393:13;:11;:13::i;:::-;:17;1385:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1474:120;1506:44;1537:12;1506:30;:44::i;:::-;1568:12;1474:14;:120::i;:::-;1455:139;;1313:288;;;:::o;3900:149:41:-;3989:7;4015:11;:18;4027:5;4015:18;;;;;;;;;;;;;;;:27;4034:7;4015:27;;;;;;;;;;;;;;;;4008:34;;3900:149;;;;:::o;590:104:38:-;643:15;677:10;670:17;;590:104;:::o;9298:340:41:-;9416:1;9399:19;;:5;:19;;;;9391:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9496:1;9477:21;;:7;:21;;;;9469:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9578:6;9548:11;:18;9560:5;9548:18;;;;;;;;;;;;;;;:27;9567:7;9548:27;;;;;;;;;;;;;;;:36;;;;9615:7;9599:32;;9608:5;9599:32;;;9624:6;9599:32;;;;;;;;;;;;;;;;;;9298:340;;;:::o;6974:530::-;7097:1;7079:20;;:6;:20;;;;7071:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7180:1;7159:23;;:9;:23;;;;7151:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7233:47;7254:6;7262:9;7273:6;7233:20;:47::i;:::-;7311:71;7333:6;7311:71;;;;;;;;;;;;;;;;;:9;:17;7321:6;7311:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;7291:9;:17;7301:6;7291:17;;;;;;;;;;;;;;;:91;;;;7415:32;7440:6;7415:9;:20;7425:9;7415:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;7392:9;:20;7402:9;7392:20;;;;;;;;;;;;;;;:55;;;;7479:9;7462:35;;7471:6;7462:35;;;7490:6;7462:35;;;;;;;;;;;;;;;;;;6974:530;;;:::o;1746:187:40:-;1832:7;1864:1;1859;:6;;1867:12;1851:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1890:9;1906:1;1902;:5;1890:17;;1925:1;1918:8;;;1746:187;;;;;:::o;874:176::-;932:7;951:9;967:1;963;:5;951:17;;991:1;986;:6;;978:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1042:1;1035:8;;;874:176;;;;:::o;3556:740:36:-;3716:7;3757:1;3739:14;:12;:14::i;:::-;:19;3735:58;;;3781:1;3774:8;;;;3735:58;3904:28;3935:15;:95;;4016:14;:12;:14::i;:::-;3935:95;;;3965:36;3984:16;3965:14;:12;:14::i;:::-;:18;;:36;;;;:::i;:::-;3935:95;3904:126;;4151:138;4180:35;4201:13;:11;:13::i;:::-;4180:16;:20;;:35;;;;:::i;:::-;4233:20;4271:4;4151:11;:138::i;:::-;4132:157;;;3556:740;;;;;;:::o;2423:404::-;2545:4;1680:1:44;2260:7;;:19;;2252:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1680:1;2390:7;:18;;;;2565:31:36::1;2571:10;2583:12;2565:5;:31::i;:::-;2627:43;2646:10;2658:11;2627:18;:43::i;:::-;2606:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2753:45;2760:10;2772:11;2785:12;2753:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2816:4;2809:11;;1637:1:44::0;2563:7;:22;;;;2423:404:36;;;;:::o;1931:486::-;2000:4;1680:1:44;2260:7;;:19;;2252:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1680:1;2390:7;:18;;;;2016:20:36::1;2079:1:::0;2050:26:::1;2069:6;2050:14;:12;:14::i;:::-;:18;;:26;;;;:::i;:::-;:30;2046:249;;;2111:121;2167:6;2191:5;2214:4;2111:38;:121::i;:::-;2096:136;;2046:249;;;2278:6;2263:21;;2046:249;2304:31;2310:10;2322:12;2304:5;:31::i;:::-;2350:38;2355:10;2367:6;2375:12;2350:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2406:4;2399:11;;;1637:1:44::0;2563:7;:22;;;;1931:486:36;;;:::o;2180:459:40:-;2238:7;2484:1;2479;:6;2475:45;;;2508:1;2501:8;;;;2475:45;2530:9;2546:1;2542;:5;2530:17;;2574:1;2569;2565;:5;;;;;;:10;2557:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2631:1;2624:8;;;2180:459;;;;;:::o;3101:130::-;3159:7;3185:39;3189:1;3192;3185:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3178:46;;3101:130;;;;:::o;10636:92:41:-;;;;:::o;1321:134:40:-;1379:7;1405:43;1409:1;1412;1405:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1398:50;;1321:134;;;;:::o;830:226:8:-;940:7;959:13;975:8;981:1;975;:5;;:8;;;;:::i;:::-;959:24;;1001:7;:24;;;;;1024:1;1012:8;1018:1;1012;:5;;:8;;;;:::i;:::-;:13;;1001:24;1000:49;;1044:5;1000:49;;;1029:12;1039:1;1029:5;:9;;:12;;;;:::i;:::-;1000:49;993:56;;;830:226;;;;;:::o;8465:410:41:-;8567:1;8548:21;;:7;:21;;;;8540:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8618:49;8639:7;8656:1;8660:6;8618:20;:49::i;:::-;8699:68;8722:6;8699:68;;;;;;;;;;;;;;;;;:9;:18;8709:7;8699:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;8678:9;:18;8688:7;8678:18;;;;;;;;;;;;;;;:89;;;;8792:24;8809:6;8792:12;;:16;;:24;;;;:::i;:::-;8777:12;:39;;;;8857:1;8831:37;;8840:7;8831:37;;;8861:6;8831:37;;;;;;;;;;;;;;;;;;8465:410;;:::o;1174:182:34:-;1281:4;1315:12;:10;:12::i;:::-;1308:29;;;1338:2;1342:6;1308:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1301:48;;1174:182;;;;:::o;7775:370:41:-;7877:1;7858:21;;:7;:21;;;;7850:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7926:49;7955:1;7959:7;7968:6;7926:20;:49::i;:::-;8001:24;8018:6;8001:12;;:16;;:24;;;;:::i;:::-;7986:12;:39;;;;8056:30;8079:6;8056:9;:18;8066:7;8056:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;8035:9;:18;8045:7;8035:18;;;;;;;;;;;;;;;:51;;;;8122:7;8101:37;;8118:1;8101:37;;;8131:6;8101:37;;;;;;;;;;;;;;;;;;7775:370;;:::o;3713:272:40:-;3799:7;3830:1;3826;:5;3833:12;3818:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3856:9;3872:1;3868;:5;;;;;;3856:17;;3977:1;3970:8;;;3713:272;;;;;:::o;4436:128::-;4494:7;4520:37;4524:1;4527;4520:37;;;;;;;;;;;;;;;;;:3;:37::i;:::-;4513:44;;4436:128;;;;:::o;5035:163::-;5121:7;5153:1;5148;:6;;5156:12;5140:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5190:1;5186;:5;;;;;;5179:12;;5035:163;;;;;:::o",
  "source": "/*\n\n    Copyright 2020 Kollateral LLC.\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n\n*/\n\n// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.7.0;\n\nimport \"../token/CollateralizedErc20.sol\";\nimport \"../token/CollateralizedToken.sol\";\n\ncontract TestCollateralizedErc20 is CollateralizedErc20 {\n    constructor(\n        address underlying,\n        string memory name,\n        string memory symbol,\n        uint8 numDecimals\n    ) ERC20(name, symbol) CollateralizedToken(underlying) {\n        _setupDecimals(numDecimals);\n    }\n}\n",
  "sourcePath": "/Users/andrekorol/src/kollateral/protocol/contracts/testing/TestCollateralizedErc20.sol",
  "ast": {
    "absolutePath": "/Users/andrekorol/src/kollateral/protocol/contracts/testing/TestCollateralizedErc20.sol",
    "exportedSymbols": {
      "CollateralizedErc20": [
        4801
      ],
      "CollateralizedToken": [
        5197
      ],
      "Context": [
        5279
      ],
      "ERC20": [
        6087
      ],
      "ExtendedMath": [
        1506
      ],
      "IERC20": [
        6165
      ],
      "ReentrancyGuard": [
        6295
      ],
      "SafeMath": [
        5584
      ],
      "TestCollateralizedErc20": [
        4092
      ],
      "UnlimitedApprovalErc20": [
        5256
      ]
    },
    "id": 4093,
    "license": "Apache-2.0",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 4064,
        "literals": [
          "solidity",
          "^",
          "0.7",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "640:23:28"
      },
      {
        "absolutePath": "/Users/andrekorol/src/kollateral/protocol/contracts/token/CollateralizedErc20.sol",
        "file": "../token/CollateralizedErc20.sol",
        "id": 4065,
        "nodeType": "ImportDirective",
        "scope": 4093,
        "sourceUnit": 4802,
        "src": "665:42:28",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/andrekorol/src/kollateral/protocol/contracts/token/CollateralizedToken.sol",
        "file": "../token/CollateralizedToken.sol",
        "id": 4066,
        "nodeType": "ImportDirective",
        "scope": 4093,
        "sourceUnit": 5198,
        "src": "708:42:28",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "baseName": {
              "id": 4067,
              "name": "CollateralizedErc20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 4801,
              "src": "788:19:28",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_CollateralizedErc20_$4801",
                "typeString": "contract CollateralizedErc20"
              }
            },
            "id": 4068,
            "nodeType": "InheritanceSpecifier",
            "src": "788:19:28"
          }
        ],
        "contractDependencies": [
          1506,
          4801,
          5197,
          5256,
          5279,
          6087,
          6165,
          6295
        ],
        "contractKind": "contract",
        "fullyImplemented": true,
        "id": 4092,
        "linearizedBaseContracts": [
          4092,
          4801,
          5197,
          1506,
          6295,
          5256,
          6087,
          6165,
          5279
        ],
        "name": "TestCollateralizedErc20",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": {
              "id": 4090,
              "nodeType": "Block",
              "src": "997:44:28",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 4087,
                        "name": "numDecimals",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 4076,
                        "src": "1022:11:28",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      ],
                      "id": 4086,
                      "name": "_setupDecimals",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6075,
                      "src": "1007:14:28",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_uint8_$returns$__$",
                        "typeString": "function (uint8)"
                      }
                    },
                    "id": 4088,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1007:27:28",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 4089,
                  "nodeType": "ExpressionStatement",
                  "src": "1007:27:28"
                }
              ]
            },
            "id": 4091,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [
              {
                "arguments": [
                  {
                    "id": 4079,
                    "name": "name",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 4072,
                    "src": "951:4:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_memory_ptr",
                      "typeString": "string memory"
                    }
                  },
                  {
                    "id": 4080,
                    "name": "symbol",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 4074,
                    "src": "957:6:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_memory_ptr",
                      "typeString": "string memory"
                    }
                  }
                ],
                "id": 4081,
                "modifierName": {
                  "id": 4078,
                  "name": "ERC20",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 6087,
                  "src": "945:5:28",
                  "typeDescriptions": {
                    "typeIdentifier": "t_type$_t_contract$_ERC20_$6087_$",
                    "typeString": "type(contract ERC20)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "945:19:28"
              },
              {
                "arguments": [
                  {
                    "id": 4083,
                    "name": "underlying",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 4070,
                    "src": "985:10:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  }
                ],
                "id": 4084,
                "modifierName": {
                  "id": 4082,
                  "name": "CollateralizedToken",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 5197,
                  "src": "965:19:28",
                  "typeDescriptions": {
                    "typeIdentifier": "t_type$_t_contract$_CollateralizedToken_$5197_$",
                    "typeString": "type(contract CollateralizedToken)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "965:31:28"
              }
            ],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 4077,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 4070,
                  "mutability": "mutable",
                  "name": "underlying",
                  "nodeType": "VariableDeclaration",
                  "scope": 4091,
                  "src": "835:18:28",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 4069,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "835:7:28",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4072,
                  "mutability": "mutable",
                  "name": "name",
                  "nodeType": "VariableDeclaration",
                  "scope": 4091,
                  "src": "863:18:28",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 4071,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "863:6:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4074,
                  "mutability": "mutable",
                  "name": "symbol",
                  "nodeType": "VariableDeclaration",
                  "scope": 4091,
                  "src": "891:20:28",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 4073,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "891:6:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 4076,
                  "mutability": "mutable",
                  "name": "numDecimals",
                  "nodeType": "VariableDeclaration",
                  "scope": 4091,
                  "src": "921:17:28",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 4075,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "921:5:28",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "825:119:28"
            },
            "returnParameters": {
              "id": 4085,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "997:0:28"
            },
            "scope": 4092,
            "src": "814:227:28",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 4093,
        "src": "752:291:28"
      }
    ],
    "src": "640:404:28"
  },
  "legacyAST": {
    "attributes": {
      "absolutePath": "/Users/andrekorol/src/kollateral/protocol/contracts/testing/TestCollateralizedErc20.sol",
      "exportedSymbols": {
        "CollateralizedErc20": [
          4801
        ],
        "CollateralizedToken": [
          5197
        ],
        "Context": [
          5279
        ],
        "ERC20": [
          6087
        ],
        "ExtendedMath": [
          1506
        ],
        "IERC20": [
          6165
        ],
        "ReentrancyGuard": [
          6295
        ],
        "SafeMath": [
          5584
        ],
        "TestCollateralizedErc20": [
          4092
        ],
        "UnlimitedApprovalErc20": [
          5256
        ]
      },
      "license": "Apache-2.0"
    },
    "children": [
      {
        "attributes": {
          "literals": [
            "solidity",
            "^",
            "0.7",
            ".0"
          ]
        },
        "id": 4064,
        "name": "PragmaDirective",
        "src": "640:23:28"
      },
      {
        "attributes": {
          "SourceUnit": 4802,
          "absolutePath": "/Users/andrekorol/src/kollateral/protocol/contracts/token/CollateralizedErc20.sol",
          "file": "../token/CollateralizedErc20.sol",
          "scope": 4093,
          "symbolAliases": [
            null
          ],
          "unitAlias": ""
        },
        "id": 4065,
        "name": "ImportDirective",
        "src": "665:42:28"
      },
      {
        "attributes": {
          "SourceUnit": 5198,
          "absolutePath": "/Users/andrekorol/src/kollateral/protocol/contracts/token/CollateralizedToken.sol",
          "file": "../token/CollateralizedToken.sol",
          "scope": 4093,
          "symbolAliases": [
            null
          ],
          "unitAlias": ""
        },
        "id": 4066,
        "name": "ImportDirective",
        "src": "708:42:28"
      },
      {
        "attributes": {
          "abstract": false,
          "contractDependencies": [
            1506,
            4801,
            5197,
            5256,
            5279,
            6087,
            6165,
            6295
          ],
          "contractKind": "contract",
          "fullyImplemented": true,
          "linearizedBaseContracts": [
            4092,
            4801,
            5197,
            1506,
            6295,
            5256,
            6087,
            6165,
            5279
          ],
          "name": "TestCollateralizedErc20",
          "scope": 4093
        },
        "children": [
          {
            "attributes": {},
            "children": [
              {
                "attributes": {
                  "name": "CollateralizedErc20",
                  "referencedDeclaration": 4801,
                  "type": "contract CollateralizedErc20"
                },
                "id": 4067,
                "name": "UserDefinedTypeName",
                "src": "788:19:28"
              }
            ],
            "id": 4068,
            "name": "InheritanceSpecifier",
            "src": "788:19:28"
          },
          {
            "attributes": {
              "implemented": true,
              "isConstructor": true,
              "kind": "constructor",
              "name": "",
              "scope": 4092,
              "stateMutability": "nonpayable",
              "virtual": false,
              "visibility": "public"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "underlying",
                      "scope": 4091,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 4069,
                        "name": "ElementaryTypeName",
                        "src": "835:7:28"
                      }
                    ],
                    "id": 4070,
                    "name": "VariableDeclaration",
                    "src": "835:18:28"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "name",
                      "scope": 4091,
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "type": "string",
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "string",
                          "type": "string"
                        },
                        "id": 4071,
                        "name": "ElementaryTypeName",
                        "src": "863:6:28"
                      }
                    ],
                    "id": 4072,
                    "name": "VariableDeclaration",
                    "src": "863:18:28"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "symbol",
                      "scope": 4091,
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "type": "string",
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "string",
                          "type": "string"
                        },
                        "id": 4073,
                        "name": "ElementaryTypeName",
                        "src": "891:6:28"
                      }
                    ],
                    "id": 4074,
                    "name": "VariableDeclaration",
                    "src": "891:20:28"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "numDecimals",
                      "scope": 4091,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint8",
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint8",
                          "type": "uint8"
                        },
                        "id": 4075,
                        "name": "ElementaryTypeName",
                        "src": "921:5:28"
                      }
                    ],
                    "id": 4076,
                    "name": "VariableDeclaration",
                    "src": "921:17:28"
                  }
                ],
                "id": 4077,
                "name": "ParameterList",
                "src": "825:119:28"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 4085,
                "name": "ParameterList",
                "src": "997:0:28"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 6087,
                      "type": "type(contract ERC20)",
                      "value": "ERC20"
                    },
                    "id": 4078,
                    "name": "Identifier",
                    "src": "945:5:28"
                  },
                  {
                    "attributes": {
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 4072,
                      "type": "string memory",
                      "value": "name"
                    },
                    "id": 4079,
                    "name": "Identifier",
                    "src": "951:4:28"
                  },
                  {
                    "attributes": {
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 4074,
                      "type": "string memory",
                      "value": "symbol"
                    },
                    "id": 4080,
                    "name": "Identifier",
                    "src": "957:6:28"
                  }
                ],
                "id": 4081,
                "name": "ModifierInvocation",
                "src": "945:19:28"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 5197,
                      "type": "type(contract CollateralizedToken)",
                      "value": "CollateralizedToken"
                    },
                    "id": 4082,
                    "name": "Identifier",
                    "src": "965:19:28"
                  },
                  {
                    "attributes": {
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 4070,
                      "type": "address",
                      "value": "underlying"
                    },
                    "id": 4083,
                    "name": "Identifier",
                    "src": "985:10:28"
                  }
                ],
                "id": 4084,
                "name": "ModifierInvocation",
                "src": "965:31:28"
              },
              {
                "children": [
                  {
                    "children": [
                      {
                        "attributes": {
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "tryCall": false,
                          "type": "tuple()",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint8",
                                  "typeString": "uint8"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 6075,
                              "type": "function (uint8)",
                              "value": "_setupDecimals"
                            },
                            "id": 4086,
                            "name": "Identifier",
                            "src": "1007:14:28"
                          },
                          {
                            "attributes": {
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 4076,
                              "type": "uint8",
                              "value": "numDecimals"
                            },
                            "id": 4087,
                            "name": "Identifier",
                            "src": "1022:11:28"
                          }
                        ],
                        "id": 4088,
                        "name": "FunctionCall",
                        "src": "1007:27:28"
                      }
                    ],
                    "id": 4089,
                    "name": "ExpressionStatement",
                    "src": "1007:27:28"
                  }
                ],
                "id": 4090,
                "name": "Block",
                "src": "997:44:28"
              }
            ],
            "id": 4091,
            "name": "FunctionDefinition",
            "src": "814:227:28"
          }
        ],
        "id": 4092,
        "name": "ContractDefinition",
        "src": "752:291:28"
      }
    ],
    "id": 4093,
    "name": "SourceUnit",
    "src": "640:404:28"
  },
  "compiler": {
    "name": "solc",
    "version": "0.7.3+commit.9bfce1f6.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.3.3",
  "updatedAt": "2021-02-01T23:13:33.244Z",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "allowance(address,address)": {
        "details": "See {IERC20-allowance}."
      },
      "approve(address,uint256)": {
        "details": "See {IERC20-approve}. Requirements: - `spender` cannot be the zero address."
      },
      "balanceOf(address)": {
        "details": "See {IERC20-balanceOf}."
      },
      "decimals()": {
        "details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is called. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."
      },
      "decreaseAllowance(address,uint256)": {
        "details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."
      },
      "increaseAllowance(address,uint256)": {
        "details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address."
      },
      "name()": {
        "details": "Returns the name of the token."
      },
      "symbol()": {
        "details": "Returns the symbol of the token, usually a shorter version of the name."
      },
      "totalSupply()": {
        "details": "See {IERC20-totalSupply}."
      },
      "transfer(address,uint256)": {
        "details": "See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`."
      },
      "transferFrom(address,address,uint256)": {
        "details": "See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`."
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  }
}