{
    "contractName": "TestGatewayForwarder",
    "abi": [
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": true,
                    "internalType": "bytes32",
                    "name": "domainSeparator",
                    "type": "bytes32"
                },
                {
                    "indexed": false,
                    "internalType": "bytes",
                    "name": "domainValue",
                    "type": "bytes"
                }
            ],
            "name": "DomainRegistered",
            "type": "event"
        },
        {
            "anonymous": false,
            "inputs": [
                {
                    "indexed": true,
                    "internalType": "bytes32",
                    "name": "typeHash",
                    "type": "bytes32"
                },
                {
                    "indexed": false,
                    "internalType": "string",
                    "name": "typeStr",
                    "type": "string"
                }
            ],
            "name": "RequestTypeRegistered",
            "type": "event"
        },
        {
            "inputs": [],
            "name": "EIP712_DOMAIN_TYPE",
            "outputs": [
                {
                    "internalType": "string",
                    "name": "",
                    "type": "string"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [],
            "name": "GENERIC_PARAMS",
            "outputs": [
                {
                    "internalType": "string",
                    "name": "",
                    "type": "string"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "components": [
                        {
                            "internalType": "address",
                            "name": "from",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "to",
                            "type": "address"
                        },
                        {
                            "internalType": "uint256",
                            "name": "value",
                            "type": "uint256"
                        },
                        {
                            "internalType": "uint256",
                            "name": "gas",
                            "type": "uint256"
                        },
                        {
                            "internalType": "uint256",
                            "name": "nonce",
                            "type": "uint256"
                        },
                        {
                            "internalType": "bytes",
                            "name": "data",
                            "type": "bytes"
                        },
                        {
                            "internalType": "uint256",
                            "name": "validUntilTime",
                            "type": "uint256"
                        }
                    ],
                    "internalType": "struct IForwarder.ForwardRequest",
                    "name": "req",
                    "type": "tuple"
                },
                {
                    "internalType": "bytes32",
                    "name": "requestTypeHash",
                    "type": "bytes32"
                },
                {
                    "internalType": "bytes",
                    "name": "suffixData",
                    "type": "bytes"
                }
            ],
            "name": "_getEncoded",
            "outputs": [
                {
                    "internalType": "bytes",
                    "name": "",
                    "type": "bytes"
                }
            ],
            "stateMutability": "pure",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "bytes32",
                    "name": "",
                    "type": "bytes32"
                }
            ],
            "name": "domains",
            "outputs": [
                {
                    "internalType": "bool",
                    "name": "",
                    "type": "bool"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "components": [
                        {
                            "internalType": "address",
                            "name": "from",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "to",
                            "type": "address"
                        },
                        {
                            "internalType": "uint256",
                            "name": "value",
                            "type": "uint256"
                        },
                        {
                            "internalType": "uint256",
                            "name": "gas",
                            "type": "uint256"
                        },
                        {
                            "internalType": "uint256",
                            "name": "nonce",
                            "type": "uint256"
                        },
                        {
                            "internalType": "bytes",
                            "name": "data",
                            "type": "bytes"
                        },
                        {
                            "internalType": "uint256",
                            "name": "validUntilTime",
                            "type": "uint256"
                        }
                    ],
                    "internalType": "struct IForwarder.ForwardRequest",
                    "name": "req",
                    "type": "tuple"
                },
                {
                    "internalType": "bytes32",
                    "name": "domainSeparator",
                    "type": "bytes32"
                },
                {
                    "internalType": "bytes32",
                    "name": "requestTypeHash",
                    "type": "bytes32"
                },
                {
                    "internalType": "bytes",
                    "name": "suffixData",
                    "type": "bytes"
                },
                {
                    "internalType": "bytes",
                    "name": "sig",
                    "type": "bytes"
                }
            ],
            "name": "execute",
            "outputs": [
                {
                    "internalType": "bool",
                    "name": "success",
                    "type": "bool"
                },
                {
                    "internalType": "bytes",
                    "name": "ret",
                    "type": "bytes"
                }
            ],
            "stateMutability": "payable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "from",
                    "type": "address"
                }
            ],
            "name": "getNonce",
            "outputs": [
                {
                    "internalType": "uint256",
                    "name": "",
                    "type": "uint256"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "string",
                    "name": "name",
                    "type": "string"
                },
                {
                    "internalType": "string",
                    "name": "version",
                    "type": "string"
                }
            ],
            "name": "registerDomainSeparator",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "string",
                    "name": "typeName",
                    "type": "string"
                },
                {
                    "internalType": "string",
                    "name": "typeSuffix",
                    "type": "string"
                }
            ],
            "name": "registerRequestType",
            "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": "trustedRelayHub",
            "outputs": [
                {
                    "internalType": "address",
                    "name": "",
                    "type": "address"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "internalType": "bytes32",
                    "name": "",
                    "type": "bytes32"
                }
            ],
            "name": "typeHashes",
            "outputs": [
                {
                    "internalType": "bool",
                    "name": "",
                    "type": "bool"
                }
            ],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "inputs": [
                {
                    "components": [
                        {
                            "internalType": "address",
                            "name": "from",
                            "type": "address"
                        },
                        {
                            "internalType": "address",
                            "name": "to",
                            "type": "address"
                        },
                        {
                            "internalType": "uint256",
                            "name": "value",
                            "type": "uint256"
                        },
                        {
                            "internalType": "uint256",
                            "name": "gas",
                            "type": "uint256"
                        },
                        {
                            "internalType": "uint256",
                            "name": "nonce",
                            "type": "uint256"
                        },
                        {
                            "internalType": "bytes",
                            "name": "data",
                            "type": "bytes"
                        },
                        {
                            "internalType": "uint256",
                            "name": "validUntilTime",
                            "type": "uint256"
                        }
                    ],
                    "internalType": "struct IForwarder.ForwardRequest",
                    "name": "req",
                    "type": "tuple"
                },
                {
                    "internalType": "bytes32",
                    "name": "domainSeparator",
                    "type": "bytes32"
                },
                {
                    "internalType": "bytes32",
                    "name": "requestTypeHash",
                    "type": "bytes32"
                },
                {
                    "internalType": "bytes",
                    "name": "suffixData",
                    "type": "bytes"
                },
                {
                    "internalType": "bytes",
                    "name": "sig",
                    "type": "bytes"
                }
            ],
            "name": "verify",
            "outputs": [],
            "stateMutability": "view",
            "type": "function"
        },
        {
            "stateMutability": "payable",
            "type": "receive"
        },
        {
            "inputs": [
                {
                    "internalType": "address",
                    "name": "_trustedRelayHub",
                    "type": "address"
                }
            ],
            "name": "setTrustedRelayHub",
            "outputs": [],
            "stateMutability": "nonpayable",
            "type": "function"
        }
    ],
    "metadata": "{\"compiler\":{\"version\":\"0.8.7+commit.e28d00a7\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"domainSeparator\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"domainValue\",\"type\":\"bytes\"}],\"name\":\"DomainRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"typeHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"typeStr\",\"type\":\"string\"}],\"name\":\"RequestTypeRegistered\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"EIP712_DOMAIN_TYPE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"GENERIC_PARAMS\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validUntilTime\",\"type\":\"uint256\"}],\"internalType\":\"struct IForwarder.ForwardRequest\",\"name\":\"req\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"requestTypeHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"suffixData\",\"type\":\"bytes\"}],\"name\":\"_getEncoded\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"domains\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validUntilTime\",\"type\":\"uint256\"}],\"internalType\":\"struct IForwarder.ForwardRequest\",\"name\":\"req\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"domainSeparator\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"requestTypeHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"suffixData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sig\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"ret\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"}],\"name\":\"getNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"}],\"name\":\"registerDomainSeparator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"typeName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"typeSuffix\",\"type\":\"string\"}],\"name\":\"registerRequestType\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_trustedRelayHub\",\"type\":\"address\"}],\"name\":\"setTrustedRelayHub\",\"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\":\"trustedRelayHub\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"typeHashes\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"validUntilTime\",\"type\":\"uint256\"}],\"internalType\":\"struct IForwarder.ForwardRequest\",\"name\":\"req\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"domainSeparator\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"requestTypeHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"suffixData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sig\",\"type\":\"bytes\"}],\"name\":\"verify\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"execute((address,address,uint256,uint256,uint256,bytes,uint256),bytes32,bytes32,bytes,bytes)\":{\"params\":{\"domainSeparator\":\"The domain used when signing this request.\",\"forwardRequest\":\"All requested transaction parameters.\",\"requestTypeHash\":\"The request type used when signing this request.\",\"signature\":\"The client signature to be validated.\",\"suffixData\":\"The ABI-encoded extension data for the current `RequestType` used when signing this request.\"},\"returns\":{\"ret\":\"The byte array returned by the underlying `CALL` to the target address.\",\"success\":\"The success flag of the underlying `CALL` to the target address.\"}},\"getNonce(address)\":{\"params\":{\"from\":\"The address of a sender.\"},\"returns\":{\"_0\":\"The nonce for this address.\"}},\"registerDomainSeparator(string,string)\":{\"params\":{\"name\":\"The domain's display name.\",\"version\":\"The domain/protocol version.\"}},\"registerRequestType(string,string)\":{\"params\":{\"typeName\":\"The name of the request type.\",\"typeSuffix\":\"Any extra data after the generic params. Must contain add at least one param. The generic ForwardRequest type is always registered by the constructor.\"}},\"supportsInterface(bytes4)\":{\"details\":\"Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"_getEncoded((address,address,uint256,uint256,uint256,bytes,uint256),bytes32,bytes)\":{\"notice\":\"Creates a byte array that is a valid ABI encoding of a request of a `RequestType` type. See `execute()`.\"},\"execute((address,address,uint256,uint256,uint256,bytes,uint256),bytes32,bytes32,bytes,bytes)\":{\"notice\":\"Executes a transaction specified by the `ForwardRequest`. The transaction is first verified and then executed. The success flag and returned bytes array of the `CALL` are returned as-is. This method would revert only in case of a verification error. All the target errors are reported using the returned success flag and returned bytes array.\"},\"registerDomainSeparator(string,string)\":{\"notice\":\"Register a new domain separator.This is necessary for the Forwarder to be able to verify the signatures conforming to the ERC-712.The domain separator must have the following fields: `name`, `version`, `chainId`, `verifyingContract`. The `chainId` is the current network's `chainId`, and the `verifyingContract` is this Forwarder's address. This method accepts the domain name and version to create and register the domain separator value.\"},\"registerRequestType(string,string)\":{\"notice\":\"Register a new Request typehash.This is necessary for the Forwarder to be able to verify the signatures conforming to the ERC-712.\"},\"verify((address,address,uint256,uint256,uint256,bytes,uint256),bytes32,bytes32,bytes,bytes)\":{\"notice\":\"Verify the transaction is valid and can be executed. Implementations must validate the signature and the nonce of the request are correct. Does not revert and returns successfully if the input is valid. Reverts if any validation has failed. For instance, if either signature or nonce are incorrect. Reverts if `domainSeparator` or `requestTypeHash` are not registered as well.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/alexf/gsn2/packages/contracts/solpp/test/TestGatewayForwarder.sol\":\"TestGatewayForwarder\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/alexf/gsn2/packages/contracts/solpp/forwarder/Forwarder.sol\":{\"keccak256\":\"0x8b6f1891e4b2001eeb2f34c2a210312c5601e0605ebd2b1c23a68f71dcaeeb7a\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://ccbcb2342bde6e79f34b66dc1719af54ee9685b849da536bcc0b846fe03f3f0c\",\"dweb:/ipfs/QmNqkFNMAx6sFRPpzvWv5e7gohZLBsxFqMTqHgLEEaJCKg\"]},\"/Users/alexf/gsn2/packages/contracts/solpp/forwarder/IForwarder.sol\":{\"keccak256\":\"0xef3d770001c3245db4408cdd0afdfc622695ccfe31f28b74571d05158bbf83f8\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://08949174ed05b596d89c8f1eeedfeb254993b84054bbc1ff6081ad926f5db406\",\"dweb:/ipfs/QmNQtKzHpie4Esocxuc9YrPtGQyA928a1a5TWbVc7cPoqk\"]},\"/Users/alexf/gsn2/packages/contracts/solpp/test/TestGatewayForwarder.sol\":{\"keccak256\":\"0x3227019b353845ed676e79998ff631446d628ebf5ad5641eb92d0009fcf93232\",\"license\":\"GPL-3.0-only\",\"urls\":[\"bzz-raw://eedbb55a90c3044086c75c96f31bc55e4df0df4faa427ed27ca43df9bbb72812\",\"dweb:/ipfs/QmdUBN8tGATfLetMzWgZtxWbo4dZZh4ReLin5XsDutgSX9\"]},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0xd04b0f06e0666f29cf7cccc82894de541e19bb30a765b107b1e40bb7fe5f7d7a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7b652499d098e88d8d878374616bb58434301061cae2253298b3f374044e0ddb\",\"dweb:/ipfs/QmbhAzctqo5jrSKU6idHdVyqfmzCcDbNUPvmx4GiXxfA6q\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6f2cf1c531122bc7ca96b8c8db6a60deae60441e5223065e792553d4849b5638\",\"dweb:/ipfs/QmPBdJmBBABMDCfyDjCbdxgiqRavgiSL88SYPGibgbPas9\"]},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0xdb7f5c28fc61cda0bd8ab60ce288e206b791643bcd3ba464a70cbec18895a2f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bf52bdf22a33263f5ca6227a35faeac3b81e7d2c692fbcc6a079d488710c5900\",\"dweb:/ipfs/QmcmsjkP4yq3UhiJbvyzwufaY2EKh1zhHaRK8ATag2cpD2\"]},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fb0048dee081f6fffa5f74afc3fb328483c2a30504e94a0ddd2a5114d731ec4d\",\"dweb:/ipfs/QmZptt1nmYoA5SgjwnSgWqgUSDgm4q52Yos3xhnMv3MV43\"]},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]},\"hardhat/console.sol\":{\"keccak256\":\"0x72b6a1d297cd3b033d7c2e4a7e7864934bb767db6453623f1c3082c6534547f4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a8cb8681076e765c214e0d51cac989325f6b98e315eaae06ee0cbd5a9f084763\",\"dweb:/ipfs/QmNWGHi4zmjxQTYN3NMGnJd49jBT5dE4bxTdWEaDuJrC6N\"]}},\"version\":1}",
    "bytecode": "0x60806040523480156200001157600080fd5b5060006040518060a0016040528060618152602001620016eb60619139604051602001620000409190620000c8565b60408051601f1981840301815291905290506200005d8162000064565b5062000174565b8051602080830191909120600081815291829052604091829020805460ff19166001179055905181907f64d6bce64323458c44643c51fe45113efc882082f7b7fd5f09f0d69d2eedb20290620000bc9085906200010c565b60405180910390a25050565b6e08cdee4eec2e4c8a4cae2eacae6e85608b1b815260008251620000f481600f85016020870162000141565b602960f81b600f939091019283015250601001919050565b60208152600082518060208401526200012d81604085016020870162000141565b601f01601f19169190910160400192915050565b60005b838110156200015e57818101518382015260200162000144565b838111156200016e576000848401525b50505050565b61156780620001846000396000f3fe6080604052600436106100c65760003560e01c8063ad9f99c71161007f578063cfbd30ed11610059578063cfbd30ed1461025c578063d9210be514610299578063e024dc7f146102b9578063e2b62f2d146102da57600080fd5b8063ad9f99c7146101f7578063c3f28abd14610217578063c722f1771461022c57600080fd5b806301ffc9a7146100d2578063066a310c1461010757806321fe98df146101295780632d0335ab1461015957806344e013401461019d5780639c7b4592146101d557600080fd5b366100cd57005b600080fd5b3480156100de57600080fd5b506100f26100ed366004611040565b6102fa565b60405190151581526020015b60405180910390f35b34801561011357600080fd5b5061011c610331565b6040516100fe919061131a565b34801561013557600080fd5b506100f2610144366004611027565b60006020819052908152604090205460ff1681565b34801561016557600080fd5b5061018f610174366004610ff7565b6001600160a01b031660009081526002602052604090205490565b6040519081526020016100fe565b3480156101a957600080fd5b506003546101bd906001600160a01b031681565b6040516001600160a01b0390911681526020016100fe565b3480156101e157600080fd5b506101f56101f036600461106a565b61034d565b005b34801561020357600080fd5b506101f56102123660046110d6565b610444565b34801561022357600080fd5b5061011c610465565b34801561023857600080fd5b506100f2610247366004611027565b60016020526000908152604090205460ff1681565b34801561026857600080fd5b506101f5610277366004610ff7565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b3480156102a557600080fd5b506101f56102b436600461106a565b610481565b6102cc6102c73660046110d6565b610584565b6040516100fe9291906112f7565b3480156102e657600080fd5b5061011c6102f536600461117e565b6107e2565b60006001600160e01b031982166309788f9960e21b148061032b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6040518060a001604052806061815260200161147f6061913981565b600046905060006040518060800160405280605281526020016114e060529139805190602001208686604051610384929190611253565b6040518091039020858560405161039c929190611253565b6040805191829003822060208301949094528101919091526060810191909152608081018390523060a082015260c00160408051601f198184030181528282528051602080830191909120600081815260019283905293909320805460ff1916909117905592509081907f4bc68689cbe89a4a6333a3ab0a70093874da3e5bfb71e93102027f3f073687d89061043390859061131a565b60405180910390a250505050505050565b61044d8761087c565b61045c878787878787876108f9565b50505050505050565b6040518060800160405280605281526020016114e06052913981565b60005b8381101561052f5760008585838181106104a0576104a0611468565b909101356001600160f81b031916915050600560fb1b81148015906104d35750602960f81b6001600160f81b0319821614155b61051c5760405162461bcd60e51b81526020600482015260156024820152744657443a20696e76616c696420747970656e616d6560581b60448201526064015b60405180910390fd5b508061052781611421565b915050610484565b50600084846040518060a001604052806061815260200161147f6061913985856040516020016105639594939291906112a5565b604051602081830303815290604052905061057d81610926565b5050505050565b60006060610597898989898989896108f9565b6105a089610988565b60c089013515806105b45750428960c00135115b6105f75760405162461bcd60e51b81526020600482015260146024820152731195d10e881c995c5d595cdd08195e1c1a5c995960621b6044820152606401610513565b600060408a0135156106085750619c405b600061061760a08c018c611351565b61062460208e018e610ff7565b60405160200161063693929190611263565b60408051601f1981840301815291905290506106568260608d0135611398565b60405a61066490603f6113d2565b61066e91906113b0565b10156106b45760405162461bcd60e51b81526020600482015260156024820152744657443a20696e73756666696369656e742067617360581b6044820152606401610513565b6106c460408c0160208d01610ff7565b6001600160a01b03168b606001358c60400135836040516106e59190611289565b600060405180830381858888f193505050503d8060008114610723576040519150601f19603f3d011682016040523d82523d6000602084013e610728565b606091505b506040805180820190915260208082527f6578656375746520726573756c743a20737563636573733a202573207265743a90820152919550935061076c9085610a0c565b61077583610a55565b60408b0135158015906107885750600047115b156107d45761079a60208c018c610ff7565b6001600160a01b03166108fc479081150290604051600060405180830381858888f193505050501580156107d2573d6000803e3d6000fd5b505b505097509795505050505050565b6060836107f26020870187610ff7565b6001600160a01b031661080b6040880160208901610ff7565b6001600160a01b03166040880135606089013560808a013561083060a08c018c611351565b60405161083e929190611253565b6040519081900381206108639796959493929160c08e0135908c908c90602001611201565b6040516020818303038152906040529050949350505050565b6080810135600260006108926020850185610ff7565b6001600160a01b03166001600160a01b0316815260200190815260200160002054146108f65760405162461bcd60e51b815260206004820152601360248201527208cae887440dcdedcc6ca40dad2e6dac2e8c6d606b1b6044820152606401610513565b50565b6003546001600160a01b03163314158061091257508015155b1561045c5761045c87878787878787610a98565b8051602080830191909120600081815291829052604091829020805460ff19166001179055905181907f64d6bce64323458c44643c51fe45113efc882082f7b7fd5f09f0d69d2eedb2029061097c90859061131a565b60405180910390a25050565b60808101356002600061099e6020850185610ff7565b6001600160a01b03168152602081019190915260400160009081208054916109c583611421565b91905055146108f65760405162461bcd60e51b815260206004820152601360248201527208cae887440dcdedcc6ca40dad2e6dac2e8c6d606b1b6044820152606401610513565b610a518282604051602401610a2292919061132d565b60408051601f198184030181529190526020810180516001600160e01b031663c3b5563560e01b179052610c6a565b5050565b6108f681604051602401610a69919061131a565b60408051601f198184030181529190526020810180516001600160e01b03166305f3bfab60e11b179052610c6a565b60008681526001602052604090205460ff16610af65760405162461bcd60e51b815260206004820152601d60248201527f4657443a20756e7265676973746572656420646f6d61696e207365702e0000006044820152606401610513565b60008581526020819052604090205460ff16610b545760405162461bcd60e51b815260206004820152601a60248201527f4657443a20756e726567697374657265642074797065686173680000000000006044820152606401610513565b600086610b63898888886107e2565b8051602091820120604051610b8f93920161190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815291905280516020909101209050321580610c145750610bbe6020890189610ff7565b6001600160a01b0316610c0984848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508693925050610c8b9050565b6001600160a01b0316145b610c605760405162461bcd60e51b815260206004820152601760248201527f4657443a207369676e6174757265206d69736d617463680000000000000000006044820152606401610513565b5050505050505050565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b6000806000610c9a8585610caf565b91509150610ca781610cf5565b509392505050565b600080825160411415610ce65760208301516040840151606085015160001a610cda87828585610eb0565b94509450505050610cee565b506000905060025b9250929050565b6000816004811115610d0957610d09611452565b1415610d125750565b6001816004811115610d2657610d26611452565b1415610d745760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610513565b6002816004811115610d8857610d88611452565b1415610dd65760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610513565b6003816004811115610dea57610dea611452565b1415610e435760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610513565b6004816004811115610e5757610e57611452565b14156108f65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610513565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610ee75750600090506003610f94565b8460ff16601b14158015610eff57508460ff16601c14155b15610f105750600090506004610f94565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610f64573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610f8d57600060019250925050610f94565b9150600090505b94509492505050565b60008083601f840112610faf57600080fd5b50813567ffffffffffffffff811115610fc757600080fd5b602083019150836020828501011115610cee57600080fd5b600060e08284031215610ff157600080fd5b50919050565b60006020828403121561100957600080fd5b81356001600160a01b038116811461102057600080fd5b9392505050565b60006020828403121561103957600080fd5b5035919050565b60006020828403121561105257600080fd5b81356001600160e01b03198116811461102057600080fd5b6000806000806040858703121561108057600080fd5b843567ffffffffffffffff8082111561109857600080fd5b6110a488838901610f9d565b909650945060208701359150808211156110bd57600080fd5b506110ca87828801610f9d565b95989497509550505050565b600080600080600080600060a0888a0312156110f157600080fd5b873567ffffffffffffffff8082111561110957600080fd5b6111158b838c01610fdf565b985060208a0135975060408a0135965060608a013591508082111561113957600080fd5b6111458b838c01610f9d565b909650945060808a013591508082111561115e57600080fd5b5061116b8a828b01610f9d565b989b979a50959850939692959293505050565b6000806000806060858703121561119457600080fd5b843567ffffffffffffffff808211156111ac57600080fd5b6111b888838901610fdf565b95506020870135945060408701359150808211156110bd57600080fd5b600081518084526111ed8160208601602086016113f1565b601f01601f19169290920160200192915050565b8a81528960208201528860408201528760608201528660808201528560a08201528460c08201528360e082015260006101008385828501376000929093019092019081529a9950505050505050505050565b8183823760009101908152919050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b6000825161129b8184602087016113f1565b9190910192915050565b84868237600085820160008152600560fb1b815285516112cc816001840160208a016113f1565b600b60fa1b600192909101918201528385600283013760009301600201928352509095945050505050565b821515815260406020820152600061131260408301846111d5565b949350505050565b60208152600061102060208301846111d5565b60408152600061134060408301856111d5565b905082151560208301529392505050565b6000808335601e1984360301811261136857600080fd5b83018035915067ffffffffffffffff82111561138357600080fd5b602001915036819003821315610cee57600080fd5b600082198211156113ab576113ab61143c565b500190565b6000826113cd57634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156113ec576113ec61143c565b500290565b60005b8381101561140c5781810151838201526020016113f4565b8381111561141b576000848401525b50505050565b60006000198214156114355761143561143c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fdfe616464726573732066726f6d2c6164647265737320746f2c75696e743235362076616c75652c75696e74323536206761732c75696e74323536206e6f6e63652c627974657320646174612c75696e743235362076616c6964556e74696c54696d65454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429a264697066735822122069b00f66dbb81d879c7ab1c78835192619c0502d84ba2a6dfacd84202e649d9064736f6c63430008070033616464726573732066726f6d2c6164647265737320746f2c75696e743235362076616c75652c75696e74323536206761732c75696e74323536206e6f6e63652c627974657320646174612c75696e743235362076616c6964556e74696c54696d65",
    "deployedBytecode": "0x6080604052600436106100c65760003560e01c8063ad9f99c71161007f578063cfbd30ed11610059578063cfbd30ed1461025c578063d9210be514610299578063e024dc7f146102b9578063e2b62f2d146102da57600080fd5b8063ad9f99c7146101f7578063c3f28abd14610217578063c722f1771461022c57600080fd5b806301ffc9a7146100d2578063066a310c1461010757806321fe98df146101295780632d0335ab1461015957806344e013401461019d5780639c7b4592146101d557600080fd5b366100cd57005b600080fd5b3480156100de57600080fd5b506100f26100ed366004611040565b6102fa565b60405190151581526020015b60405180910390f35b34801561011357600080fd5b5061011c610331565b6040516100fe919061131a565b34801561013557600080fd5b506100f2610144366004611027565b60006020819052908152604090205460ff1681565b34801561016557600080fd5b5061018f610174366004610ff7565b6001600160a01b031660009081526002602052604090205490565b6040519081526020016100fe565b3480156101a957600080fd5b506003546101bd906001600160a01b031681565b6040516001600160a01b0390911681526020016100fe565b3480156101e157600080fd5b506101f56101f036600461106a565b61034d565b005b34801561020357600080fd5b506101f56102123660046110d6565b610444565b34801561022357600080fd5b5061011c610465565b34801561023857600080fd5b506100f2610247366004611027565b60016020526000908152604090205460ff1681565b34801561026857600080fd5b506101f5610277366004610ff7565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b3480156102a557600080fd5b506101f56102b436600461106a565b610481565b6102cc6102c73660046110d6565b610584565b6040516100fe9291906112f7565b3480156102e657600080fd5b5061011c6102f536600461117e565b6107e2565b60006001600160e01b031982166309788f9960e21b148061032b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6040518060a001604052806061815260200161147f6061913981565b600046905060006040518060800160405280605281526020016114e060529139805190602001208686604051610384929190611253565b6040518091039020858560405161039c929190611253565b6040805191829003822060208301949094528101919091526060810191909152608081018390523060a082015260c00160408051601f198184030181528282528051602080830191909120600081815260019283905293909320805460ff1916909117905592509081907f4bc68689cbe89a4a6333a3ab0a70093874da3e5bfb71e93102027f3f073687d89061043390859061131a565b60405180910390a250505050505050565b61044d8761087c565b61045c878787878787876108f9565b50505050505050565b6040518060800160405280605281526020016114e06052913981565b60005b8381101561052f5760008585838181106104a0576104a0611468565b909101356001600160f81b031916915050600560fb1b81148015906104d35750602960f81b6001600160f81b0319821614155b61051c5760405162461bcd60e51b81526020600482015260156024820152744657443a20696e76616c696420747970656e616d6560581b60448201526064015b60405180910390fd5b508061052781611421565b915050610484565b50600084846040518060a001604052806061815260200161147f6061913985856040516020016105639594939291906112a5565b604051602081830303815290604052905061057d81610926565b5050505050565b60006060610597898989898989896108f9565b6105a089610988565b60c089013515806105b45750428960c00135115b6105f75760405162461bcd60e51b81526020600482015260146024820152731195d10e881c995c5d595cdd08195e1c1a5c995960621b6044820152606401610513565b600060408a0135156106085750619c405b600061061760a08c018c611351565b61062460208e018e610ff7565b60405160200161063693929190611263565b60408051601f1981840301815291905290506106568260608d0135611398565b60405a61066490603f6113d2565b61066e91906113b0565b10156106b45760405162461bcd60e51b81526020600482015260156024820152744657443a20696e73756666696369656e742067617360581b6044820152606401610513565b6106c460408c0160208d01610ff7565b6001600160a01b03168b606001358c60400135836040516106e59190611289565b600060405180830381858888f193505050503d8060008114610723576040519150601f19603f3d011682016040523d82523d6000602084013e610728565b606091505b506040805180820190915260208082527f6578656375746520726573756c743a20737563636573733a202573207265743a90820152919550935061076c9085610a0c565b61077583610a55565b60408b0135158015906107885750600047115b156107d45761079a60208c018c610ff7565b6001600160a01b03166108fc479081150290604051600060405180830381858888f193505050501580156107d2573d6000803e3d6000fd5b505b505097509795505050505050565b6060836107f26020870187610ff7565b6001600160a01b031661080b6040880160208901610ff7565b6001600160a01b03166040880135606089013560808a013561083060a08c018c611351565b60405161083e929190611253565b6040519081900381206108639796959493929160c08e0135908c908c90602001611201565b6040516020818303038152906040529050949350505050565b6080810135600260006108926020850185610ff7565b6001600160a01b03166001600160a01b0316815260200190815260200160002054146108f65760405162461bcd60e51b815260206004820152601360248201527208cae887440dcdedcc6ca40dad2e6dac2e8c6d606b1b6044820152606401610513565b50565b6003546001600160a01b03163314158061091257508015155b1561045c5761045c87878787878787610a98565b8051602080830191909120600081815291829052604091829020805460ff19166001179055905181907f64d6bce64323458c44643c51fe45113efc882082f7b7fd5f09f0d69d2eedb2029061097c90859061131a565b60405180910390a25050565b60808101356002600061099e6020850185610ff7565b6001600160a01b03168152602081019190915260400160009081208054916109c583611421565b91905055146108f65760405162461bcd60e51b815260206004820152601360248201527208cae887440dcdedcc6ca40dad2e6dac2e8c6d606b1b6044820152606401610513565b610a518282604051602401610a2292919061132d565b60408051601f198184030181529190526020810180516001600160e01b031663c3b5563560e01b179052610c6a565b5050565b6108f681604051602401610a69919061131a565b60408051601f198184030181529190526020810180516001600160e01b03166305f3bfab60e11b179052610c6a565b60008681526001602052604090205460ff16610af65760405162461bcd60e51b815260206004820152601d60248201527f4657443a20756e7265676973746572656420646f6d61696e207365702e0000006044820152606401610513565b60008581526020819052604090205460ff16610b545760405162461bcd60e51b815260206004820152601a60248201527f4657443a20756e726567697374657265642074797065686173680000000000006044820152606401610513565b600086610b63898888886107e2565b8051602091820120604051610b8f93920161190160f01b81526002810192909252602282015260420190565b60408051601f1981840301815291905280516020909101209050321580610c145750610bbe6020890189610ff7565b6001600160a01b0316610c0984848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508693925050610c8b9050565b6001600160a01b0316145b610c605760405162461bcd60e51b815260206004820152601760248201527f4657443a207369676e6174757265206d69736d617463680000000000000000006044820152606401610513565b5050505050505050565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b6000806000610c9a8585610caf565b91509150610ca781610cf5565b509392505050565b600080825160411415610ce65760208301516040840151606085015160001a610cda87828585610eb0565b94509450505050610cee565b506000905060025b9250929050565b6000816004811115610d0957610d09611452565b1415610d125750565b6001816004811115610d2657610d26611452565b1415610d745760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610513565b6002816004811115610d8857610d88611452565b1415610dd65760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610513565b6003816004811115610dea57610dea611452565b1415610e435760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610513565b6004816004811115610e5757610e57611452565b14156108f65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610513565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115610ee75750600090506003610f94565b8460ff16601b14158015610eff57508460ff16601c14155b15610f105750600090506004610f94565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015610f64573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610f8d57600060019250925050610f94565b9150600090505b94509492505050565b60008083601f840112610faf57600080fd5b50813567ffffffffffffffff811115610fc757600080fd5b602083019150836020828501011115610cee57600080fd5b600060e08284031215610ff157600080fd5b50919050565b60006020828403121561100957600080fd5b81356001600160a01b038116811461102057600080fd5b9392505050565b60006020828403121561103957600080fd5b5035919050565b60006020828403121561105257600080fd5b81356001600160e01b03198116811461102057600080fd5b6000806000806040858703121561108057600080fd5b843567ffffffffffffffff8082111561109857600080fd5b6110a488838901610f9d565b909650945060208701359150808211156110bd57600080fd5b506110ca87828801610f9d565b95989497509550505050565b600080600080600080600060a0888a0312156110f157600080fd5b873567ffffffffffffffff8082111561110957600080fd5b6111158b838c01610fdf565b985060208a0135975060408a0135965060608a013591508082111561113957600080fd5b6111458b838c01610f9d565b909650945060808a013591508082111561115e57600080fd5b5061116b8a828b01610f9d565b989b979a50959850939692959293505050565b6000806000806060858703121561119457600080fd5b843567ffffffffffffffff808211156111ac57600080fd5b6111b888838901610fdf565b95506020870135945060408701359150808211156110bd57600080fd5b600081518084526111ed8160208601602086016113f1565b601f01601f19169290920160200192915050565b8a81528960208201528860408201528760608201528660808201528560a08201528460c08201528360e082015260006101008385828501376000929093019092019081529a9950505050505050505050565b8183823760009101908152919050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b6000825161129b8184602087016113f1565b9190910192915050565b84868237600085820160008152600560fb1b815285516112cc816001840160208a016113f1565b600b60fa1b600192909101918201528385600283013760009301600201928352509095945050505050565b821515815260406020820152600061131260408301846111d5565b949350505050565b60208152600061102060208301846111d5565b60408152600061134060408301856111d5565b905082151560208301529392505050565b6000808335601e1984360301811261136857600080fd5b83018035915067ffffffffffffffff82111561138357600080fd5b602001915036819003821315610cee57600080fd5b600082198211156113ab576113ab61143c565b500190565b6000826113cd57634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156113ec576113ec61143c565b500290565b60005b8381101561140c5781810151838201526020016113f4565b8381111561141b576000848401525b50505050565b60006000198214156114355761143561143c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fdfe616464726573732066726f6d2c6164647265737320746f2c75696e743235362076616c75652c75696e74323536206761732c75696e74323536206e6f6e63652c627974657320646174612c75696e743235362076616c6964556e74696c54696d65454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429a264697066735822122069b00f66dbb81d879c7ab1c78835192619c0502d84ba2a6dfacd84202e649d9064736f6c63430008070033",
    "immutableReferences": {},
    "sourceMap": "125:806:22:-:0;;;;;;;;;;;;;1389:25:8;1460:14;;;;;;;;;;;;;;;;;1424:56;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1424:56:8;;;;;;;;;;-1:-1:-1;1491:40:8;1424:56;1491:27;:40::i;:::-;1379:159;125:806:22;;4951:256:8;5061:29;;;;;;;;;;5035:23;5100:27;;;;;;;;;;;;:34;;-1:-1:-1;;5100:34:8;5130:4;5100:34;;;5149:51;;5061:29;;5149:51;;;;5077:11;;5149:51;:::i;:::-;;;;;;;;5024:183;4951:256;:::o;14:589:63:-;-1:-1:-1;;;372:3:63;365:30;347:3;424:6;418:13;440:62;495:6;490:2;485:3;481:12;474:4;466:6;462:17;440:62;:::i;:::-;-1:-1:-1;;;561:2:63;521:16;;;;553:11;;;546:24;-1:-1:-1;594:2:63;586:11;;14:589;-1:-1:-1;14:589:63:o;608:383::-;757:2;746:9;739:21;720:4;789:6;783:13;832:6;827:2;816:9;812:18;805:34;848:66;907:6;902:2;891:9;887:18;882:2;874:6;870:15;848:66;:::i;:::-;975:2;954:15;-1:-1:-1;;950:29:63;935:45;;;;982:2;931:54;;608:383;-1:-1:-1;;608:383:63:o;996:258::-;1068:1;1078:113;1092:6;1089:1;1086:13;1078:113;;;1168:11;;;1162:18;1149:11;;;1142:39;1114:2;1107:10;1078:113;;;1209:6;1206:1;1203:13;1200:48;;;1244:1;1235:6;1230:3;1226:16;1219:27;1200:48;;996:258;;;:::o;:::-;125:806:22;;;;;;",
    "deployedSourceMap": "125:806:22:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1572:227:8;;;;;;;;;;-1:-1:-1;1572:227:8;;;;;:::i;:::-;;:::i;:::-;;;7583:14:63;;7576:22;7558:41;;7546:2;7531:18;1572:227:8;;;;;;;;648:139;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;929:42::-;;;;;;;;;;-1:-1:-1;929:42:8;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1244:115;;;;;;;;;;-1:-1:-1;1244:115:8;;;;;:::i;:::-;-1:-1:-1;;;;;1340:12:8;1314:7;1340:12;;;:6;:12;;;;;;;1244:115;;;;13688:25:63;;;13676:2;13661:18;1244:115:8;13542:177:63;174:30:22;;;;;;;;;;-1:-1:-1;174:30:22;;;;-1:-1:-1;;;;;174:30:22;;;;;;-1:-1:-1;;;;;7374:32:63;;;7356:51;;7344:2;7329:18;174:30:22;7210:203:63;4345:600:8;;;;;;;;;;-1:-1:-1;4345:600:8;;;;;:::i;:::-;;:::i;:::-;;1836:320;;;;;;;;;;-1:-1:-1;1836:320:8;;;;;:::i;:::-;;:::i;794:128::-;;;;;;;;;;;;;:::i;977:39::-;;;;;;;;;;-1:-1:-1;977:39:8;;;;;:::i;:::-;;;;;;;;;;;;;;;;211:114:22;;;;;;;;;;-1:-1:-1;211:114:22;;;;;:::i;:::-;284:15;:34;;-1:-1:-1;;;;;;284:34:22;-1:-1:-1;;;;;284:34:22;;;;;;;;;;211:114;3854:454:8;;;;;;;;;;-1:-1:-1;3854:454:8;;;;;:::i;:::-;;:::i;2193:1320::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;6088:729::-;;;;;;;;;;-1:-1:-1;6088:729:8;;;;;:::i;:::-;;:::i;1572:227::-;1674:4;-1:-1:-1;;;;;;1697:43:8;;-1:-1:-1;;;1697:43:8;;:95;;-1:-1:-1;;;;;;;;;;937:40:58;;;1756:36:8;1690:102;1572:227;-1:-1:-1;;1572:227:8:o;648:139::-;;;;;;;;;;;;;;;;;;;:::o;4345:600::-;4453:15;4559:9;4548:20;;4580:24;4647:18;;;;;;;;;;;;;;;;;4631:36;;;;;;4697:4;;4681:22;;;;;;;:::i;:::-;;;;;;;;4733:7;;4717:25;;;;;;;:::i;:::-;;;;;;;;;;4607:184;;;8172:25:63;;;;8213:18;;8206:34;;;;8256:18;;;8249:34;;;;8299:18;;;8292:34;;;4785:4:8;8342:19:63;;;8335:61;8144:19;;4607:184:8;;;-1:-1:-1;;4607:184:8;;;;;;;;;4823:22;;4607:184;4823:22;;;;;;;4802:18;4856:19;;;4878:4;4856:19;;;;;;;;:26;;-1:-1:-1;;4856:26:8;;;;;;4607:184;-1:-1:-1;4823:22:8;;;4897:41;;;;4607:184;;4897:41;:::i;:::-;;;;;;;;4443:502;;;4345:600;;;;:::o;1836:320::-;2056:17;2069:3;2056:12;:17::i;:::-;2083:66;2094:3;2099:15;2116;2133:10;;2145:3;;2083:10;:66::i;:::-;1836:320;;;;;;;:::o;794:128::-;;;;;;;;;;;;;;;;;;;:::o;3854:454::-;3971:9;3966:175;3986:26;;;3966:175;;;4033:8;4050;;4060:1;4044:18;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;4044:18:8;;-1:-1:-1;;;;;4084:8:8;;;;;:20;;-1:-1:-1;;;;;;;;;;4096:8:8;;;;4084:20;4076:54;;;;-1:-1:-1;;;4076:54:8;;13039:2:63;4076:54:8;;;13021:21:63;13078:2;13058:18;;;13051:30;-1:-1:-1;;;13097:18:63;;;13090:51;13158:18;;4076:54:8;;;;;;;;;-1:-1:-1;4014:3:8;;;;:::i;:::-;;;;3966:175;;;;4151:25;4203:8;;4218:14;;;;;;;;;;;;;;;;;4239:10;;4186:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4151:100;;4261:40;4289:11;4261:27;:40::i;:::-;3955:353;3854:454;;;;:::o;2193:1320::-;2429:12;2443:16;2471:66;2482:3;2487:15;2504;2521:10;;2533:3;;2471:10;:66::i;:::-;2547:26;2569:3;2547:21;:26::i;:::-;2592:18;;;;:23;;:63;;;2640:15;2619:3;:18;;;:36;2592:63;2584:96;;;;-1:-1:-1;;;2584:96:8;;12332:2:63;2584:96:8;;;12314:21:63;12371:2;12351:18;;;12344:30;-1:-1:-1;;;12390:18:63;;;12383:50;12450:18;;2584:96:8;12130:344:63;2584:96:8;2691:22;2732:9;;;;:14;2727:129;;-1:-1:-1;2780:5:8;2727:129;2865:21;2906:8;;;;:3;:8;:::i;:::-;2916;;;;:3;:8;:::i;:::-;2889:36;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;2889:36:8;;;;;;;;;;-1:-1:-1;2962:24:8;2972:14;2962:7;;;;:24;:::i;:::-;2956:2;2943:9;:12;;2953:2;2943:12;:::i;:::-;:15;;;;:::i;:::-;:43;;2935:77;;;;-1:-1:-1;;;2935:77:8;;11982:2:63;2935:77:8;;;11964:21:63;12021:2;12001:18;;;11994:30;-1:-1:-1;;;12040:18:63;;;12033:51;12101:18;;2935:77:8;11780:345:63;2935:77:8;3097:6;;;;;;;;:::i;:::-;-1:-1:-1;;;;;3097:11:8;3115:3;:7;;;3132:3;:9;;;3143:8;3097:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3163:56:8;;;;;;;;;;;;;;;;;;3081:71;;-1:-1:-1;3081:71:8;-1:-1:-1;3163:56:8;;3081:71;3163:11;:56::i;:::-;3229:21;3246:3;3229:16;:21::i;:::-;3266:9;;;;:14;;;;:41;;;3306:1;3284:21;:23;3266:41;3261:215;;;3424:8;;;;:3;:8;:::i;:::-;-1:-1:-1;;;;;3416:26:8;:49;3443:21;3416:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3261:215;3486:20;;2193:1320;;;;;;;;;;:::o;6088:729::-;6262:12;6551:15;6596:8;;;;:3;:8;:::i;:::-;-1:-1:-1;;;;;6580:26:8;6636:6;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6620:24:8;6658:9;;;;6681:7;;;;6702:9;;;;6735:8;;;;6658:3;6735:8;:::i;:::-;6725:19;;;;;;;:::i;:::-;;;;;;;;;6521:289;;;;;;;;6758:18;;;;;6790:10;;;;6521:289;;;:::i;:::-;;;;;;;;;;;;;6514:296;;6088:729;;;;;;:::o;3519:143::-;3622:9;;;;3602:6;:16;3609:8;;;;3622:3;3609:8;:::i;:::-;-1:-1:-1;;;;;3602:16:8;-1:-1:-1;;;;;3602:16:8;;;;;;;;;;;;;:29;3594:61;;;;-1:-1:-1;;;3594:61:8;;11634:2:63;3594:61:8;;;11616:21:63;11673:2;11653:18;;;11646:30;-1:-1:-1;;;11692:18:63;;;11685:49;11751:18;;3594:61:8;11432:343:63;3594:61:8;3519:143;:::o;331:598:22:-;790:15;;-1:-1:-1;;;;;790:15:22;776:10;:29;;;:48;;-1:-1:-1;809:15:22;;;776:48;772:151;;;840:72;857:3;862:15;879;896:10;;908:3;;840:16;:72::i;4951:256:8:-;5061:29;;;;;;;;;;5035:23;5100:27;;;;;;;;;;;;:34;;-1:-1:-1;;5100:34:8;5130:4;5100:34;;;5149:51;;5061:29;;5149:51;;;;5077:11;;5149:51;:::i;:::-;;;;;;;;5024:183;4951:256;:::o;3668:149::-;3777:9;;;;3755:6;:16;3762:8;;;;3777:3;3762:8;:::i;:::-;-1:-1:-1;;;;;3755:16:8;;;;;;;;;;;;-1:-1:-1;3755:16:8;;;:18;;;;;;:::i;:::-;;;;;:31;3747:63;;;;-1:-1:-1;;;3747:63:8;;11634:2:63;3747:63:8;;;11616:21:63;11673:2;11653:18;;;11646:30;-1:-1:-1;;;11692:18:63;;;11685:49;11751:18;;3747:63:8;11432:343:63;6165:130:62;6223:68;6283:2;6287;6239:51;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;6239:51:62;;;;;;;;;;;;;;-1:-1:-1;;;;;6239:51:62;-1:-1:-1;;;6239:51:62;;;6223:15;:68::i;:::-;6165:130;;:::o;1115:115::-;1168:58;1222:2;1184:41;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1184:41:62;;;;;;;;;;;;;;-1:-1:-1;;;;;1184:41:62;-1:-1:-1;;;1184:41:62;;;1168:15;:58::i;5213:733:8:-;5456:24;;;;:7;:24;;;;;;;;5448:66;;;;-1:-1:-1;;;5448:66:8;;12681:2:63;5448:66:8;;;12663:21:63;12720:2;12700:18;;;12693:30;12759:31;12739:18;;;12732:59;12808:18;;5448:66:8;12479:353:63;5448:66:8;5532:10;:27;;;;;;;;;;;;;5524:66;;;;-1:-1:-1;;;5524:66:8;;13389:2:63;5524:66:8;;;13371:21:63;13428:2;13408:18;;;13401:30;13467:28;13447:18;;;13440:56;13513:18;;5524:66:8;13187:350:63;5524:66:8;5600:14;5673:15;5716:45;5728:3;5733:15;5750:10;;5716:11;:45::i;:::-;5706:56;;;;;;;5627:149;;;;;;-1:-1:-1;;;7071:27:63;;7123:1;7114:11;;7107:27;;;;7159:2;7150:12;;7143:28;7196:2;7187:12;;6813:392;5627:149:8;;;;-1:-1:-1;;5627:149:8;;;;;;;;;5617:160;;5627:149;5617:160;;;;;-1:-1:-1;5848:9:8;:28;;:63;;-1:-1:-1;5903:8:8;;;;:3;:8;:::i;:::-;-1:-1:-1;;;;;5880:31:8;:19;5895:3;;5880:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5880:6:8;;:19;-1:-1:-1;;5880:14:8;:19;-1:-1:-1;5880:19:8:i;:::-;-1:-1:-1;;;;;5880:31:8;;5848:63;5840:99;;;;-1:-1:-1;;;5840:99:8;;11282:2:63;5840:99:8;;;11264:21:63;11321:2;11301:18;;;11294:30;11360:25;11340:18;;;11333:53;11403:18;;5840:99:8;11080:347:63;5840:99:8;5438:508;5213:733;;;;;;;:::o;176:288:62:-;264:14;;129:42;373:2;360:16;;240:21;;264:14;360:16;129:42;400:5;389:68;380:77;;335:126;;176:288;:::o;3759:227:57:-;3837:7;3857:17;3876:18;3898:27;3909:4;3915:9;3898:10;:27::i;:::-;3856:69;;;;3935:18;3947:5;3935:11;:18::i;:::-;-1:-1:-1;3970:9:57;3759:227;-1:-1:-1;;;3759:227:57:o;2243:730::-;2324:7;2333:12;2361:9;:16;2381:2;2361:22;2357:610;;;2697:4;2682:20;;2676:27;2746:4;2731:20;;2725:27;2803:4;2788:20;;2782:27;2399:9;2774:36;2844:25;2855:4;2774:36;2676:27;2725;2844:10;:25::i;:::-;2837:32;;;;;;;;;2357:610;-1:-1:-1;2916:1:57;;-1:-1:-1;2920:35:57;2357:610;2243:730;;;;;:::o;548:631::-;625:20;616:5;:29;;;;;;;;:::i;:::-;;612:561;;;548:631;:::o;612:561::-;721:29;712:5;:38;;;;;;;;:::i;:::-;;708:465;;;766:34;;-1:-1:-1;;;766:34:57;;9763:2:63;766:34:57;;;9745:21:63;9802:2;9782:18;;;9775:30;9841:26;9821:18;;;9814:54;9885:18;;766:34:57;9561:348:63;708:465:57;830:35;821:5;:44;;;;;;;;:::i;:::-;;817:356;;;881:41;;-1:-1:-1;;;881:41:57;;10116:2:63;881:41:57;;;10098:21:63;10155:2;10135:18;;;10128:30;10194:33;10174:18;;;10167:61;10245:18;;881:41:57;9914:355:63;817:356:57;952:30;943:5;:39;;;;;;;;:::i;:::-;;939:234;;;998:44;;-1:-1:-1;;;998:44:57;;10476:2:63;998:44:57;;;10458:21:63;10515:2;10495:18;;;10488:30;10554:34;10534:18;;;10527:62;-1:-1:-1;;;10605:18:63;;;10598:32;10647:19;;998:44:57;10274:398:63;939:234:57;1072:30;1063:5;:39;;;;;;;;:::i;:::-;;1059:114;;;1118:44;;-1:-1:-1;;;1118:44:57;;10879:2:63;1118:44:57;;;10861:21:63;10918:2;10898:18;;;10891:30;10957:34;10937:18;;;10930:62;-1:-1:-1;;;11008:18:63;;;11001:32;11050:19;;1118:44:57;10677:398:63;5167:1603:57;5293:7;;6217:66;6204:79;;6200:161;;;-1:-1:-1;6315:1:57;;-1:-1:-1;6319:30:57;6299:51;;6200:161;6374:1;:7;;6379:2;6374:7;;:18;;;;;6385:1;:7;;6390:2;6385:7;;6374:18;6370:100;;;-1:-1:-1;6424:1:57;;-1:-1:-1;6428:30:57;6408:51;;6370:100;6581:24;;;6564:14;6581:24;;;;;;;;;8634:25:63;;;8707:4;8695:17;;8675:18;;;8668:45;;;;8729:18;;;8722:34;;;8772:18;;;8765:34;;;6581:24:57;;8606:19:63;;6581:24:57;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6581:24:57;;-1:-1:-1;;6581:24:57;;;-1:-1:-1;;;;;;;6619:20:57;;6615:101;;6671:1;6675:29;6655:50;;;;;;;6615:101;6734:6;-1:-1:-1;6742:20:57;;-1:-1:-1;5167:1603:57;;;;;;;;:::o;14:347:63:-;65:8;75:6;129:3;122:4;114:6;110:17;106:27;96:55;;147:1;144;137:12;96:55;-1:-1:-1;170:20:63;;213:18;202:30;;199:50;;;245:1;242;235:12;199:50;282:4;274:6;270:17;258:29;;334:3;327:4;318:6;310;306:19;302:30;299:39;296:59;;;351:1;348;341:12;366:163;433:5;478:3;469:6;464:3;460:16;456:26;453:46;;;495:1;492;485:12;453:46;-1:-1:-1;517:6:63;366:163;-1:-1:-1;366:163:63:o;534:286::-;593:6;646:2;634:9;625:7;621:23;617:32;614:52;;;662:1;659;652:12;614:52;688:23;;-1:-1:-1;;;;;740:31:63;;730:42;;720:70;;786:1;783;776:12;720:70;809:5;534:286;-1:-1:-1;;;534:286:63:o;825:180::-;884:6;937:2;925:9;916:7;912:23;908:32;905:52;;;953:1;950;943:12;905:52;-1:-1:-1;976:23:63;;825:180;-1:-1:-1;825:180:63:o;1010:286::-;1068:6;1121:2;1109:9;1100:7;1096:23;1092:32;1089:52;;;1137:1;1134;1127:12;1089:52;1163:23;;-1:-1:-1;;;;;;1215:32:63;;1205:43;;1195:71;;1262:1;1259;1252:12;1301:719;1393:6;1401;1409;1417;1470:2;1458:9;1449:7;1445:23;1441:32;1438:52;;;1486:1;1483;1476:12;1438:52;1526:9;1513:23;1555:18;1596:2;1588:6;1585:14;1582:34;;;1612:1;1609;1602:12;1582:34;1651:58;1701:7;1692:6;1681:9;1677:22;1651:58;:::i;:::-;1728:8;;-1:-1:-1;1625:84:63;-1:-1:-1;1816:2:63;1801:18;;1788:32;;-1:-1:-1;1832:16:63;;;1829:36;;;1861:1;1858;1851:12;1829:36;;1900:60;1952:7;1941:8;1930:9;1926:24;1900:60;:::i;:::-;1301:719;;;;-1:-1:-1;1979:8:63;-1:-1:-1;;;;1301:719:63:o;2025:1103::-;2176:6;2184;2192;2200;2208;2216;2224;2277:3;2265:9;2256:7;2252:23;2248:33;2245:53;;;2294:1;2291;2284:12;2245:53;2334:9;2321:23;2363:18;2404:2;2396:6;2393:14;2390:34;;;2420:1;2417;2410:12;2390:34;2443:74;2509:7;2500:6;2489:9;2485:22;2443:74;:::i;:::-;2433:84;;2564:2;2553:9;2549:18;2536:32;2526:42;;2615:2;2604:9;2600:18;2587:32;2577:42;;2672:2;2661:9;2657:18;2644:32;2628:48;;2701:2;2691:8;2688:16;2685:36;;;2717:1;2714;2707:12;2685:36;2756:60;2808:7;2797:8;2786:9;2782:24;2756:60;:::i;:::-;2835:8;;-1:-1:-1;2730:86:63;-1:-1:-1;2923:3:63;2908:19;;2895:33;;-1:-1:-1;2940:16:63;;;2937:36;;;2969:1;2966;2959:12;2937:36;;3008:60;3060:7;3049:8;3038:9;3034:24;3008:60;:::i;:::-;2025:1103;;;;-1:-1:-1;2025:1103:63;;-1:-1:-1;2025:1103:63;;;;2982:86;;-1:-1:-1;;;2025:1103:63:o;3133:746::-;3255:6;3263;3271;3279;3332:2;3320:9;3311:7;3307:23;3303:32;3300:52;;;3348:1;3345;3338:12;3300:52;3388:9;3375:23;3417:18;3458:2;3450:6;3447:14;3444:34;;;3474:1;3471;3464:12;3444:34;3497:74;3563:7;3554:6;3543:9;3539:22;3497:74;:::i;:::-;3487:84;;3618:2;3607:9;3603:18;3590:32;3580:42;;3675:2;3664:9;3660:18;3647:32;3631:48;;3704:2;3694:8;3691:16;3688:36;;;3720:1;3717;3710:12;3884:257;3925:3;3963:5;3957:12;3990:6;3985:3;3978:19;4006:63;4062:6;4055:4;4050:3;4046:14;4039:4;4032:5;4028:16;4006:63;:::i;:::-;4123:2;4102:15;-1:-1:-1;;4098:29:63;4089:39;;;;4130:4;4085:50;;3884:257;-1:-1:-1;;3884:257:63:o;4146:826::-;4539:6;4534:3;4527:19;4576:6;4571:2;4566:3;4562:12;4555:28;4613:6;4608:2;4603:3;4599:12;4592:28;4650:6;4645:2;4640:3;4636:12;4629:28;4688:6;4682:3;4677;4673:13;4666:29;4726:6;4720:3;4715;4711:13;4704:29;4764:6;4758:3;4753;4749:13;4742:29;4802:6;4796:3;4791;4787:13;4780:29;4509:3;4828;4875:6;4867;4862:2;4857:3;4853:12;4840:42;4946:1;4905:16;;;;4901:25;;;4935:13;;;4901:25;4146:826;-1:-1:-1;;;;;;;;;;4146:826:63:o;4977:271::-;5160:6;5152;5147:3;5134:33;5116:3;5186:16;;5211:13;;;5186:16;4977:271;-1:-1:-1;4977:271:63:o;5253:382::-;5464:6;5456;5451:3;5438:33;5556:2;5552:15;;;;-1:-1:-1;;5548:53:63;5490:16;;5537:65;;;5626:2;5618:11;;5253:382;-1:-1:-1;5253:382:63:o;5640:274::-;5769:3;5807:6;5801:13;5823:53;5869:6;5864:3;5857:4;5849:6;5845:17;5823:53;:::i;:::-;5892:16;;;;;5640:274;-1:-1:-1;;5640:274:63:o;5919:889::-;6412:6;6404;6399:3;6386:33;6368:3;6447:6;6442:3;6438:16;6474:1;6470:2;6463:13;-1:-1:-1;;;6492:2:63;6485:15;6529:6;6523:13;6545:60;6598:6;6594:1;6590:2;6586:10;6579:4;6571:6;6567:17;6545:60;:::i;:::-;-1:-1:-1;;;6663:1:63;6624:15;;;;6655:10;;;6648:23;6713:6;6705;6701:1;6693:10;;6680:40;6782:1;6743:15;;6760:1;6739:23;6771:13;;;-1:-1:-1;6739:23:63;;5919:889;-1:-1:-1;;;;;5919:889:63:o;7610:298::-;7793:6;7786:14;7779:22;7768:9;7761:41;7838:2;7833;7822:9;7818:18;7811:30;7742:4;7858:44;7898:2;7887:9;7883:18;7875:6;7858:44;:::i;:::-;7850:52;7610:298;-1:-1:-1;;;;7610:298:63:o;8810:217::-;8957:2;8946:9;8939:21;8920:4;8977:44;9017:2;9006:9;9002:18;8994:6;8977:44;:::i;9256:300::-;9427:2;9416:9;9409:21;9390:4;9447:44;9487:2;9476:9;9472:18;9464:6;9447:44;:::i;:::-;9439:52;;9541:6;9534:14;9527:22;9522:2;9511:9;9507:18;9500:50;9256:300;;;;;:::o;13724:521::-;13801:4;13807:6;13867:11;13854:25;13961:2;13957:7;13946:8;13930:14;13926:29;13922:43;13902:18;13898:68;13888:96;;13980:1;13977;13970:12;13888:96;14007:33;;14059:20;;;-1:-1:-1;14102:18:63;14091:30;;14088:50;;;14134:1;14131;14124:12;14088:50;14167:4;14155:17;;-1:-1:-1;14198:14:63;14194:27;;;14184:38;;14181:58;;;14235:1;14232;14225:12;14250:128;14290:3;14321:1;14317:6;14314:1;14311:13;14308:39;;;14327:18;;:::i;:::-;-1:-1:-1;14363:9:63;;14250:128::o;14383:217::-;14423:1;14449;14439:132;;14493:10;14488:3;14484:20;14481:1;14474:31;14528:4;14525:1;14518:15;14556:4;14553:1;14546:15;14439:132;-1:-1:-1;14585:9:63;;14383:217::o;14605:168::-;14645:7;14711:1;14707;14703:6;14699:14;14696:1;14693:21;14688:1;14681:9;14674:17;14670:45;14667:71;;;14718:18;;:::i;:::-;-1:-1:-1;14758:9:63;;14605:168::o;14778:258::-;14850:1;14860:113;14874:6;14871:1;14868:13;14860:113;;;14950:11;;;14944:18;14931:11;;;14924:39;14896:2;14889:10;14860:113;;;14991:6;14988:1;14985:13;14982:48;;;15026:1;15017:6;15012:3;15008:16;15001:27;14982:48;;14778:258;;;:::o;15041:135::-;15080:3;-1:-1:-1;;15101:17:63;;15098:43;;;15121:18;;:::i;:::-;-1:-1:-1;15168:1:63;15157:13;;15041:135::o;15181:127::-;15242:10;15237:3;15233:20;15230:1;15223:31;15273:4;15270:1;15263:15;15297:4;15294:1;15287:15;15313:127;15374:10;15369:3;15365:20;15362:1;15355:31;15405:4;15402:1;15395:15;15429:4;15426:1;15419:15;15445:127;15506:10;15501:3;15497:20;15494:1;15487:31;15537:4;15534:1;15527:15;15561:4;15558:1;15551:15",
    "source": "pragma solidity ^0.8.0;\npragma abicoder v2;\n\n// SPDX-License-Identifier: GPL-3.0-only\n\nimport \"../forwarder/Forwarder.sol\";\n\ncontract TestGatewayForwarder is Forwarder {\n    address public trustedRelayHub;\n\n    function setTrustedRelayHub(address _trustedRelayHub) external {\n        trustedRelayHub = _trustedRelayHub;\n    }\n\n    function _verifySig(\n        ForwardRequest calldata req,\n        bytes32 domainSeparator,\n        bytes32 requestTypeHash,\n        bytes calldata suffixData,\n        bytes calldata sig)\n    internal\n    override\n    view\n    {\n        // trustedRelayHub can only be called from a verified Gateway where the signatures are actually checked\n        // note that if signature field is set, it will be verified in this Forwarder anyway\n        if (msg.sender != trustedRelayHub || sig.length != 0) {\n            super._verifySig(req, domainSeparator, requestTypeHash, suffixData, sig);\n        }\n    }\n}",
    "sourcePath": "/Users/alexf/gsn2/packages/contracts/solpp/test/TestGatewayForwarder.sol",
    "ast": {
        "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/test/TestGatewayForwarder.sol",
        "exportedSymbols": {
            "ECDSA": [
                12122
            ],
            "ERC165": [
                12146
            ],
            "Forwarder": [
                5036
            ],
            "IERC165": [
                12352
            ],
            "IForwarder": [
                5129
            ],
            "Strings": [
                11734
            ],
            "TestGatewayForwarder": [
                6487
            ],
            "console": [
                20920
            ]
        },
        "id": 6488,
        "license": "GPL-3.0-only",
        "nodeType": "SourceUnit",
        "nodes": [
            {
                "id": 6433,
                "literals": [
                    "solidity",
                    "^",
                    "0.8",
                    ".0"
                ],
                "nodeType": "PragmaDirective",
                "src": "0:23:22"
            },
            {
                "id": 6434,
                "literals": [
                    "abicoder",
                    "v2"
                ],
                "nodeType": "PragmaDirective",
                "src": "24:19:22"
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/forwarder/Forwarder.sol",
                "file": "../forwarder/Forwarder.sol",
                "id": 6435,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 6488,
                "sourceUnit": 5037,
                "src": "87:36:22",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "abstract": false,
                "baseContracts": [
                    {
                        "baseName": {
                            "id": 6436,
                            "name": "Forwarder",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 5036,
                            "src": "158:9:22"
                        },
                        "id": 6437,
                        "nodeType": "InheritanceSpecifier",
                        "src": "158:9:22"
                    }
                ],
                "contractDependencies": [],
                "contractKind": "contract",
                "fullyImplemented": true,
                "id": 6487,
                "linearizedBaseContracts": [
                    6487,
                    5036,
                    12146,
                    5129,
                    12352
                ],
                "name": "TestGatewayForwarder",
                "nameLocation": "134:20:22",
                "nodeType": "ContractDefinition",
                "nodes": [
                    {
                        "constant": false,
                        "functionSelector": "44e01340",
                        "id": 6439,
                        "mutability": "mutable",
                        "name": "trustedRelayHub",
                        "nameLocation": "189:15:22",
                        "nodeType": "VariableDeclaration",
                        "scope": 6487,
                        "src": "174:30:22",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                        },
                        "typeName": {
                            "id": 6438,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "174:7:22",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                            }
                        },
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 6448,
                            "nodeType": "Block",
                            "src": "274:51:22",
                            "statements": [
                                {
                                    "expression": {
                                        "id": 6446,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                            "id": 6444,
                                            "name": "trustedRelayHub",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 6439,
                                            "src": "284:15:22",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                            }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                            "id": 6445,
                                            "name": "_trustedRelayHub",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 6441,
                                            "src": "302:16:22",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                            }
                                        },
                                        "src": "284:34:22",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "id": 6447,
                                    "nodeType": "ExpressionStatement",
                                    "src": "284:34:22"
                                }
                            ]
                        },
                        "functionSelector": "cfbd30ed",
                        "id": 6449,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "setTrustedRelayHub",
                        "nameLocation": "220:18:22",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 6442,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 6441,
                                    "mutability": "mutable",
                                    "name": "_trustedRelayHub",
                                    "nameLocation": "247:16:22",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 6449,
                                    "src": "239:24:22",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 6440,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "239:7:22",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "238:26:22"
                        },
                        "returnParameters": {
                            "id": 6443,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "274:0:22"
                        },
                        "scope": 6487,
                        "src": "211:114:22",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "baseFunctions": [
                            4987
                        ],
                        "body": {
                            "id": 6485,
                            "nodeType": "Block",
                            "src": "557:372:22",
                            "statements": [
                                {
                                    "condition": {
                                        "commonType": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        },
                                        "id": 6472,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                            "commonType": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                            },
                                            "id": 6467,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftExpression": {
                                                "expression": {
                                                    "id": 6464,
                                                    "name": "msg",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 4294967281,
                                                    "src": "776:3:22",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_magic_message",
                                                        "typeString": "msg"
                                                    }
                                                },
                                                "id": 6465,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "sender",
                                                "nodeType": "MemberAccess",
                                                "src": "776:10:22",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            },
                                            "nodeType": "BinaryOperation",
                                            "operator": "!=",
                                            "rightExpression": {
                                                "id": 6466,
                                                "name": "trustedRelayHub",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 6439,
                                                "src": "790:15:22",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            },
                                            "src": "776:29:22",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "||",
                                        "rightExpression": {
                                            "commonType": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                            },
                                            "id": 6471,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftExpression": {
                                                "expression": {
                                                    "id": 6468,
                                                    "name": "sig",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 6460,
                                                    "src": "809:3:22",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                                        "typeString": "bytes calldata"
                                                    }
                                                },
                                                "id": 6469,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "length",
                                                "nodeType": "MemberAccess",
                                                "src": "809:10:22",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            },
                                            "nodeType": "BinaryOperation",
                                            "operator": "!=",
                                            "rightExpression": {
                                                "hexValue": "30",
                                                "id": 6470,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "number",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "823:1:22",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_rational_0_by_1",
                                                    "typeString": "int_const 0"
                                                },
                                                "value": "0"
                                            },
                                            "src": "809:15:22",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            }
                                        },
                                        "src": "776:48:22",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "id": 6484,
                                    "nodeType": "IfStatement",
                                    "src": "772:151:22",
                                    "trueBody": {
                                        "id": 6483,
                                        "nodeType": "Block",
                                        "src": "826:97:22",
                                        "statements": [
                                            {
                                                "expression": {
                                                    "arguments": [
                                                        {
                                                            "id": 6476,
                                                            "name": "req",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 6452,
                                                            "src": "857:3:22",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                                                "typeString": "struct IForwarder.ForwardRequest calldata"
                                                            }
                                                        },
                                                        {
                                                            "id": 6477,
                                                            "name": "domainSeparator",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 6454,
                                                            "src": "862:15:22",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes32",
                                                                "typeString": "bytes32"
                                                            }
                                                        },
                                                        {
                                                            "id": 6478,
                                                            "name": "requestTypeHash",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 6456,
                                                            "src": "879:15:22",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes32",
                                                                "typeString": "bytes32"
                                                            }
                                                        },
                                                        {
                                                            "id": 6479,
                                                            "name": "suffixData",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 6458,
                                                            "src": "896:10:22",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes_calldata_ptr",
                                                                "typeString": "bytes calldata"
                                                            }
                                                        },
                                                        {
                                                            "id": 6480,
                                                            "name": "sig",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 6460,
                                                            "src": "908:3:22",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes_calldata_ptr",
                                                                "typeString": "bytes calldata"
                                                            }
                                                        }
                                                    ],
                                                    "expression": {
                                                        "argumentTypes": [
                                                            {
                                                                "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                                                "typeString": "struct IForwarder.ForwardRequest calldata"
                                                            },
                                                            {
                                                                "typeIdentifier": "t_bytes32",
                                                                "typeString": "bytes32"
                                                            },
                                                            {
                                                                "typeIdentifier": "t_bytes32",
                                                                "typeString": "bytes32"
                                                            },
                                                            {
                                                                "typeIdentifier": "t_bytes_calldata_ptr",
                                                                "typeString": "bytes calldata"
                                                            },
                                                            {
                                                                "typeIdentifier": "t_bytes_calldata_ptr",
                                                                "typeString": "bytes calldata"
                                                            }
                                                        ],
                                                        "expression": {
                                                            "id": 6473,
                                                            "name": "super",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 4294967271,
                                                            "src": "840:5:22",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_type$_t_super$_TestGatewayForwarder_$6487_$",
                                                                "typeString": "type(contract super TestGatewayForwarder)"
                                                            }
                                                        },
                                                        "id": 6475,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "_verifySig",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 4987,
                                                        "src": "840:16:22",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_function_internal_view$_t_struct$_ForwardRequest_$5058_calldata_ptr_$_t_bytes32_$_t_bytes32_$_t_bytes_calldata_ptr_$_t_bytes_calldata_ptr_$returns$__$",
                                                            "typeString": "function (struct IForwarder.ForwardRequest calldata,bytes32,bytes32,bytes calldata,bytes calldata) view"
                                                        }
                                                    },
                                                    "id": 6481,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "kind": "functionCall",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "840:72:22",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_tuple$__$",
                                                        "typeString": "tuple()"
                                                    }
                                                },
                                                "id": 6482,
                                                "nodeType": "ExpressionStatement",
                                                "src": "840:72:22"
                                            }
                                        ]
                                    }
                                }
                            ]
                        },
                        "id": 6486,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_verifySig",
                        "nameLocation": "340:10:22",
                        "nodeType": "FunctionDefinition",
                        "overrides": {
                            "id": 6462,
                            "nodeType": "OverrideSpecifier",
                            "overrides": [],
                            "src": "535:8:22"
                        },
                        "parameters": {
                            "id": 6461,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 6452,
                                    "mutability": "mutable",
                                    "name": "req",
                                    "nameLocation": "384:3:22",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 6486,
                                    "src": "360:27:22",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                        "typeString": "struct IForwarder.ForwardRequest"
                                    },
                                    "typeName": {
                                        "id": 6451,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 6450,
                                            "name": "ForwardRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 5058,
                                            "src": "360:14:22"
                                        },
                                        "referencedDeclaration": 5058,
                                        "src": "360:14:22",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_ForwardRequest_$5058_storage_ptr",
                                            "typeString": "struct IForwarder.ForwardRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 6454,
                                    "mutability": "mutable",
                                    "name": "domainSeparator",
                                    "nameLocation": "405:15:22",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 6486,
                                    "src": "397:23:22",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 6453,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "397:7:22",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 6456,
                                    "mutability": "mutable",
                                    "name": "requestTypeHash",
                                    "nameLocation": "438:15:22",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 6486,
                                    "src": "430:23:22",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 6455,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "430:7:22",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 6458,
                                    "mutability": "mutable",
                                    "name": "suffixData",
                                    "nameLocation": "478:10:22",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 6486,
                                    "src": "463:25:22",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 6457,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "463:5:22",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 6460,
                                    "mutability": "mutable",
                                    "name": "sig",
                                    "nameLocation": "513:3:22",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 6486,
                                    "src": "498:18:22",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 6459,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "498:5:22",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "350:167:22"
                        },
                        "returnParameters": {
                            "id": 6463,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "557:0:22"
                        },
                        "scope": 6487,
                        "src": "331:598:22",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "internal"
                    }
                ],
                "scope": 6488,
                "src": "125:806:22",
                "usedErrors": []
            }
        ],
        "src": "0:931:22"
    },
    "legacyAST": {
        "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/test/TestGatewayForwarder.sol",
        "exportedSymbols": {
            "ECDSA": [
                12122
            ],
            "ERC165": [
                12146
            ],
            "Forwarder": [
                5036
            ],
            "IERC165": [
                12352
            ],
            "IForwarder": [
                5129
            ],
            "Strings": [
                11734
            ],
            "TestGatewayForwarder": [
                6487
            ],
            "console": [
                20920
            ]
        },
        "id": 6488,
        "license": "GPL-3.0-only",
        "nodeType": "SourceUnit",
        "nodes": [
            {
                "id": 6433,
                "literals": [
                    "solidity",
                    "^",
                    "0.8",
                    ".0"
                ],
                "nodeType": "PragmaDirective",
                "src": "0:23:22"
            },
            {
                "id": 6434,
                "literals": [
                    "abicoder",
                    "v2"
                ],
                "nodeType": "PragmaDirective",
                "src": "24:19:22"
            },
            {
                "absolutePath": "/Users/alexf/gsn2/packages/contracts/solpp/forwarder/Forwarder.sol",
                "file": "../forwarder/Forwarder.sol",
                "id": 6435,
                "nameLocation": "-1:-1:-1",
                "nodeType": "ImportDirective",
                "scope": 6488,
                "sourceUnit": 5037,
                "src": "87:36:22",
                "symbolAliases": [],
                "unitAlias": ""
            },
            {
                "abstract": false,
                "baseContracts": [
                    {
                        "baseName": {
                            "id": 6436,
                            "name": "Forwarder",
                            "nodeType": "IdentifierPath",
                            "referencedDeclaration": 5036,
                            "src": "158:9:22"
                        },
                        "id": 6437,
                        "nodeType": "InheritanceSpecifier",
                        "src": "158:9:22"
                    }
                ],
                "contractDependencies": [],
                "contractKind": "contract",
                "fullyImplemented": true,
                "id": 6487,
                "linearizedBaseContracts": [
                    6487,
                    5036,
                    12146,
                    5129,
                    12352
                ],
                "name": "TestGatewayForwarder",
                "nameLocation": "134:20:22",
                "nodeType": "ContractDefinition",
                "nodes": [
                    {
                        "constant": false,
                        "functionSelector": "44e01340",
                        "id": 6439,
                        "mutability": "mutable",
                        "name": "trustedRelayHub",
                        "nameLocation": "189:15:22",
                        "nodeType": "VariableDeclaration",
                        "scope": 6487,
                        "src": "174:30:22",
                        "stateVariable": true,
                        "storageLocation": "default",
                        "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                        },
                        "typeName": {
                            "id": 6438,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "174:7:22",
                            "stateMutability": "nonpayable",
                            "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                            }
                        },
                        "visibility": "public"
                    },
                    {
                        "body": {
                            "id": 6448,
                            "nodeType": "Block",
                            "src": "274:51:22",
                            "statements": [
                                {
                                    "expression": {
                                        "id": 6446,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftHandSide": {
                                            "id": 6444,
                                            "name": "trustedRelayHub",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 6439,
                                            "src": "284:15:22",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                            }
                                        },
                                        "nodeType": "Assignment",
                                        "operator": "=",
                                        "rightHandSide": {
                                            "id": 6445,
                                            "name": "_trustedRelayHub",
                                            "nodeType": "Identifier",
                                            "overloadedDeclarations": [],
                                            "referencedDeclaration": 6441,
                                            "src": "302:16:22",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                            }
                                        },
                                        "src": "284:34:22",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "id": 6447,
                                    "nodeType": "ExpressionStatement",
                                    "src": "284:34:22"
                                }
                            ]
                        },
                        "functionSelector": "cfbd30ed",
                        "id": 6449,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "setTrustedRelayHub",
                        "nameLocation": "220:18:22",
                        "nodeType": "FunctionDefinition",
                        "parameters": {
                            "id": 6442,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 6441,
                                    "mutability": "mutable",
                                    "name": "_trustedRelayHub",
                                    "nameLocation": "247:16:22",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 6449,
                                    "src": "239:24:22",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_address",
                                        "typeString": "address"
                                    },
                                    "typeName": {
                                        "id": 6440,
                                        "name": "address",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "239:7:22",
                                        "stateMutability": "nonpayable",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_address",
                                            "typeString": "address"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "238:26:22"
                        },
                        "returnParameters": {
                            "id": 6443,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "274:0:22"
                        },
                        "scope": 6487,
                        "src": "211:114:22",
                        "stateMutability": "nonpayable",
                        "virtual": false,
                        "visibility": "external"
                    },
                    {
                        "baseFunctions": [
                            4987
                        ],
                        "body": {
                            "id": 6485,
                            "nodeType": "Block",
                            "src": "557:372:22",
                            "statements": [
                                {
                                    "condition": {
                                        "commonType": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        },
                                        "id": 6472,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "leftExpression": {
                                            "commonType": {
                                                "typeIdentifier": "t_address",
                                                "typeString": "address"
                                            },
                                            "id": 6467,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftExpression": {
                                                "expression": {
                                                    "id": 6464,
                                                    "name": "msg",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 4294967281,
                                                    "src": "776:3:22",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_magic_message",
                                                        "typeString": "msg"
                                                    }
                                                },
                                                "id": 6465,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "sender",
                                                "nodeType": "MemberAccess",
                                                "src": "776:10:22",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            },
                                            "nodeType": "BinaryOperation",
                                            "operator": "!=",
                                            "rightExpression": {
                                                "id": 6466,
                                                "name": "trustedRelayHub",
                                                "nodeType": "Identifier",
                                                "overloadedDeclarations": [],
                                                "referencedDeclaration": 6439,
                                                "src": "790:15:22",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_address",
                                                    "typeString": "address"
                                                }
                                            },
                                            "src": "776:29:22",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            }
                                        },
                                        "nodeType": "BinaryOperation",
                                        "operator": "||",
                                        "rightExpression": {
                                            "commonType": {
                                                "typeIdentifier": "t_uint256",
                                                "typeString": "uint256"
                                            },
                                            "id": 6471,
                                            "isConstant": false,
                                            "isLValue": false,
                                            "isPure": false,
                                            "lValueRequested": false,
                                            "leftExpression": {
                                                "expression": {
                                                    "id": 6468,
                                                    "name": "sig",
                                                    "nodeType": "Identifier",
                                                    "overloadedDeclarations": [],
                                                    "referencedDeclaration": 6460,
                                                    "src": "809:3:22",
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                                        "typeString": "bytes calldata"
                                                    }
                                                },
                                                "id": 6469,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": false,
                                                "lValueRequested": false,
                                                "memberName": "length",
                                                "nodeType": "MemberAccess",
                                                "src": "809:10:22",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_uint256",
                                                    "typeString": "uint256"
                                                }
                                            },
                                            "nodeType": "BinaryOperation",
                                            "operator": "!=",
                                            "rightExpression": {
                                                "hexValue": "30",
                                                "id": 6470,
                                                "isConstant": false,
                                                "isLValue": false,
                                                "isPure": true,
                                                "kind": "number",
                                                "lValueRequested": false,
                                                "nodeType": "Literal",
                                                "src": "823:1:22",
                                                "typeDescriptions": {
                                                    "typeIdentifier": "t_rational_0_by_1",
                                                    "typeString": "int_const 0"
                                                },
                                                "value": "0"
                                            },
                                            "src": "809:15:22",
                                            "typeDescriptions": {
                                                "typeIdentifier": "t_bool",
                                                "typeString": "bool"
                                            }
                                        },
                                        "src": "776:48:22",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bool",
                                            "typeString": "bool"
                                        }
                                    },
                                    "id": 6484,
                                    "nodeType": "IfStatement",
                                    "src": "772:151:22",
                                    "trueBody": {
                                        "id": 6483,
                                        "nodeType": "Block",
                                        "src": "826:97:22",
                                        "statements": [
                                            {
                                                "expression": {
                                                    "arguments": [
                                                        {
                                                            "id": 6476,
                                                            "name": "req",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 6452,
                                                            "src": "857:3:22",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                                                "typeString": "struct IForwarder.ForwardRequest calldata"
                                                            }
                                                        },
                                                        {
                                                            "id": 6477,
                                                            "name": "domainSeparator",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 6454,
                                                            "src": "862:15:22",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes32",
                                                                "typeString": "bytes32"
                                                            }
                                                        },
                                                        {
                                                            "id": 6478,
                                                            "name": "requestTypeHash",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 6456,
                                                            "src": "879:15:22",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes32",
                                                                "typeString": "bytes32"
                                                            }
                                                        },
                                                        {
                                                            "id": 6479,
                                                            "name": "suffixData",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 6458,
                                                            "src": "896:10:22",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes_calldata_ptr",
                                                                "typeString": "bytes calldata"
                                                            }
                                                        },
                                                        {
                                                            "id": 6480,
                                                            "name": "sig",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 6460,
                                                            "src": "908:3:22",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_bytes_calldata_ptr",
                                                                "typeString": "bytes calldata"
                                                            }
                                                        }
                                                    ],
                                                    "expression": {
                                                        "argumentTypes": [
                                                            {
                                                                "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                                                "typeString": "struct IForwarder.ForwardRequest calldata"
                                                            },
                                                            {
                                                                "typeIdentifier": "t_bytes32",
                                                                "typeString": "bytes32"
                                                            },
                                                            {
                                                                "typeIdentifier": "t_bytes32",
                                                                "typeString": "bytes32"
                                                            },
                                                            {
                                                                "typeIdentifier": "t_bytes_calldata_ptr",
                                                                "typeString": "bytes calldata"
                                                            },
                                                            {
                                                                "typeIdentifier": "t_bytes_calldata_ptr",
                                                                "typeString": "bytes calldata"
                                                            }
                                                        ],
                                                        "expression": {
                                                            "id": 6473,
                                                            "name": "super",
                                                            "nodeType": "Identifier",
                                                            "overloadedDeclarations": [],
                                                            "referencedDeclaration": 4294967271,
                                                            "src": "840:5:22",
                                                            "typeDescriptions": {
                                                                "typeIdentifier": "t_type$_t_super$_TestGatewayForwarder_$6487_$",
                                                                "typeString": "type(contract super TestGatewayForwarder)"
                                                            }
                                                        },
                                                        "id": 6475,
                                                        "isConstant": false,
                                                        "isLValue": false,
                                                        "isPure": false,
                                                        "lValueRequested": false,
                                                        "memberName": "_verifySig",
                                                        "nodeType": "MemberAccess",
                                                        "referencedDeclaration": 4987,
                                                        "src": "840:16:22",
                                                        "typeDescriptions": {
                                                            "typeIdentifier": "t_function_internal_view$_t_struct$_ForwardRequest_$5058_calldata_ptr_$_t_bytes32_$_t_bytes32_$_t_bytes_calldata_ptr_$_t_bytes_calldata_ptr_$returns$__$",
                                                            "typeString": "function (struct IForwarder.ForwardRequest calldata,bytes32,bytes32,bytes calldata,bytes calldata) view"
                                                        }
                                                    },
                                                    "id": 6481,
                                                    "isConstant": false,
                                                    "isLValue": false,
                                                    "isPure": false,
                                                    "kind": "functionCall",
                                                    "lValueRequested": false,
                                                    "names": [],
                                                    "nodeType": "FunctionCall",
                                                    "src": "840:72:22",
                                                    "tryCall": false,
                                                    "typeDescriptions": {
                                                        "typeIdentifier": "t_tuple$__$",
                                                        "typeString": "tuple()"
                                                    }
                                                },
                                                "id": 6482,
                                                "nodeType": "ExpressionStatement",
                                                "src": "840:72:22"
                                            }
                                        ]
                                    }
                                }
                            ]
                        },
                        "id": 6486,
                        "implemented": true,
                        "kind": "function",
                        "modifiers": [],
                        "name": "_verifySig",
                        "nameLocation": "340:10:22",
                        "nodeType": "FunctionDefinition",
                        "overrides": {
                            "id": 6462,
                            "nodeType": "OverrideSpecifier",
                            "overrides": [],
                            "src": "535:8:22"
                        },
                        "parameters": {
                            "id": 6461,
                            "nodeType": "ParameterList",
                            "parameters": [
                                {
                                    "constant": false,
                                    "id": 6452,
                                    "mutability": "mutable",
                                    "name": "req",
                                    "nameLocation": "384:3:22",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 6486,
                                    "src": "360:27:22",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_struct$_ForwardRequest_$5058_calldata_ptr",
                                        "typeString": "struct IForwarder.ForwardRequest"
                                    },
                                    "typeName": {
                                        "id": 6451,
                                        "nodeType": "UserDefinedTypeName",
                                        "pathNode": {
                                            "id": 6450,
                                            "name": "ForwardRequest",
                                            "nodeType": "IdentifierPath",
                                            "referencedDeclaration": 5058,
                                            "src": "360:14:22"
                                        },
                                        "referencedDeclaration": 5058,
                                        "src": "360:14:22",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_struct$_ForwardRequest_$5058_storage_ptr",
                                            "typeString": "struct IForwarder.ForwardRequest"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 6454,
                                    "mutability": "mutable",
                                    "name": "domainSeparator",
                                    "nameLocation": "405:15:22",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 6486,
                                    "src": "397:23:22",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 6453,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "397:7:22",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 6456,
                                    "mutability": "mutable",
                                    "name": "requestTypeHash",
                                    "nameLocation": "438:15:22",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 6486,
                                    "src": "430:23:22",
                                    "stateVariable": false,
                                    "storageLocation": "default",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes32",
                                        "typeString": "bytes32"
                                    },
                                    "typeName": {
                                        "id": 6455,
                                        "name": "bytes32",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "430:7:22",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes32",
                                            "typeString": "bytes32"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 6458,
                                    "mutability": "mutable",
                                    "name": "suffixData",
                                    "nameLocation": "478:10:22",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 6486,
                                    "src": "463:25:22",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 6457,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "463:5:22",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                },
                                {
                                    "constant": false,
                                    "id": 6460,
                                    "mutability": "mutable",
                                    "name": "sig",
                                    "nameLocation": "513:3:22",
                                    "nodeType": "VariableDeclaration",
                                    "scope": 6486,
                                    "src": "498:18:22",
                                    "stateVariable": false,
                                    "storageLocation": "calldata",
                                    "typeDescriptions": {
                                        "typeIdentifier": "t_bytes_calldata_ptr",
                                        "typeString": "bytes"
                                    },
                                    "typeName": {
                                        "id": 6459,
                                        "name": "bytes",
                                        "nodeType": "ElementaryTypeName",
                                        "src": "498:5:22",
                                        "typeDescriptions": {
                                            "typeIdentifier": "t_bytes_storage_ptr",
                                            "typeString": "bytes"
                                        }
                                    },
                                    "visibility": "internal"
                                }
                            ],
                            "src": "350:167:22"
                        },
                        "returnParameters": {
                            "id": 6463,
                            "nodeType": "ParameterList",
                            "parameters": [],
                            "src": "557:0:22"
                        },
                        "scope": 6487,
                        "src": "331:598:22",
                        "stateMutability": "view",
                        "virtual": false,
                        "visibility": "internal"
                    }
                ],
                "scope": 6488,
                "src": "125:806:22",
                "usedErrors": []
            }
        ],
        "src": "0:931:22"
    },
    "compiler": {
        "name": "solc",
        "version": "0.8.7+commit.e28d00a7.Emscripten.clang"
    },
    "networks": {},
    "schemaVersion": "3.1.0",
    "updatedAt": "2023-03-16T16:54:15.216Z",
    "devdoc": {
        "kind": "dev",
        "methods": {
            "execute((address,address,uint256,uint256,uint256,bytes,uint256),bytes32,bytes32,bytes,bytes)": {
                "params": {
                    "domainSeparator": "The domain used when signing this request.",
                    "forwardRequest": "All requested transaction parameters.",
                    "requestTypeHash": "The request type used when signing this request.",
                    "signature": "The client signature to be validated.",
                    "suffixData": "The ABI-encoded extension data for the current `RequestType` used when signing this request."
                },
                "returns": {
                    "ret": "The byte array returned by the underlying `CALL` to the target address.",
                    "success": "The success flag of the underlying `CALL` to the target address."
                }
            },
            "getNonce(address)": {
                "params": {
                    "from": "The address of a sender."
                },
                "returns": {
                    "_0": "The nonce for this address."
                }
            },
            "registerDomainSeparator(string,string)": {
                "params": {
                    "name": "The domain's display name.",
                    "version": "The domain/protocol version."
                }
            },
            "registerRequestType(string,string)": {
                "params": {
                    "typeName": "The name of the request type.",
                    "typeSuffix": "Any extra data after the generic params. Must contain add at least one param. The generic ForwardRequest type is always registered by the constructor."
                }
            },
            "supportsInterface(bytes4)": {
                "details": "Returns true if this contract implements the interface defined by `interfaceId`. See the corresponding https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] to learn more about how these ids are created. This function call must use less than 30 000 gas."
            }
        },
        "version": 1
    },
    "userdoc": {
        "kind": "user",
        "methods": {
            "_getEncoded((address,address,uint256,uint256,uint256,bytes,uint256),bytes32,bytes)": {
                "notice": "Creates a byte array that is a valid ABI encoding of a request of a `RequestType` type. See `execute()`."
            },
            "execute((address,address,uint256,uint256,uint256,bytes,uint256),bytes32,bytes32,bytes,bytes)": {
                "notice": "Executes a transaction specified by the `ForwardRequest`. The transaction is first verified and then executed. The success flag and returned bytes array of the `CALL` are returned as-is. This method would revert only in case of a verification error. All the target errors are reported using the returned success flag and returned bytes array."
            },
            "registerDomainSeparator(string,string)": {
                "notice": "Register a new domain separator.This is necessary for the Forwarder to be able to verify the signatures conforming to the ERC-712.The domain separator must have the following fields: `name`, `version`, `chainId`, `verifyingContract`. The `chainId` is the current network's `chainId`, and the `verifyingContract` is this Forwarder's address. This method accepts the domain name and version to create and register the domain separator value."
            },
            "registerRequestType(string,string)": {
                "notice": "Register a new Request typehash.This is necessary for the Forwarder to be able to verify the signatures conforming to the ERC-712."
            },
            "verify((address,address,uint256,uint256,uint256,bytes,uint256),bytes32,bytes32,bytes,bytes)": {
                "notice": "Verify the transaction is valid and can be executed. Implementations must validate the signature and the nonce of the request are correct. Does not revert and returns successfully if the input is valid. Reverts if any validation has failed. For instance, if either signature or nonce are incorrect. Reverts if `domainSeparator` or `requestTypeHash` are not registered as well."
            }
        },
        "version": 1
    }
}
