{
  "_format": "hh-sol-artifact-1",
  "contractName": "MockERC721Storage",
  "sourceName": "contracts/mocks/MockERC721Storage.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_svgRender_",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_traitsFetch_",
          "type": "address"
        },
        {
          "components": [
            {
              "internalType": "string",
              "name": "name",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "description",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "image",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "externalLink",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "sellerFeeBasisPoints",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "feeRecipient",
              "type": "string"
            }
          ],
          "internalType": "struct ERC721Storage.ContractURI",
          "name": "_contractURI_",
          "type": "tuple"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "NewOwnerIsZeroAddress",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NoHandoverRequest",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "Unauthorized",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "components": [
            {
              "internalType": "string",
              "name": "name",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "description",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "image",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "externalLink",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "sellerFeeBasisPoints",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "feeRecipient",
              "type": "string"
            }
          ],
          "indexed": false,
          "internalType": "struct ERC721Storage.ContractURI",
          "name": "contractURI",
          "type": "tuple"
        }
      ],
      "name": "ContractURIUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "pendingOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipHandoverCanceled",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "pendingOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipHandoverRequested",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "oldOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "roles",
          "type": "uint256"
        }
      ],
      "name": "RolesUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "svgRender",
          "type": "address"
        }
      ],
      "name": "SvgRenderUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "traitsFetch",
          "type": "address"
        }
      ],
      "name": "TraitsFetchUpdated",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "cancelOwnershipHandover",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "pendingOwner",
          "type": "address"
        }
      ],
      "name": "completeOwnershipHandover",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "constructContractURI",
      "outputs": [
        {
          "internalType": "string",
          "name": "uri",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "tokenId",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "input0",
          "type": "bytes"
        },
        {
          "internalType": "bytes",
          "name": "input1",
          "type": "bytes"
        }
      ],
      "name": "constructTokenURI",
      "outputs": [
        {
          "internalType": "string",
          "name": "uri",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getContractDescription",
      "outputs": [
        {
          "components": [
            {
              "internalType": "string",
              "name": "name",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "description",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "image",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "externalLink",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "sellerFeeBasisPoints",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "feeRecipient",
              "type": "string"
            }
          ],
          "internalType": "struct ERC721Storage.ContractURI",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getERC721KRender",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getERC72KTraits",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "roles",
          "type": "uint256"
        }
      ],
      "name": "grantRoles",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "roles",
          "type": "uint256"
        }
      ],
      "name": "hasAllRoles",
      "outputs": [
        {
          "internalType": "bool",
          "name": "result",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "roles",
          "type": "uint256"
        }
      ],
      "name": "hasAnyRole",
      "outputs": [
        {
          "internalType": "bool",
          "name": "result",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "roles",
          "type": "uint256"
        }
      ],
      "name": "ordinalsFromRoles",
      "outputs": [
        {
          "internalType": "uint8[]",
          "name": "ordinals",
          "type": "uint8[]"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "result",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "pendingOwner",
          "type": "address"
        }
      ],
      "name": "ownershipHandoverExpiresAt",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "result",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ownershipHandoverValidFor",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "input",
          "type": "bytes"
        }
      ],
      "name": "render",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "roles",
          "type": "uint256"
        }
      ],
      "name": "renounceRoles",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "requestOwnershipHandover",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "roles",
          "type": "uint256"
        }
      ],
      "name": "revokeRoles",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8[]",
          "name": "ordinals",
          "type": "uint8[]"
        }
      ],
      "name": "rolesFromOrdinals",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "roles",
          "type": "uint256"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "user",
          "type": "address"
        }
      ],
      "name": "rolesOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "roles",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "string",
              "name": "name",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "description",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "image",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "externalLink",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "sellerFeeBasisPoints",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "feeRecipient",
              "type": "string"
            }
          ],
          "internalType": "struct ERC721Storage.ContractURI",
          "name": "contractURI",
          "type": "tuple"
        }
      ],
      "name": "setContractURI",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "svgRender",
          "type": "address"
        }
      ],
      "name": "setSvgRender",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "traitsFetch",
          "type": "address"
        }
      ],
      "name": "setTraitsFetch",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    }
  ],
  "bytecode": "0x60806040523480156200001157600080fd5b506040516200222238038062002222833981016040819052620000349162000270565b600080546001600160a01b038086166001600160a01b03199283161790925560018054928516929091169190911790558051839083908390819060029081906200007f90826200045e565b50602082015160018201906200009690826200045e565b5060408201516002820190620000ad90826200045e565b5060608201516003820190620000c490826200045e565b5060808201516004820190620000db90826200045e565b5060a08201516005820190620000f290826200045e565b506200010291503390506200010e565b5050505050506200052a565b6001600160a01b0316638b78c6d8198190558060007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a350565b80516001600160a01b03811681146200016257600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b0381118282101715620001a257620001a262000167565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620001d357620001d362000167565b604052919050565b600082601f830112620001ed57600080fd5b81516001600160401b0381111562000209576200020962000167565b60206200021f601f8301601f19168201620001a8565b82815285828487010111156200023457600080fd5b60005b838110156200025457858101830151828201840152820162000237565b83811115620002665760008385840101525b5095945050505050565b6000806000606084860312156200028657600080fd5b62000291846200014a565b9250620002a1602085016200014a565b60408501519092506001600160401b0380821115620002bf57600080fd5b9085019060c08288031215620002d457600080fd5b620002de6200017d565b825182811115620002ee57600080fd5b620002fc89828601620001db565b8252506020830151828111156200031257600080fd5b6200032089828601620001db565b6020830152506040830151828111156200033957600080fd5b6200034789828601620001db565b6040830152506060830151828111156200036057600080fd5b6200036e89828601620001db565b6060830152506080830151828111156200038757600080fd5b6200039589828601620001db565b60808301525060a083015182811115620003ae57600080fd5b620003bc89828601620001db565b60a0830152508093505050509250925092565b600181811c90821680620003e457607f821691505b6020821081036200040557634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200045957600081815260208120601f850160051c81016020861015620004345750805b601f850160051c820191505b81811015620004555782815560010162000440565b5050505b505050565b81516001600160401b038111156200047a576200047a62000167565b62000492816200048b8454620003cf565b846200040b565b602080601f831160018114620004ca5760008415620004b15750858301515b600019600386901b1c1916600185901b17855562000455565b600085815260208120601f198616915b82811015620004fb57888601518255948401946001909101908401620004da565b50858210156200051a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b611ce8806200053a6000396000f3fe6080604052600436106101665760003560e01c806357e30f44116100d1578063ae70ed131161008a578063f04e283e11610064578063f04e283e14610418578063f06796161461042b578063f2fde38b1461044b578063fee81cf41461045e57600080fd5b8063ae70ed13146103b8578063d12bcb12146103d8578063d7533f02146103fa57600080fd5b806357e30f4414610317578063715018a614610337578063725fa09c1461033f5780637359e41f146103545780638da5cb5b14610381578063a4cd86961461039a57600080fd5b80632de94807116101235780632de9480714610247578063316df61e146102785780633ee6fa92146102a55780634a4ee7b1146102c5578063514e62fc146102d857806354d1f13d1461030f57600080fd5b806313a661ed1461016b578063183a4f6e1461019e5780631c10893f146101b35780631cd64df4146101c6578063256929621461020d57806325c28b4a14610215575b600080fd5b34801561017757600080fd5b5061018b61018636600461127a565b61048f565b6040519081526020015b60405180910390f35b6101b16101ac366004611333565b6104c2565b005b6101b16101c1366004611368565b6104cf565b3480156101d257600080fd5b506101fd6101e1366004611368565b60609190911b638b78c6d8176000908152602090205481161490565b6040519015158152602001610195565b6101b16104f8565b34801561022157600080fd5b506001546001600160a01b03165b6040516001600160a01b039091168152602001610195565b34801561025357600080fd5b5061018b610262366004611392565b60601b638b78c6d8176000908152602090205490565b34801561028457600080fd5b50610298610293366004611432565b610549565b60405161019591906114cb565b3480156102b157600080fd5b506101b16102c0366004611392565b6105c5565b6101b16102d3366004611368565b610635565b3480156102e457600080fd5b506101fd6102f3366004611368565b60609190911b638b78c6d8176000908152602090205416151590565b6101b161065a565b34801561032357600080fd5b506101b16103323660046114de565b610697565b6101b1610761565b34801561034b57600080fd5b506102986107af565b34801561036057600080fd5b5061037461036f366004611333565b61080f565b60405161019591906115ff565b34801561038d57600080fd5b50638b78c6d8195461022f565b3480156103a657600080fd5b506000546001600160a01b031661022f565b3480156103c457600080fd5b506101b16103d3366004611392565b610857565b3480156103e457600080fd5b506103ed6108c0565b6040516101959190611646565b34801561040657600080fd5b506040516202a3008152602001610195565b6101b1610426366004611392565b610c77565b34801561043757600080fd5b506102986104463660046116fe565b610cf9565b6101b1610459366004611392565b610e42565b34801561046a57600080fd5b5061018b610479366004611392565b60601b63389a75e1176000908152602090205490565b600060208201825160051b81015b8082146104bb57600160ff8351161b8317925060208201915061049d565b5050919050565b6104cc3382610ea9565b50565b638b78c6d8195433146104ea576382b429006000526004601cfd5b6104f48282610efa565b5050565b60006202a30067ffffffffffffffff164201905063389a75e13360601b1760005280602060002055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b6000546040516318b6fb0f60e11b81526060916001600160a01b03169063316df61e9061057a9085906004016114cb565b600060405180830381865afa158015610597573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105bf919081019061176b565b92915050565b638b78c6d8195433146105e0576382b429006000526004601cfd5b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f10c0817f42b2182992d55b707430b153f12e59d7e54a975bfec790497dd7f63f906020015b60405180910390a150565b638b78c6d819543314610650576382b429006000526004601cfd5b6104f48282610ea9565b63389a75e13360601b176000526000602060002055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b638b78c6d8195433146106b2576382b429006000526004601cfd5b8051819060029081906106c59082611862565b50602082015160018201906106da9082611862565b50604082015160028201906106ef9082611862565b50606082015160038201906107049082611862565b50608082015160048201906107199082611862565b5060a0820151600582019061072e9082611862565b509050507f03a10335d532669eac03b3b7e4ce44aff7f8cb14b7aa397c653fdcb40ae06bec8160405161062a9190611646565b638b78c6d81954331461077c576382b429006000526004601cfd5b6000337f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a36000638b78c6d81955565b6040516060906107eb906107d790600290600390600490600590600690600790602001611995565b604051602081830303815290604052610f46565b6040516020016107fb9190611b1b565b604051602081830303815290604052905090565b606060206040510160005b8082526001841660051b820191508360011c9350831561083c5760010161081a565b5060405191508060405260208201810360051c825250919050565b638b78c6d819543314610872576382b429006000526004601cfd5b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527f3c2715cb5e4b39dd4af38ac12bb292a030fb6a063dbd5467ed49da665bcaa9739060200161062a565b6108f96040518060c001604052806060815260200160608152602001606081526020016060815260200160608152602001606081525090565b60026040518060c0016040529081600082018054610916906117d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610942906117d9565b801561098f5780601f106109645761010080835404028352916020019161098f565b820191906000526020600020905b81548152906001019060200180831161097257829003601f168201915b505050505081526020016001820180546109a8906117d9565b80601f01602080910402602001604051908101604052809291908181526020018280546109d4906117d9565b8015610a215780601f106109f657610100808354040283529160200191610a21565b820191906000526020600020905b815481529060010190602001808311610a0457829003601f168201915b50505050508152602001600282018054610a3a906117d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610a66906117d9565b8015610ab35780601f10610a8857610100808354040283529160200191610ab3565b820191906000526020600020905b815481529060010190602001808311610a9657829003601f168201915b50505050508152602001600382018054610acc906117d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610af8906117d9565b8015610b455780601f10610b1a57610100808354040283529160200191610b45565b820191906000526020600020905b815481529060010190602001808311610b2857829003601f168201915b50505050508152602001600482018054610b5e906117d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8a906117d9565b8015610bd75780601f10610bac57610100808354040283529160200191610bd7565b820191906000526020600020905b815481529060010190602001808311610bba57829003601f168201915b50505050508152602001600582018054610bf0906117d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1c906117d9565b8015610c695780601f10610c3e57610100808354040283529160200191610c69565b820191906000526020600020905b815481529060010190602001808311610c4c57829003601f168201915b505050505081525050905090565b638b78c6d819543314610c92576382b429006000526004601cfd5b8060601b60601c905063389a75e18160601b1760005260206000208054421115610cc457636f5e88186000526004601cfd5b600081555080337f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3638b78c6d81955565b600080546040516318b6fb0f60e11b8152606092916001600160a01b03169063316df61e90610d2c9087906004016114cb565b600060405180830381865afa158015610d49573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d71919081019061176b565b60015460405163f6559a6b60e01b81529192506000916001600160a01b039091169063f6559a6b90610da79087906004016114cb565b600060405180830381865afa158015610dc4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610dec919081019061176b565b9050610e18610dfa87610f54565b610e0388610f85565b84846040516020016107d79493929190611b60565b604051602001610e289190611b1b565b604051602081830303815290604052925050509392505050565b638b78c6d819543314610e5d576382b429006000526004601cfd5b6001600160a01b031680610e7957637448fbae6000526004601cfd5b80337f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3638b78c6d81955565b638b78c6d88260601b176000526020600020805482811681189050808255808460601b60601c7f715ad5ce61fc9595c7b415289d59cf203f23a94fa06f04af7e489a0a76e1fe26600080a350505050565b638b78c6d88260601b17600052602060002081815417808255808460601b60601c7f715ad5ce61fc9595c7b415289d59cf203f23a94fa06f04af7e489a0a76e1fe26600080a350505050565b60606105bf82600080610fa0565b6060610f5f8261109f565b604051602001610f6f9190611c51565b6040516020818303038152906040529050919050565b6060610f908261109f565b604051602001610f6f9190611c7e565b606083518015611097576003600282010460021b60405192507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526102308515027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f03603f52602083018181015b6003880197508751603f8160121c16518353603f81600c1c16516001840153603f8160061c16516002840153603f811651600384015350600482019150808210611010576003840686801561107057600182148215150185038752611088565b603d821515850353603d6001831460011b8503538487525b5050601f01601f191660405250505b509392505050565b606060006110ac83611132565b600101905060008167ffffffffffffffff8111156110cc576110cc61120a565b6040519080825280601f01601f1916602001820160405280156110f6576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461110057509392505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106111715772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061119d576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106111bb57662386f26fc10000830492506010015b6305f5e10083106111d3576305f5e100830492506008015b61271083106111e757612710830492506004015b606483106111f9576064830492506002015b600a83106105bf5760010192915050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156112435761124361120a565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156112725761127261120a565b604052919050565b6000602080838503121561128d57600080fd5b823567ffffffffffffffff808211156112a557600080fd5b818501915085601f8301126112b957600080fd5b8135818111156112cb576112cb61120a565b8060051b91506112dc848301611249565b81815291830184019184810190888411156112f657600080fd5b938501935b83851015611327578435925060ff831683146113175760008081fd5b82825293850193908501906112fb565b98975050505050505050565b60006020828403121561134557600080fd5b5035919050565b80356001600160a01b038116811461136357600080fd5b919050565b6000806040838503121561137b57600080fd5b6113848361134c565b946020939093013593505050565b6000602082840312156113a457600080fd5b6113ad8261134c565b9392505050565b600067ffffffffffffffff8211156113ce576113ce61120a565b50601f01601f191660200190565b600082601f8301126113ed57600080fd5b81356114006113fb826113b4565b611249565b81815284602083860101111561141557600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561144457600080fd5b813567ffffffffffffffff81111561145b57600080fd5b611467848285016113dc565b949350505050565b60005b8381101561148a578181015183820152602001611472565b83811115611499576000848401525b50505050565b600081518084526114b781602086016020860161146f565b601f01601f19169290920160200192915050565b6020815260006113ad602083018461149f565b6000602082840312156114f057600080fd5b813567ffffffffffffffff8082111561150857600080fd5b9083019060c0828603121561151c57600080fd5b611524611220565b82358281111561153357600080fd5b61153f878286016113dc565b82525060208301358281111561155457600080fd5b611560878286016113dc565b60208301525060408301358281111561157857600080fd5b611584878286016113dc565b60408301525060608301358281111561159c57600080fd5b6115a8878286016113dc565b6060830152506080830135828111156115c057600080fd5b6115cc878286016113dc565b60808301525060a0830135828111156115e457600080fd5b6115f0878286016113dc565b60a08301525095945050505050565b6020808252825182820181905260009190848201906040850190845b8181101561163a57835160ff168352928401929184019160010161161b565b50909695505050505050565b602081526000825160c0602084015261166260e084018261149f565b90506020840151601f1980858403016040860152611680838361149f565b9250604086015191508085840301606086015261169d838361149f565b925060608601519150808584030160808601526116ba838361149f565b925060808601519150808584030160a08601526116d7838361149f565b925060a08601519150808584030160c0860152506116f5828261149f565b95945050505050565b60008060006060848603121561171357600080fd5b83359250602084013567ffffffffffffffff8082111561173257600080fd5b61173e878388016113dc565b9350604086013591508082111561175457600080fd5b50611761868287016113dc565b9150509250925092565b60006020828403121561177d57600080fd5b815167ffffffffffffffff81111561179457600080fd5b8201601f810184136117a557600080fd5b80516117b36113fb826113b4565b8181528560208385010111156117c857600080fd5b6116f582602083016020860161146f565b600181811c908216806117ed57607f821691505b60208210810361180d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561185d57600081815260208120601f850160051c8101602086101561183a5750805b601f850160051c820191505b8181101561185957828155600101611846565b5050505b505050565b815167ffffffffffffffff81111561187c5761187c61120a565b6118908161188a84546117d9565b84611813565b602080601f8311600181146118c557600084156118ad5750858301515b600019600386901b1c1916600185901b178555611859565b600085815260208120601f198616915b828110156118f4578886015182559484019460019091019084016118d5565b50858210156119125787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000815461192f816117d9565b60018281168015611947576001811461195c5761198b565b60ff198416875282151583028701945061198b565b8560005260208060002060005b858110156119825781548a820152908401908201611969565b50505082870194505b5050505092915050565b673d913730b6b2911d60c11b8152601160f91b600882015260006119bc6009830189611922565b61088b60f21b815260026119e28183016d113232b9b1b934b83a34b7b7111d60911b9052565b601160f91b60108301526119f9601183018a611922565b61088b60f21b81529150671134b6b0b3b2911d60c11b82820152601160f91b600a830152611a2a600b830189611922565b61088b60f21b815291506e1132bc3a32b93730b62634b735911d60891b82820152601160f91b6011830152611a626012830188611922565b61088b60f21b815291507f2273656c6c65724665654261736973506f696e7473223a00000000000000000082820152601160f91b6019830152611aa8601a830187611922565b61088b60f21b815291506e113332b2a932b1b4b834b2b73a111d60891b82820152601160f91b6011830152611ae06012830186611922565b601160f91b8152607d60f81b6001820152019998505050505050505050565b60008151611b1181856020860161146f565b9290920192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251611b5381601d85016020870161146f565b91909101601d0192915050565b673d913730b6b2911d60c11b8152601160f91b60088201528451600090611b8e816009850160208a0161146f565b61088b60f21b6009918401918201526d113232b9b1b934b83a34b7b7111d60911b600b820152611bc460198201601160f91b9052565b611bd1601a820187611aff565b61088b60f21b81529050671134b6b0b3b2911d60c11b6002820152601160f91b600a820152611c03600b820186611aff565b61088b60f21b815290506e2261747472696275746573223a205b60881b6002820152611c326011820185611aff565b605d60f81b8152607d60f81b6001820152600201979650505050505050565b644e4654202360d81b815260008251611c7181600585016020870161146f565b9190910160050192915050565b6b4e4654204d656d626572202360a01b815260008251611ca581600c85016020870161146f565b91909101600c019291505056fea2646970667358221220ec76de9b5dcc4faa18cbaab2d7f0cf4c0e350702b56482f4af0506aded925ad964736f6c634300080f0033",
  "deployedBytecode": "0x6080604052600436106101665760003560e01c806357e30f44116100d1578063ae70ed131161008a578063f04e283e11610064578063f04e283e14610418578063f06796161461042b578063f2fde38b1461044b578063fee81cf41461045e57600080fd5b8063ae70ed13146103b8578063d12bcb12146103d8578063d7533f02146103fa57600080fd5b806357e30f4414610317578063715018a614610337578063725fa09c1461033f5780637359e41f146103545780638da5cb5b14610381578063a4cd86961461039a57600080fd5b80632de94807116101235780632de9480714610247578063316df61e146102785780633ee6fa92146102a55780634a4ee7b1146102c5578063514e62fc146102d857806354d1f13d1461030f57600080fd5b806313a661ed1461016b578063183a4f6e1461019e5780631c10893f146101b35780631cd64df4146101c6578063256929621461020d57806325c28b4a14610215575b600080fd5b34801561017757600080fd5b5061018b61018636600461127a565b61048f565b6040519081526020015b60405180910390f35b6101b16101ac366004611333565b6104c2565b005b6101b16101c1366004611368565b6104cf565b3480156101d257600080fd5b506101fd6101e1366004611368565b60609190911b638b78c6d8176000908152602090205481161490565b6040519015158152602001610195565b6101b16104f8565b34801561022157600080fd5b506001546001600160a01b03165b6040516001600160a01b039091168152602001610195565b34801561025357600080fd5b5061018b610262366004611392565b60601b638b78c6d8176000908152602090205490565b34801561028457600080fd5b50610298610293366004611432565b610549565b60405161019591906114cb565b3480156102b157600080fd5b506101b16102c0366004611392565b6105c5565b6101b16102d3366004611368565b610635565b3480156102e457600080fd5b506101fd6102f3366004611368565b60609190911b638b78c6d8176000908152602090205416151590565b6101b161065a565b34801561032357600080fd5b506101b16103323660046114de565b610697565b6101b1610761565b34801561034b57600080fd5b506102986107af565b34801561036057600080fd5b5061037461036f366004611333565b61080f565b60405161019591906115ff565b34801561038d57600080fd5b50638b78c6d8195461022f565b3480156103a657600080fd5b506000546001600160a01b031661022f565b3480156103c457600080fd5b506101b16103d3366004611392565b610857565b3480156103e457600080fd5b506103ed6108c0565b6040516101959190611646565b34801561040657600080fd5b506040516202a3008152602001610195565b6101b1610426366004611392565b610c77565b34801561043757600080fd5b506102986104463660046116fe565b610cf9565b6101b1610459366004611392565b610e42565b34801561046a57600080fd5b5061018b610479366004611392565b60601b63389a75e1176000908152602090205490565b600060208201825160051b81015b8082146104bb57600160ff8351161b8317925060208201915061049d565b5050919050565b6104cc3382610ea9565b50565b638b78c6d8195433146104ea576382b429006000526004601cfd5b6104f48282610efa565b5050565b60006202a30067ffffffffffffffff164201905063389a75e13360601b1760005280602060002055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d600080a250565b6000546040516318b6fb0f60e11b81526060916001600160a01b03169063316df61e9061057a9085906004016114cb565b600060405180830381865afa158015610597573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105bf919081019061176b565b92915050565b638b78c6d8195433146105e0576382b429006000526004601cfd5b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f10c0817f42b2182992d55b707430b153f12e59d7e54a975bfec790497dd7f63f906020015b60405180910390a150565b638b78c6d819543314610650576382b429006000526004601cfd5b6104f48282610ea9565b63389a75e13360601b176000526000602060002055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92600080a2565b638b78c6d8195433146106b2576382b429006000526004601cfd5b8051819060029081906106c59082611862565b50602082015160018201906106da9082611862565b50604082015160028201906106ef9082611862565b50606082015160038201906107049082611862565b50608082015160048201906107199082611862565b5060a0820151600582019061072e9082611862565b509050507f03a10335d532669eac03b3b7e4ce44aff7f8cb14b7aa397c653fdcb40ae06bec8160405161062a9190611646565b638b78c6d81954331461077c576382b429006000526004601cfd5b6000337f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a36000638b78c6d81955565b6040516060906107eb906107d790600290600390600490600590600690600790602001611995565b604051602081830303815290604052610f46565b6040516020016107fb9190611b1b565b604051602081830303815290604052905090565b606060206040510160005b8082526001841660051b820191508360011c9350831561083c5760010161081a565b5060405191508060405260208201810360051c825250919050565b638b78c6d819543314610872576382b429006000526004601cfd5b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527f3c2715cb5e4b39dd4af38ac12bb292a030fb6a063dbd5467ed49da665bcaa9739060200161062a565b6108f96040518060c001604052806060815260200160608152602001606081526020016060815260200160608152602001606081525090565b60026040518060c0016040529081600082018054610916906117d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610942906117d9565b801561098f5780601f106109645761010080835404028352916020019161098f565b820191906000526020600020905b81548152906001019060200180831161097257829003601f168201915b505050505081526020016001820180546109a8906117d9565b80601f01602080910402602001604051908101604052809291908181526020018280546109d4906117d9565b8015610a215780601f106109f657610100808354040283529160200191610a21565b820191906000526020600020905b815481529060010190602001808311610a0457829003601f168201915b50505050508152602001600282018054610a3a906117d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610a66906117d9565b8015610ab35780601f10610a8857610100808354040283529160200191610ab3565b820191906000526020600020905b815481529060010190602001808311610a9657829003601f168201915b50505050508152602001600382018054610acc906117d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610af8906117d9565b8015610b455780601f10610b1a57610100808354040283529160200191610b45565b820191906000526020600020905b815481529060010190602001808311610b2857829003601f168201915b50505050508152602001600482018054610b5e906117d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8a906117d9565b8015610bd75780601f10610bac57610100808354040283529160200191610bd7565b820191906000526020600020905b815481529060010190602001808311610bba57829003601f168201915b50505050508152602001600582018054610bf0906117d9565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1c906117d9565b8015610c695780601f10610c3e57610100808354040283529160200191610c69565b820191906000526020600020905b815481529060010190602001808311610c4c57829003601f168201915b505050505081525050905090565b638b78c6d819543314610c92576382b429006000526004601cfd5b8060601b60601c905063389a75e18160601b1760005260206000208054421115610cc457636f5e88186000526004601cfd5b600081555080337f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3638b78c6d81955565b600080546040516318b6fb0f60e11b8152606092916001600160a01b03169063316df61e90610d2c9087906004016114cb565b600060405180830381865afa158015610d49573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610d71919081019061176b565b60015460405163f6559a6b60e01b81529192506000916001600160a01b039091169063f6559a6b90610da79087906004016114cb565b600060405180830381865afa158015610dc4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610dec919081019061176b565b9050610e18610dfa87610f54565b610e0388610f85565b84846040516020016107d79493929190611b60565b604051602001610e289190611b1b565b604051602081830303815290604052925050509392505050565b638b78c6d819543314610e5d576382b429006000526004601cfd5b6001600160a01b031680610e7957637448fbae6000526004601cfd5b80337f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3638b78c6d81955565b638b78c6d88260601b176000526020600020805482811681189050808255808460601b60601c7f715ad5ce61fc9595c7b415289d59cf203f23a94fa06f04af7e489a0a76e1fe26600080a350505050565b638b78c6d88260601b17600052602060002081815417808255808460601b60601c7f715ad5ce61fc9595c7b415289d59cf203f23a94fa06f04af7e489a0a76e1fe26600080a350505050565b60606105bf82600080610fa0565b6060610f5f8261109f565b604051602001610f6f9190611c51565b6040516020818303038152906040529050919050565b6060610f908261109f565b604051602001610f6f9190611c7e565b606083518015611097576003600282010460021b60405192507f4142434445464748494a4b4c4d4e4f505152535455565758595a616263646566601f526102308515027f6768696a6b6c6d6e6f707172737475767778797a303132333435363738392d5f03603f52602083018181015b6003880197508751603f8160121c16518353603f81600c1c16516001840153603f8160061c16516002840153603f811651600384015350600482019150808210611010576003840686801561107057600182148215150185038752611088565b603d821515850353603d6001831460011b8503538487525b5050601f01601f191660405250505b509392505050565b606060006110ac83611132565b600101905060008167ffffffffffffffff8111156110cc576110cc61120a565b6040519080825280601f01601f1916602001820160405280156110f6576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461110057509392505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106111715772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061119d576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106111bb57662386f26fc10000830492506010015b6305f5e10083106111d3576305f5e100830492506008015b61271083106111e757612710830492506004015b606483106111f9576064830492506002015b600a83106105bf5760010192915050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156112435761124361120a565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156112725761127261120a565b604052919050565b6000602080838503121561128d57600080fd5b823567ffffffffffffffff808211156112a557600080fd5b818501915085601f8301126112b957600080fd5b8135818111156112cb576112cb61120a565b8060051b91506112dc848301611249565b81815291830184019184810190888411156112f657600080fd5b938501935b83851015611327578435925060ff831683146113175760008081fd5b82825293850193908501906112fb565b98975050505050505050565b60006020828403121561134557600080fd5b5035919050565b80356001600160a01b038116811461136357600080fd5b919050565b6000806040838503121561137b57600080fd5b6113848361134c565b946020939093013593505050565b6000602082840312156113a457600080fd5b6113ad8261134c565b9392505050565b600067ffffffffffffffff8211156113ce576113ce61120a565b50601f01601f191660200190565b600082601f8301126113ed57600080fd5b81356114006113fb826113b4565b611249565b81815284602083860101111561141557600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561144457600080fd5b813567ffffffffffffffff81111561145b57600080fd5b611467848285016113dc565b949350505050565b60005b8381101561148a578181015183820152602001611472565b83811115611499576000848401525b50505050565b600081518084526114b781602086016020860161146f565b601f01601f19169290920160200192915050565b6020815260006113ad602083018461149f565b6000602082840312156114f057600080fd5b813567ffffffffffffffff8082111561150857600080fd5b9083019060c0828603121561151c57600080fd5b611524611220565b82358281111561153357600080fd5b61153f878286016113dc565b82525060208301358281111561155457600080fd5b611560878286016113dc565b60208301525060408301358281111561157857600080fd5b611584878286016113dc565b60408301525060608301358281111561159c57600080fd5b6115a8878286016113dc565b6060830152506080830135828111156115c057600080fd5b6115cc878286016113dc565b60808301525060a0830135828111156115e457600080fd5b6115f0878286016113dc565b60a08301525095945050505050565b6020808252825182820181905260009190848201906040850190845b8181101561163a57835160ff168352928401929184019160010161161b565b50909695505050505050565b602081526000825160c0602084015261166260e084018261149f565b90506020840151601f1980858403016040860152611680838361149f565b9250604086015191508085840301606086015261169d838361149f565b925060608601519150808584030160808601526116ba838361149f565b925060808601519150808584030160a08601526116d7838361149f565b925060a08601519150808584030160c0860152506116f5828261149f565b95945050505050565b60008060006060848603121561171357600080fd5b83359250602084013567ffffffffffffffff8082111561173257600080fd5b61173e878388016113dc565b9350604086013591508082111561175457600080fd5b50611761868287016113dc565b9150509250925092565b60006020828403121561177d57600080fd5b815167ffffffffffffffff81111561179457600080fd5b8201601f810184136117a557600080fd5b80516117b36113fb826113b4565b8181528560208385010111156117c857600080fd5b6116f582602083016020860161146f565b600181811c908216806117ed57607f821691505b60208210810361180d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561185d57600081815260208120601f850160051c8101602086101561183a5750805b601f850160051c820191505b8181101561185957828155600101611846565b5050505b505050565b815167ffffffffffffffff81111561187c5761187c61120a565b6118908161188a84546117d9565b84611813565b602080601f8311600181146118c557600084156118ad5750858301515b600019600386901b1c1916600185901b178555611859565b600085815260208120601f198616915b828110156118f4578886015182559484019460019091019084016118d5565b50858210156119125787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000815461192f816117d9565b60018281168015611947576001811461195c5761198b565b60ff198416875282151583028701945061198b565b8560005260208060002060005b858110156119825781548a820152908401908201611969565b50505082870194505b5050505092915050565b673d913730b6b2911d60c11b8152601160f91b600882015260006119bc6009830189611922565b61088b60f21b815260026119e28183016d113232b9b1b934b83a34b7b7111d60911b9052565b601160f91b60108301526119f9601183018a611922565b61088b60f21b81529150671134b6b0b3b2911d60c11b82820152601160f91b600a830152611a2a600b830189611922565b61088b60f21b815291506e1132bc3a32b93730b62634b735911d60891b82820152601160f91b6011830152611a626012830188611922565b61088b60f21b815291507f2273656c6c65724665654261736973506f696e7473223a00000000000000000082820152601160f91b6019830152611aa8601a830187611922565b61088b60f21b815291506e113332b2a932b1b4b834b2b73a111d60891b82820152601160f91b6011830152611ae06012830186611922565b601160f91b8152607d60f81b6001820152019998505050505050505050565b60008151611b1181856020860161146f565b9290920192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251611b5381601d85016020870161146f565b91909101601d0192915050565b673d913730b6b2911d60c11b8152601160f91b60088201528451600090611b8e816009850160208a0161146f565b61088b60f21b6009918401918201526d113232b9b1b934b83a34b7b7111d60911b600b820152611bc460198201601160f91b9052565b611bd1601a820187611aff565b61088b60f21b81529050671134b6b0b3b2911d60c11b6002820152601160f91b600a820152611c03600b820186611aff565b61088b60f21b815290506e2261747472696275746573223a205b60881b6002820152611c326011820185611aff565b605d60f81b8152607d60f81b6001820152600201979650505050505050565b644e4654202360d81b815260008251611c7181600585016020870161146f565b9190910160050192915050565b6b4e4654204d656d626572202360a01b815260008251611ca581600c85016020870161146f565b91909101600c019291505056fea2646970667358221220ec76de9b5dcc4faa18cbaab2d7f0cf4c0e350702b56482f4af0506aded925ad964736f6c634300080f0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
