{
  "_format": "hh-sol-artifact-1",
  "contractName": "TestERC721PermitUpgradeable",
  "sourceName": "contracts/soma/SecurityTokens/ERC721/extensions/tests/TestERC721PermitUpgradeable.sol",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "approved",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "Approval",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        }
      ],
      "name": "ApprovalForAll",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint8",
          "name": "version",
          "type": "uint8"
        }
      ],
      "name": "Initialized",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "DOMAIN_SEPARATOR",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "PERMIT_TYPEHASH",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "approve",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "getApproved",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "name_",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "version_",
          "type": "string"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "isApprovedForAll",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "mint",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "nonces",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "ownerOf",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "deadline",
          "type": "uint256"
        },
        {
          "internalType": "uint8",
          "name": "v",
          "type": "uint8"
        },
        {
          "internalType": "bytes32",
          "name": "r",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "s",
          "type": "bytes32"
        }
      ],
      "name": "permit",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "safeTransferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "safeTransferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        }
      ],
      "name": "setApprovalForAll",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "index",
          "type": "uint256"
        }
      ],
      "name": "tokenByIndex",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "index",
          "type": "uint256"
        }
      ],
      "name": "tokenOfOwnerByIndex",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "tokenURI",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "name": "transferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x608060405234801561001057600080fd5b50611f10806100206000396000f3fe6080604052600436106101355760003560e01c80634cd88b76116100ab578063937575261161006f578063937575261461036657806395d89b411461037b578063a22cb46514610390578063b88d4fde146103b0578063c87b56dd146103d0578063e985e9c5146103f057600080fd5b80634cd88b76146102d35780634f6ccce7146102f35780636352211e1461031357806370a08231146103335780637ac2ff7b1461035357600080fd5b806323b872dd116100fd57806323b872dd1461020a5780632f745c591461022a57806330adf81f1461024a5780633644e5151461027e57806340c10f191461029357806342842e0e146102b357600080fd5b806301ffc9a71461013a57806306fdde031461016f578063081812fc14610191578063095ea7b3146101c957806318160ddd146101eb575b600080fd5b34801561014657600080fd5b5061015a610155366004611937565b610439565b60405190151581526020015b60405180910390f35b34801561017b57600080fd5b50610184610464565b60405161016691906119a4565b34801561019d57600080fd5b506101b16101ac3660046119b7565b6104f6565b6040516001600160a01b039091168152602001610166565b3480156101d557600080fd5b506101e96101e43660046119ec565b61051d565b005b3480156101f757600080fd5b506099545b604051908152602001610166565b34801561021657600080fd5b506101e9610225366004611a16565b610637565b34801561023657600080fd5b506101fc6102453660046119ec565b610668565b34801561025657600080fd5b506101fc7f49ecf333e5b8c95c40fdafc95c1ad136e8914a8fb55e9dc8bb01eaa83a2df9ad81565b34801561028a57600080fd5b506101fc6106fe565b34801561029f57600080fd5b506101e96102ae3660046119ec565b61076e565b3480156102bf57600080fd5b506101e96102ce366004611a16565b61077c565b3480156102df57600080fd5b506101e96102ee366004611afe565b610797565b3480156102ff57600080fd5b506101fc61030e3660046119b7565b6108ab565b34801561031f57600080fd5b506101b161032e3660046119b7565b61093e565b34801561033f57600080fd5b506101fc61034e366004611b62565b61099e565b6101e9610361366004611b7d565b610a24565b34801561037257600080fd5b5060cb546101fc565b34801561038757600080fd5b50610184610dc1565b34801561039c57600080fd5b506101e96103ab366004611bdd565b610dd0565b3480156103bc57600080fd5b506101e96103cb366004611c19565b610ddb565b3480156103dc57600080fd5b506101846103eb3660046119b7565b610e13565b3480156103fc57600080fd5b5061015a61040b366004611c95565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b60006001600160e01b03198216637c2be27160e01b148061045e575061045e82610e87565b92915050565b60606065805461047390611cc8565b80601f016020809104026020016040519081016040528092919081815260200182805461049f90611cc8565b80156104ec5780601f106104c1576101008083540402835291602001916104ec565b820191906000526020600020905b8154815290600101906020018083116104cf57829003601f168201915b5050505050905090565b600061050182610eac565b506000908152606960205260409020546001600160a01b031690565b60006105288261093e565b9050806001600160a01b0316836001600160a01b03160361059a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806105b657506105b6813361040b565b6106285760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610591565b6106328383610f0e565b505050565b6106413382610f7c565b61065d5760405162461bcd60e51b815260040161059190611d02565b610632838383610ffb565b60006106738361099e565b82106106d55760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610591565b506001600160a01b03919091166000908152609760209081526040808320938352929052205490565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c95460ca5461072e4690565b604080516020810195909552840192909252606083015260808201523060a082015260c00160405160208183030381529060405280519060200120905090565b61077882826111a2565b5050565b61063283838360405180602001604052806000815250610ddb565b600054610100900460ff16158080156107b75750600054600160ff909116105b806107d15750303b1580156107d1575060005460ff166001145b6108345760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610591565b6000805460ff191660011790558015610857576000805461ff0019166101001790555b61086183836112f0565b8015610632576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b60006108b660995490565b82106109195760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610591565b6099828154811061092c5761092c611d50565b90600052602060002001549050919050565b6000818152606760205260408120546001600160a01b03168061045e5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610591565b60006001600160a01b038216610a085760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610591565b506001600160a01b031660009081526068602052604090205490565b83421115610a655760405162461bcd60e51b815260206004820152600e60248201526d14195c9b5a5d08195e1c1a5c995960921b6044820152606401610591565b6000610a6f6106fe565b7f49ecf333e5b8c95c40fdafc95c1ad136e8914a8fb55e9dc8bb01eaa83a2df9ad8888610a9b81611370565b6040805160208101959095526001600160a01b03909316928401929092526060830152608082015260a0810187905260c00160405160208183030381529060405280519060200120604051602001610b0a92919061190160f01b81526002810192909252602282015260420190565b6040516020818303038152906040528051906020012090506000610b2d8761093e565b9050806001600160a01b0316886001600160a01b031603610bab5760405162461bcd60e51b815260206004820152603260248201527f4552433732315065726d69745570677261646561626c653a20617070726f766160448201527136103a379031bab93932b73a1037bbb732b960711b6064820152608401610591565b6001600160a01b0381163b15610cb057604080516020810186905280820185905260f887901b6001600160f81b0319166060820152815160418183030181526061820192839052630b135d3f60e11b9092526001600160a01b03831691631626ba7e91610c1c918691606501611d66565b602060405180830381865afa158015610c39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5d9190611d7f565b6001600160e01b031916631626ba7e60e01b14610cab5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610591565b610dad565b6040805160008082526020820180845285905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610d04573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610d5b5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610591565b816001600160a01b0316816001600160a01b031614610dab5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610591565b505b610db78888610f0e565b5050505050505050565b60606066805461047390611cc8565b610778338383611386565b610de53383610f7c565b610e015760405162461bcd60e51b815260040161059190611d02565b610e0d84848484611454565b50505050565b6060610e1e82610eac565b6000610e3560408051602081019091526000815290565b90506000815111610e555760405180602001604052806000815250610e80565b80610e5f84611487565b604051602001610e70929190611d9c565b6040516020818303038152906040525b9392505050565b60006001600160e01b0319821663780e9d6360e01b148061045e575061045e82611588565b6000818152606760205260409020546001600160a01b0316610f0b5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610591565b50565b600081815260696020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610f438261093e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610f888361093e565b9050806001600160a01b0316846001600160a01b03161480610fcf57506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b80610ff35750836001600160a01b0316610fe8846104f6565b6001600160a01b0316145b949350505050565b826001600160a01b031661100e8261093e565b6001600160a01b0316146110725760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610591565b6001600160a01b0382166110d45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610591565b6110df8383836115d8565b6110ea600082610f0e565b6001600160a01b0383166000908152606860205260408120805460019290611113908490611de1565b90915550506001600160a01b0382166000908152606860205260408120805460019290611141908490611df4565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166111f85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610591565b6000818152606760205260409020546001600160a01b03161561125d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610591565b611269600083836115d8565b6001600160a01b0382166000908152606860205260408120805460019290611292908490611df4565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600054610100900460ff1661135b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610591565b815160209283012060c955805191012060ca55565b60cb5461137e816001611df4565b60cb55919050565b816001600160a01b0316836001600160a01b0316036113e75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610591565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61145f848484610ffb565b61146b84848484611690565b610e0d5760405162461bcd60e51b815260040161059190611e07565b6060816000036114ae5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156114d857806114c281611e59565b91506114d19050600a83611e88565b91506114b2565b60008167ffffffffffffffff8111156114f3576114f3611a52565b6040519080825280601f01601f19166020018201604052801561151d576020820181803683370190505b5090505b8415610ff357611532600183611de1565b915061153f600a86611e9c565b61154a906030611df4565b60f81b81838151811061155f5761155f611d50565b60200101906001600160f81b031916908160001a905350611581600a86611e88565b9450611521565b60006001600160e01b031982166380ac58cd60e01b14806115b957506001600160e01b03198216635b5e139f60e01b145b8061045e57506301ffc9a760e01b6001600160e01b031983161461045e565b6001600160a01b0383166116335761162e81609980546000838152609a60205260408120829055600182018355919091527f72a152ddfb8e864297c917af52ea6c1c68aead0fee1a62673fcc7e0c94979d000155565b611656565b816001600160a01b0316836001600160a01b031614611656576116568382611791565b6001600160a01b03821661166d576106328161182e565b826001600160a01b0316826001600160a01b0316146106325761063282826118dd565b60006001600160a01b0384163b1561178657604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906116d4903390899088908890600401611eb0565b6020604051808303816000875af192505050801561170f575060408051601f3d908101601f1916820190925261170c91810190611d7f565b60015b61176c573d80801561173d576040519150601f19603f3d011682016040523d82523d6000602084013e611742565b606091505b5080516000036117645760405162461bcd60e51b815260040161059190611e07565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610ff3565b506001949350505050565b6000600161179e8461099e565b6117a89190611de1565b6000838152609860205260409020549091508082146117fb576001600160a01b03841660009081526097602090815260408083208584528252808320548484528184208190558352609890915290208190555b5060009182526098602090815260408084208490556001600160a01b039094168352609781528383209183525290812055565b60995460009061184090600190611de1565b6000838152609a60205260408120546099805493945090928490811061186857611868611d50565b90600052602060002001549050806099838154811061188957611889611d50565b6000918252602080832090910192909255828152609a909152604080822084905585825281205560998054806118c1576118c1611eed565b6001900381819060005260206000200160009055905550505050565b60006118e88361099e565b6001600160a01b039093166000908152609760209081526040808320868452825280832085905593825260989052919091209190915550565b6001600160e01b031981168114610f0b57600080fd5b60006020828403121561194957600080fd5b8135610e8081611921565b60005b8381101561196f578181015183820152602001611957565b50506000910152565b60008151808452611990816020860160208601611954565b601f01601f19169290920160200192915050565b602081526000610e806020830184611978565b6000602082840312156119c957600080fd5b5035919050565b80356001600160a01b03811681146119e757600080fd5b919050565b600080604083850312156119ff57600080fd5b611a08836119d0565b946020939093013593505050565b600080600060608486031215611a2b57600080fd5b611a34846119d0565b9250611a42602085016119d0565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611a8357611a83611a52565b604051601f8501601f19908116603f01168101908282118183101715611aab57611aab611a52565b81604052809350858152868686011115611ac457600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112611aef57600080fd5b610e8083833560208501611a68565b60008060408385031215611b1157600080fd5b823567ffffffffffffffff80821115611b2957600080fd5b611b3586838701611ade565b93506020850135915080821115611b4b57600080fd5b50611b5885828601611ade565b9150509250929050565b600060208284031215611b7457600080fd5b610e80826119d0565b60008060008060008060c08789031215611b9657600080fd5b611b9f876119d0565b95506020870135945060408701359350606087013560ff81168114611bc357600080fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215611bf057600080fd5b611bf9836119d0565b915060208301358015158114611c0e57600080fd5b809150509250929050565b60008060008060808587031215611c2f57600080fd5b611c38856119d0565b9350611c46602086016119d0565b925060408501359150606085013567ffffffffffffffff811115611c6957600080fd5b8501601f81018713611c7a57600080fd5b611c8987823560208401611a68565b91505092959194509250565b60008060408385031215611ca857600080fd5b611cb1836119d0565b9150611cbf602084016119d0565b90509250929050565b600181811c90821680611cdc57607f821691505b602082108103611cfc57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b828152604060208201526000610ff36040830184611978565b600060208284031215611d9157600080fd5b8151610e8081611921565b60008351611dae818460208801611954565b835190830190611dc2818360208801611954565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561045e5761045e611dcb565b8082018082111561045e5761045e611dcb565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600060018201611e6b57611e6b611dcb565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082611e9757611e97611e72565b500490565b600082611eab57611eab611e72565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611ee390830184611978565b9695505050505050565b634e487b7160e01b600052603160045260246000fdfea164736f6c6343000812000a",
  "deployedBytecode": "0x6080604052600436106101355760003560e01c80634cd88b76116100ab578063937575261161006f578063937575261461036657806395d89b411461037b578063a22cb46514610390578063b88d4fde146103b0578063c87b56dd146103d0578063e985e9c5146103f057600080fd5b80634cd88b76146102d35780634f6ccce7146102f35780636352211e1461031357806370a08231146103335780637ac2ff7b1461035357600080fd5b806323b872dd116100fd57806323b872dd1461020a5780632f745c591461022a57806330adf81f1461024a5780633644e5151461027e57806340c10f191461029357806342842e0e146102b357600080fd5b806301ffc9a71461013a57806306fdde031461016f578063081812fc14610191578063095ea7b3146101c957806318160ddd146101eb575b600080fd5b34801561014657600080fd5b5061015a610155366004611937565b610439565b60405190151581526020015b60405180910390f35b34801561017b57600080fd5b50610184610464565b60405161016691906119a4565b34801561019d57600080fd5b506101b16101ac3660046119b7565b6104f6565b6040516001600160a01b039091168152602001610166565b3480156101d557600080fd5b506101e96101e43660046119ec565b61051d565b005b3480156101f757600080fd5b506099545b604051908152602001610166565b34801561021657600080fd5b506101e9610225366004611a16565b610637565b34801561023657600080fd5b506101fc6102453660046119ec565b610668565b34801561025657600080fd5b506101fc7f49ecf333e5b8c95c40fdafc95c1ad136e8914a8fb55e9dc8bb01eaa83a2df9ad81565b34801561028a57600080fd5b506101fc6106fe565b34801561029f57600080fd5b506101e96102ae3660046119ec565b61076e565b3480156102bf57600080fd5b506101e96102ce366004611a16565b61077c565b3480156102df57600080fd5b506101e96102ee366004611afe565b610797565b3480156102ff57600080fd5b506101fc61030e3660046119b7565b6108ab565b34801561031f57600080fd5b506101b161032e3660046119b7565b61093e565b34801561033f57600080fd5b506101fc61034e366004611b62565b61099e565b6101e9610361366004611b7d565b610a24565b34801561037257600080fd5b5060cb546101fc565b34801561038757600080fd5b50610184610dc1565b34801561039c57600080fd5b506101e96103ab366004611bdd565b610dd0565b3480156103bc57600080fd5b506101e96103cb366004611c19565b610ddb565b3480156103dc57600080fd5b506101846103eb3660046119b7565b610e13565b3480156103fc57600080fd5b5061015a61040b366004611c95565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b60006001600160e01b03198216637c2be27160e01b148061045e575061045e82610e87565b92915050565b60606065805461047390611cc8565b80601f016020809104026020016040519081016040528092919081815260200182805461049f90611cc8565b80156104ec5780601f106104c1576101008083540402835291602001916104ec565b820191906000526020600020905b8154815290600101906020018083116104cf57829003601f168201915b5050505050905090565b600061050182610eac565b506000908152606960205260409020546001600160a01b031690565b60006105288261093e565b9050806001600160a01b0316836001600160a01b03160361059a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b03821614806105b657506105b6813361040b565b6106285760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c00006064820152608401610591565b6106328383610f0e565b505050565b6106413382610f7c565b61065d5760405162461bcd60e51b815260040161059190611d02565b610632838383610ffb565b60006106738361099e565b82106106d55760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610591565b506001600160a01b03919091166000908152609760209081526040808320938352929052205490565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60c95460ca5461072e4690565b604080516020810195909552840192909252606083015260808201523060a082015260c00160405160208183030381529060405280519060200120905090565b61077882826111a2565b5050565b61063283838360405180602001604052806000815250610ddb565b600054610100900460ff16158080156107b75750600054600160ff909116105b806107d15750303b1580156107d1575060005460ff166001145b6108345760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610591565b6000805460ff191660011790558015610857576000805461ff0019166101001790555b61086183836112f0565b8015610632576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b60006108b660995490565b82106109195760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610591565b6099828154811061092c5761092c611d50565b90600052602060002001549050919050565b6000818152606760205260408120546001600160a01b03168061045e5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610591565b60006001600160a01b038216610a085760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610591565b506001600160a01b031660009081526068602052604090205490565b83421115610a655760405162461bcd60e51b815260206004820152600e60248201526d14195c9b5a5d08195e1c1a5c995960921b6044820152606401610591565b6000610a6f6106fe565b7f49ecf333e5b8c95c40fdafc95c1ad136e8914a8fb55e9dc8bb01eaa83a2df9ad8888610a9b81611370565b6040805160208101959095526001600160a01b03909316928401929092526060830152608082015260a0810187905260c00160405160208183030381529060405280519060200120604051602001610b0a92919061190160f01b81526002810192909252602282015260420190565b6040516020818303038152906040528051906020012090506000610b2d8761093e565b9050806001600160a01b0316886001600160a01b031603610bab5760405162461bcd60e51b815260206004820152603260248201527f4552433732315065726d69745570677261646561626c653a20617070726f766160448201527136103a379031bab93932b73a1037bbb732b960711b6064820152608401610591565b6001600160a01b0381163b15610cb057604080516020810186905280820185905260f887901b6001600160f81b0319166060820152815160418183030181526061820192839052630b135d3f60e11b9092526001600160a01b03831691631626ba7e91610c1c918691606501611d66565b602060405180830381865afa158015610c39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5d9190611d7f565b6001600160e01b031916631626ba7e60e01b14610cab5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610591565b610dad565b6040805160008082526020820180845285905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610d04573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610d5b5760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610591565b816001600160a01b0316816001600160a01b031614610dab5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610591565b505b610db78888610f0e565b5050505050505050565b60606066805461047390611cc8565b610778338383611386565b610de53383610f7c565b610e015760405162461bcd60e51b815260040161059190611d02565b610e0d84848484611454565b50505050565b6060610e1e82610eac565b6000610e3560408051602081019091526000815290565b90506000815111610e555760405180602001604052806000815250610e80565b80610e5f84611487565b604051602001610e70929190611d9c565b6040516020818303038152906040525b9392505050565b60006001600160e01b0319821663780e9d6360e01b148061045e575061045e82611588565b6000818152606760205260409020546001600160a01b0316610f0b5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610591565b50565b600081815260696020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610f438261093e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080610f888361093e565b9050806001600160a01b0316846001600160a01b03161480610fcf57506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b80610ff35750836001600160a01b0316610fe8846104f6565b6001600160a01b0316145b949350505050565b826001600160a01b031661100e8261093e565b6001600160a01b0316146110725760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610591565b6001600160a01b0382166110d45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610591565b6110df8383836115d8565b6110ea600082610f0e565b6001600160a01b0383166000908152606860205260408120805460019290611113908490611de1565b90915550506001600160a01b0382166000908152606860205260408120805460019290611141908490611df4565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166111f85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610591565b6000818152606760205260409020546001600160a01b03161561125d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610591565b611269600083836115d8565b6001600160a01b0382166000908152606860205260408120805460019290611292908490611df4565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600054610100900460ff1661135b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610591565b815160209283012060c955805191012060ca55565b60cb5461137e816001611df4565b60cb55919050565b816001600160a01b0316836001600160a01b0316036113e75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610591565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61145f848484610ffb565b61146b84848484611690565b610e0d5760405162461bcd60e51b815260040161059190611e07565b6060816000036114ae5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156114d857806114c281611e59565b91506114d19050600a83611e88565b91506114b2565b60008167ffffffffffffffff8111156114f3576114f3611a52565b6040519080825280601f01601f19166020018201604052801561151d576020820181803683370190505b5090505b8415610ff357611532600183611de1565b915061153f600a86611e9c565b61154a906030611df4565b60f81b81838151811061155f5761155f611d50565b60200101906001600160f81b031916908160001a905350611581600a86611e88565b9450611521565b60006001600160e01b031982166380ac58cd60e01b14806115b957506001600160e01b03198216635b5e139f60e01b145b8061045e57506301ffc9a760e01b6001600160e01b031983161461045e565b6001600160a01b0383166116335761162e81609980546000838152609a60205260408120829055600182018355919091527f72a152ddfb8e864297c917af52ea6c1c68aead0fee1a62673fcc7e0c94979d000155565b611656565b816001600160a01b0316836001600160a01b031614611656576116568382611791565b6001600160a01b03821661166d576106328161182e565b826001600160a01b0316826001600160a01b0316146106325761063282826118dd565b60006001600160a01b0384163b1561178657604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906116d4903390899088908890600401611eb0565b6020604051808303816000875af192505050801561170f575060408051601f3d908101601f1916820190925261170c91810190611d7f565b60015b61176c573d80801561173d576040519150601f19603f3d011682016040523d82523d6000602084013e611742565b606091505b5080516000036117645760405162461bcd60e51b815260040161059190611e07565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610ff3565b506001949350505050565b6000600161179e8461099e565b6117a89190611de1565b6000838152609860205260409020549091508082146117fb576001600160a01b03841660009081526097602090815260408083208584528252808320548484528184208190558352609890915290208190555b5060009182526098602090815260408084208490556001600160a01b039094168352609781528383209183525290812055565b60995460009061184090600190611de1565b6000838152609a60205260408120546099805493945090928490811061186857611868611d50565b90600052602060002001549050806099838154811061188957611889611d50565b6000918252602080832090910192909255828152609a909152604080822084905585825281205560998054806118c1576118c1611eed565b6001900381819060005260206000200160009055905550505050565b60006118e88361099e565b6001600160a01b039093166000908152609760209081526040808320868452825280832085905593825260989052919091209190915550565b6001600160e01b031981168114610f0b57600080fd5b60006020828403121561194957600080fd5b8135610e8081611921565b60005b8381101561196f578181015183820152602001611957565b50506000910152565b60008151808452611990816020860160208601611954565b601f01601f19169290920160200192915050565b602081526000610e806020830184611978565b6000602082840312156119c957600080fd5b5035919050565b80356001600160a01b03811681146119e757600080fd5b919050565b600080604083850312156119ff57600080fd5b611a08836119d0565b946020939093013593505050565b600080600060608486031215611a2b57600080fd5b611a34846119d0565b9250611a42602085016119d0565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611a8357611a83611a52565b604051601f8501601f19908116603f01168101908282118183101715611aab57611aab611a52565b81604052809350858152868686011115611ac457600080fd5b858560208301376000602087830101525050509392505050565b600082601f830112611aef57600080fd5b610e8083833560208501611a68565b60008060408385031215611b1157600080fd5b823567ffffffffffffffff80821115611b2957600080fd5b611b3586838701611ade565b93506020850135915080821115611b4b57600080fd5b50611b5885828601611ade565b9150509250929050565b600060208284031215611b7457600080fd5b610e80826119d0565b60008060008060008060c08789031215611b9657600080fd5b611b9f876119d0565b95506020870135945060408701359350606087013560ff81168114611bc357600080fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215611bf057600080fd5b611bf9836119d0565b915060208301358015158114611c0e57600080fd5b809150509250929050565b60008060008060808587031215611c2f57600080fd5b611c38856119d0565b9350611c46602086016119d0565b925060408501359150606085013567ffffffffffffffff811115611c6957600080fd5b8501601f81018713611c7a57600080fd5b611c8987823560208401611a68565b91505092959194509250565b60008060408385031215611ca857600080fd5b611cb1836119d0565b9150611cbf602084016119d0565b90509250929050565b600181811c90821680611cdc57607f821691505b602082108103611cfc57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b828152604060208201526000610ff36040830184611978565b600060208284031215611d9157600080fd5b8151610e8081611921565b60008351611dae818460208801611954565b835190830190611dc2818360208801611954565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561045e5761045e611dcb565b8082018082111561045e5761045e611dcb565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600060018201611e6b57611e6b611dcb565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082611e9757611e97611e72565b500490565b600082611eab57611eab611e72565b500690565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611ee390830184611978565b9695505050505050565b634e487b7160e01b600052603160045260246000fdfea164736f6c6343000812000a",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
