{
  "contractName": "ECDSA",
  "abi": [],
  "metadata": "{\"compiler\":{\"version\":\"0.8.11+commit.d7f03943\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"details\":\"Elliptic Curve Digital Signature Algorithm (ECDSA) operations. These functions can be used to verify that a message was signed by the holder of the private keys of a given address.\",\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":\"ECDSA\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x32c202bd28995dd20c4347b7c6467a6d3241c74c8ad3edcbb610cd9205916c45\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8179c356adb19e70d6b31a1eedc8c5c7f0c00e669e2540f4099e3844c6074d30\",\"dweb:/ipfs/QmWFbivarEobbqhS1go64ootVuHfVohBseerYy9FTEd1W2\"]},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x3c07f43e60e099b3b157243b3152722e73b80eeb7985c2cd73712828d7f7da29\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://466ffb5a6e3bd65fffd996f9287ffd240ea21588a338c6efe143d94eaed014a7\",\"dweb:/ipfs/Qmans3vvPJZcvxe9KLAPc9Xwe4TFVTJdzaQGpi62Vrhoe2\"]}},\"version\":1}",
  "bytecode": "0x60566037600b82828239805160001a607314602a57634e487b7160e01b600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220de70ab4c4492107b4d16ccde527bdb1e63e4e7224c279b46954e4a5c9886059c64736f6c634300080b0033",
  "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600080fdfea2646970667358221220de70ab4c4492107b4d16ccde527bdb1e63e4e7224c279b46954e4a5c9886059c64736f6c634300080b0033",
  "immutableReferences": {},
  "generatedSources": [],
  "deployedGeneratedSources": [],
  "sourceMap": "369:8924:30:-:0;;;;;;;;;;;;;;;-1:-1:-1;;;369:8924:30;;;;;;;;;;;;;;;;;",
  "deployedSourceMap": "369:8924:30:-:0;;;;;;;;",
  "source": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n    enum RecoverError {\n        NoError,\n        InvalidSignature,\n        InvalidSignatureLength,\n        InvalidSignatureS,\n        InvalidSignatureV\n    }\n\n    function _throwError(RecoverError error) private pure {\n        if (error == RecoverError.NoError) {\n            return; // no error: do nothing\n        } else if (error == RecoverError.InvalidSignature) {\n            revert(\"ECDSA: invalid signature\");\n        } else if (error == RecoverError.InvalidSignatureLength) {\n            revert(\"ECDSA: invalid signature length\");\n        } else if (error == RecoverError.InvalidSignatureS) {\n            revert(\"ECDSA: invalid signature 's' value\");\n        } else if (error == RecoverError.InvalidSignatureV) {\n            revert(\"ECDSA: invalid signature 'v' value\");\n        }\n    }\n\n    /**\n     * @dev Returns the address that signed a hashed message (`hash`) with\n     * `signature` or error string. This address can then be used for verification purposes.\n     *\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n     * this function rejects them by requiring the `s` value to be in the lower\n     * half order, and the `v` value to be either 27 or 28.\n     *\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n     * verification to be secure: it is possible to craft signatures that\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n     * this is by receiving a hash of the original message (which may otherwise\n     * be too long), and then calling {toEthSignedMessageHash} on it.\n     *\n     * Documentation for signature generation:\n     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n     *\n     * _Available since v4.3._\n     */\n    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n        // Check the signature length\n        // - case 65: r,s,v signature (standard)\n        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._\n        if (signature.length == 65) {\n            bytes32 r;\n            bytes32 s;\n            uint8 v;\n            // ecrecover takes the signature parameters, and the only way to get them\n            // currently is to use assembly.\n            assembly {\n                r := mload(add(signature, 0x20))\n                s := mload(add(signature, 0x40))\n                v := byte(0, mload(add(signature, 0x60)))\n            }\n            return tryRecover(hash, v, r, s);\n        } else if (signature.length == 64) {\n            bytes32 r;\n            bytes32 vs;\n            // ecrecover takes the signature parameters, and the only way to get them\n            // currently is to use assembly.\n            assembly {\n                r := mload(add(signature, 0x20))\n                vs := mload(add(signature, 0x40))\n            }\n            return tryRecover(hash, r, vs);\n        } else {\n            return (address(0), RecoverError.InvalidSignatureLength);\n        }\n    }\n\n    /**\n     * @dev Returns the address that signed a hashed message (`hash`) with\n     * `signature`. This address can then be used for verification purposes.\n     *\n     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n     * this function rejects them by requiring the `s` value to be in the lower\n     * half order, and the `v` value to be either 27 or 28.\n     *\n     * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n     * verification to be secure: it is possible to craft signatures that\n     * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n     * this is by receiving a hash of the original message (which may otherwise\n     * be too long), and then calling {toEthSignedMessageHash} on it.\n     */\n    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n        (address recovered, RecoverError error) = tryRecover(hash, signature);\n        _throwError(error);\n        return recovered;\n    }\n\n    /**\n     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n     *\n     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n     *\n     * _Available since v4.3._\n     */\n    function tryRecover(\n        bytes32 hash,\n        bytes32 r,\n        bytes32 vs\n    ) internal pure returns (address, RecoverError) {\n        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n        uint8 v = uint8((uint256(vs) >> 255) + 27);\n        return tryRecover(hash, v, r, s);\n    }\n\n    /**\n     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n     *\n     * _Available since v4.2._\n     */\n    function recover(\n        bytes32 hash,\n        bytes32 r,\n        bytes32 vs\n    ) internal pure returns (address) {\n        (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n        _throwError(error);\n        return recovered;\n    }\n\n    /**\n     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n     * `r` and `s` signature fields separately.\n     *\n     * _Available since v4.3._\n     */\n    function tryRecover(\n        bytes32 hash,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) internal pure returns (address, RecoverError) {\n        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n        // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n        //\n        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n        // these malleable signatures as well.\n        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n            return (address(0), RecoverError.InvalidSignatureS);\n        }\n        if (v != 27 && v != 28) {\n            return (address(0), RecoverError.InvalidSignatureV);\n        }\n\n        // If the signature is valid (and not malleable), return the signer address\n        address signer = ecrecover(hash, v, r, s);\n        if (signer == address(0)) {\n            return (address(0), RecoverError.InvalidSignature);\n        }\n\n        return (signer, RecoverError.NoError);\n    }\n\n    /**\n     * @dev Overload of {ECDSA-recover} that receives the `v`,\n     * `r` and `s` signature fields separately.\n     */\n    function recover(\n        bytes32 hash,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) internal pure returns (address) {\n        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n        _throwError(error);\n        return recovered;\n    }\n\n    /**\n     * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n     * produces hash corresponding to the one signed with the\n     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n     * JSON-RPC method as part of EIP-191.\n     *\n     * See {recover}.\n     */\n    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {\n        // 32 is the length in bytes of hash,\n        // enforced by the type signature above\n        return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n32\", hash));\n    }\n\n    /**\n     * @dev Returns an Ethereum Signed Message, created from `s`. This\n     * produces hash corresponding to the one signed with the\n     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n     * JSON-RPC method as part of EIP-191.\n     *\n     * See {recover}.\n     */\n    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n        return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n    }\n\n    /**\n     * @dev Returns an Ethereum Signed Typed Data, created from a\n     * `domainSeparator` and a `structHash`. This produces hash corresponding\n     * to the one signed with the\n     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n     * JSON-RPC method as part of EIP-712.\n     *\n     * See {recover}.\n     */\n    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {\n        return keccak256(abi.encodePacked(\"\\x19\\x01\", domainSeparator, structHash));\n    }\n}\n",
  "sourcePath": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol",
  "ast": {
    "absolutePath": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol",
    "exportedSymbols": {
      "ECDSA": [
        5981
      ],
      "Strings": [
        5574
      ]
    },
    "id": 5982,
    "license": "MIT",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 5576,
        "literals": [
          "solidity",
          "^",
          "0.8",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "112:23:30"
      },
      {
        "absolutePath": "@openzeppelin/contracts/utils/Strings.sol",
        "file": "../Strings.sol",
        "id": 5577,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 5982,
        "sourceUnit": 5575,
        "src": "137:24:30",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [],
        "canonicalName": "ECDSA",
        "contractDependencies": [],
        "contractKind": "library",
        "documentation": {
          "id": 5578,
          "nodeType": "StructuredDocumentation",
          "src": "163:205:30",
          "text": " @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n These functions can be used to verify that a message was signed by the holder\n of the private keys of a given address."
        },
        "fullyImplemented": true,
        "id": 5981,
        "linearizedBaseContracts": [
          5981
        ],
        "name": "ECDSA",
        "nameLocation": "377:5:30",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "canonicalName": "ECDSA.RecoverError",
            "id": 5584,
            "members": [
              {
                "id": 5579,
                "name": "NoError",
                "nameLocation": "417:7:30",
                "nodeType": "EnumValue",
                "src": "417:7:30"
              },
              {
                "id": 5580,
                "name": "InvalidSignature",
                "nameLocation": "434:16:30",
                "nodeType": "EnumValue",
                "src": "434:16:30"
              },
              {
                "id": 5581,
                "name": "InvalidSignatureLength",
                "nameLocation": "460:22:30",
                "nodeType": "EnumValue",
                "src": "460:22:30"
              },
              {
                "id": 5582,
                "name": "InvalidSignatureS",
                "nameLocation": "492:17:30",
                "nodeType": "EnumValue",
                "src": "492:17:30"
              },
              {
                "id": 5583,
                "name": "InvalidSignatureV",
                "nameLocation": "519:17:30",
                "nodeType": "EnumValue",
                "src": "519:17:30"
              }
            ],
            "name": "RecoverError",
            "nameLocation": "394:12:30",
            "nodeType": "EnumDefinition",
            "src": "389:153:30"
          },
          {
            "body": {
              "id": 5637,
              "nodeType": "Block",
              "src": "602:577:30",
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_enum$_RecoverError_$5584",
                      "typeString": "enum ECDSA.RecoverError"
                    },
                    "id": 5593,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 5590,
                      "name": "error",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5587,
                      "src": "616:5:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_enum$_RecoverError_$5584",
                        "typeString": "enum ECDSA.RecoverError"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "expression": {
                        "id": 5591,
                        "name": "RecoverError",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5584,
                        "src": "625:12:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_enum$_RecoverError_$5584_$",
                          "typeString": "type(enum ECDSA.RecoverError)"
                        }
                      },
                      "id": 5592,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "NoError",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 5579,
                      "src": "625:20:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_enum$_RecoverError_$5584",
                        "typeString": "enum ECDSA.RecoverError"
                      }
                    },
                    "src": "616:29:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "condition": {
                      "commonType": {
                        "typeIdentifier": "t_enum$_RecoverError_$5584",
                        "typeString": "enum ECDSA.RecoverError"
                      },
                      "id": 5599,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "id": 5596,
                        "name": "error",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5587,
                        "src": "712:5:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "==",
                      "rightExpression": {
                        "expression": {
                          "id": 5597,
                          "name": "RecoverError",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5584,
                          "src": "721:12:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_enum$_RecoverError_$5584_$",
                            "typeString": "type(enum ECDSA.RecoverError)"
                          }
                        },
                        "id": 5598,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "memberName": "InvalidSignature",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 5580,
                        "src": "721:29:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      },
                      "src": "712:38:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "falseBody": {
                      "condition": {
                        "commonType": {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        },
                        "id": 5608,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 5605,
                          "name": "error",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5587,
                          "src": "821:5:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_enum$_RecoverError_$5584",
                            "typeString": "enum ECDSA.RecoverError"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "expression": {
                            "id": 5606,
                            "name": "RecoverError",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5584,
                            "src": "830:12:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_enum$_RecoverError_$5584_$",
                              "typeString": "type(enum ECDSA.RecoverError)"
                            }
                          },
                          "id": 5607,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberName": "InvalidSignatureLength",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 5581,
                          "src": "830:35:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_enum$_RecoverError_$5584",
                            "typeString": "enum ECDSA.RecoverError"
                          }
                        },
                        "src": "821:44:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "falseBody": {
                        "condition": {
                          "commonType": {
                            "typeIdentifier": "t_enum$_RecoverError_$5584",
                            "typeString": "enum ECDSA.RecoverError"
                          },
                          "id": 5617,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 5614,
                            "name": "error",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5587,
                            "src": "943:5:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_enum$_RecoverError_$5584",
                              "typeString": "enum ECDSA.RecoverError"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "expression": {
                              "id": 5615,
                              "name": "RecoverError",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5584,
                              "src": "952:12:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_enum$_RecoverError_$5584_$",
                                "typeString": "type(enum ECDSA.RecoverError)"
                              }
                            },
                            "id": 5616,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "memberName": "InvalidSignatureS",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5582,
                            "src": "952:30:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_enum$_RecoverError_$5584",
                              "typeString": "enum ECDSA.RecoverError"
                            }
                          },
                          "src": "943:39:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "condition": {
                            "commonType": {
                              "typeIdentifier": "t_enum$_RecoverError_$5584",
                              "typeString": "enum ECDSA.RecoverError"
                            },
                            "id": 5626,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "id": 5623,
                              "name": "error",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5587,
                              "src": "1063:5:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_enum$_RecoverError_$5584",
                                "typeString": "enum ECDSA.RecoverError"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "==",
                            "rightExpression": {
                              "expression": {
                                "id": 5624,
                                "name": "RecoverError",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5584,
                                "src": "1072:12:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_enum$_RecoverError_$5584_$",
                                  "typeString": "type(enum ECDSA.RecoverError)"
                                }
                              },
                              "id": 5625,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "memberName": "InvalidSignatureV",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5583,
                              "src": "1072:30:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_enum$_RecoverError_$5584",
                                "typeString": "enum ECDSA.RecoverError"
                              }
                            },
                            "src": "1063:39:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "id": 5632,
                          "nodeType": "IfStatement",
                          "src": "1059:114:30",
                          "trueBody": {
                            "id": 5631,
                            "nodeType": "Block",
                            "src": "1104:69:30",
                            "statements": [
                              {
                                "expression": {
                                  "arguments": [
                                    {
                                      "hexValue": "45434453413a20696e76616c6964207369676e6174757265202776272076616c7565",
                                      "id": 5628,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "string",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "1125:36:30",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_stringliteral_8522ee1b53216f595394db8e80a64d9e7d9bd512c0811c18debe9f40858597e4",
                                        "typeString": "literal_string \"ECDSA: invalid signature 'v' value\""
                                      },
                                      "value": "ECDSA: invalid signature 'v' value"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_stringliteral_8522ee1b53216f595394db8e80a64d9e7d9bd512c0811c18debe9f40858597e4",
                                        "typeString": "literal_string \"ECDSA: invalid signature 'v' value\""
                                      }
                                    ],
                                    "id": 5627,
                                    "name": "revert",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [
                                      4294967277,
                                      4294967277
                                    ],
                                    "referencedDeclaration": 4294967277,
                                    "src": "1118:6:30",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$",
                                      "typeString": "function (string memory) pure"
                                    }
                                  },
                                  "id": 5629,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "1118:44:30",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_tuple$__$",
                                    "typeString": "tuple()"
                                  }
                                },
                                "id": 5630,
                                "nodeType": "ExpressionStatement",
                                "src": "1118:44:30"
                              }
                            ]
                          }
                        },
                        "id": 5633,
                        "nodeType": "IfStatement",
                        "src": "939:234:30",
                        "trueBody": {
                          "id": 5622,
                          "nodeType": "Block",
                          "src": "984:69:30",
                          "statements": [
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "hexValue": "45434453413a20696e76616c6964207369676e6174757265202773272076616c7565",
                                    "id": 5619,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "1005:36:30",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd",
                                      "typeString": "literal_string \"ECDSA: invalid signature 's' value\""
                                    },
                                    "value": "ECDSA: invalid signature 's' value"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd",
                                      "typeString": "literal_string \"ECDSA: invalid signature 's' value\""
                                    }
                                  ],
                                  "id": 5618,
                                  "name": "revert",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    4294967277,
                                    4294967277
                                  ],
                                  "referencedDeclaration": 4294967277,
                                  "src": "998:6:30",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (string memory) pure"
                                  }
                                },
                                "id": 5620,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "998:44:30",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 5621,
                              "nodeType": "ExpressionStatement",
                              "src": "998:44:30"
                            }
                          ]
                        }
                      },
                      "id": 5634,
                      "nodeType": "IfStatement",
                      "src": "817:356:30",
                      "trueBody": {
                        "id": 5613,
                        "nodeType": "Block",
                        "src": "867:66:30",
                        "statements": [
                          {
                            "expression": {
                              "arguments": [
                                {
                                  "hexValue": "45434453413a20696e76616c6964207369676e6174757265206c656e677468",
                                  "id": 5610,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "888:33:30",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77",
                                    "typeString": "literal_string \"ECDSA: invalid signature length\""
                                  },
                                  "value": "ECDSA: invalid signature length"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77",
                                    "typeString": "literal_string \"ECDSA: invalid signature length\""
                                  }
                                ],
                                "id": 5609,
                                "name": "revert",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [
                                  4294967277,
                                  4294967277
                                ],
                                "referencedDeclaration": 4294967277,
                                "src": "881:6:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$",
                                  "typeString": "function (string memory) pure"
                                }
                              },
                              "id": 5611,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "881:41:30",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_tuple$__$",
                                "typeString": "tuple()"
                              }
                            },
                            "id": 5612,
                            "nodeType": "ExpressionStatement",
                            "src": "881:41:30"
                          }
                        ]
                      }
                    },
                    "id": 5635,
                    "nodeType": "IfStatement",
                    "src": "708:465:30",
                    "trueBody": {
                      "id": 5604,
                      "nodeType": "Block",
                      "src": "752:59:30",
                      "statements": [
                        {
                          "expression": {
                            "arguments": [
                              {
                                "hexValue": "45434453413a20696e76616c6964207369676e6174757265",
                                "id": 5601,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "string",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "773:26:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be",
                                  "typeString": "literal_string \"ECDSA: invalid signature\""
                                },
                                "value": "ECDSA: invalid signature"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be",
                                  "typeString": "literal_string \"ECDSA: invalid signature\""
                                }
                              ],
                              "id": 5600,
                              "name": "revert",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [
                                4294967277,
                                4294967277
                              ],
                              "referencedDeclaration": 4294967277,
                              "src": "766:6:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$",
                                "typeString": "function (string memory) pure"
                              }
                            },
                            "id": 5602,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "766:34:30",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$__$",
                              "typeString": "tuple()"
                            }
                          },
                          "id": 5603,
                          "nodeType": "ExpressionStatement",
                          "src": "766:34:30"
                        }
                      ]
                    }
                  },
                  "id": 5636,
                  "nodeType": "IfStatement",
                  "src": "612:561:30",
                  "trueBody": {
                    "id": 5595,
                    "nodeType": "Block",
                    "src": "647:55:30",
                    "statements": [
                      {
                        "functionReturnParameters": 5589,
                        "id": 5594,
                        "nodeType": "Return",
                        "src": "661:7:30"
                      }
                    ]
                  }
                }
              ]
            },
            "id": 5638,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_throwError",
            "nameLocation": "557:11:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5588,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5587,
                  "mutability": "mutable",
                  "name": "error",
                  "nameLocation": "582:5:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5638,
                  "src": "569:18:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_enum$_RecoverError_$5584",
                    "typeString": "enum ECDSA.RecoverError"
                  },
                  "typeName": {
                    "id": 5586,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 5585,
                      "name": "RecoverError",
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 5584,
                      "src": "569:12:30"
                    },
                    "referencedDeclaration": 5584,
                    "src": "569:12:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_enum$_RecoverError_$5584",
                      "typeString": "enum ECDSA.RecoverError"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "568:20:30"
            },
            "returnParameters": {
              "id": 5589,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "602:0:30"
            },
            "scope": 5981,
            "src": "548:631:30",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "private"
          },
          {
            "body": {
              "id": 5702,
              "nodeType": "Block",
              "src": "2347:1175:30",
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 5654,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 5651,
                        "name": "signature",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5643,
                        "src": "2554:9:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      },
                      "id": 5652,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "src": "2554:16:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "hexValue": "3635",
                      "id": 5653,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2574:2:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_65_by_1",
                        "typeString": "int_const 65"
                      },
                      "value": "65"
                    },
                    "src": "2554:22:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "condition": {
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 5676,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "expression": {
                          "id": 5673,
                          "name": "signature",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5643,
                          "src": "3036:9:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "id": 5674,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "length",
                        "nodeType": "MemberAccess",
                        "src": "3036:16:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "==",
                      "rightExpression": {
                        "hexValue": "3634",
                        "id": 5675,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "3056:2:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_64_by_1",
                          "typeString": "int_const 64"
                        },
                        "value": "64"
                      },
                      "src": "3036:22:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "falseBody": {
                      "id": 5699,
                      "nodeType": "Block",
                      "src": "3435:81:30",
                      "statements": [
                        {
                          "expression": {
                            "components": [
                              {
                                "arguments": [
                                  {
                                    "hexValue": "30",
                                    "id": 5693,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "3465:1:30",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 5692,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "3457:7:30",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 5691,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "3457:7:30",
                                    "typeDescriptions": {}
                                  }
                                },
                                "id": 5694,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "3457:10:30",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              {
                                "expression": {
                                  "id": 5695,
                                  "name": "RecoverError",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5584,
                                  "src": "3469:12:30",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_enum$_RecoverError_$5584_$",
                                    "typeString": "type(enum ECDSA.RecoverError)"
                                  }
                                },
                                "id": 5696,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "InvalidSignatureLength",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 5581,
                                "src": "3469:35:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_enum$_RecoverError_$5584",
                                  "typeString": "enum ECDSA.RecoverError"
                                }
                              }
                            ],
                            "id": 5697,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "3456:49:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                              "typeString": "tuple(address,enum ECDSA.RecoverError)"
                            }
                          },
                          "functionReturnParameters": 5650,
                          "id": 5698,
                          "nodeType": "Return",
                          "src": "3449:56:30"
                        }
                      ]
                    },
                    "id": 5700,
                    "nodeType": "IfStatement",
                    "src": "3032:484:30",
                    "trueBody": {
                      "id": 5690,
                      "nodeType": "Block",
                      "src": "3060:369:30",
                      "statements": [
                        {
                          "assignments": [
                            5678
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 5678,
                              "mutability": "mutable",
                              "name": "r",
                              "nameLocation": "3082:1:30",
                              "nodeType": "VariableDeclaration",
                              "scope": 5690,
                              "src": "3074:9:30",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              "typeName": {
                                "id": 5677,
                                "name": "bytes32",
                                "nodeType": "ElementaryTypeName",
                                "src": "3074:7:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "visibility": "internal"
                            }
                          ],
                          "id": 5679,
                          "nodeType": "VariableDeclarationStatement",
                          "src": "3074:9:30"
                        },
                        {
                          "assignments": [
                            5681
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 5681,
                              "mutability": "mutable",
                              "name": "vs",
                              "nameLocation": "3105:2:30",
                              "nodeType": "VariableDeclaration",
                              "scope": 5690,
                              "src": "3097:10:30",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              "typeName": {
                                "id": 5680,
                                "name": "bytes32",
                                "nodeType": "ElementaryTypeName",
                                "src": "3097:7:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "visibility": "internal"
                            }
                          ],
                          "id": 5682,
                          "nodeType": "VariableDeclarationStatement",
                          "src": "3097:10:30"
                        },
                        {
                          "AST": {
                            "nodeType": "YulBlock",
                            "src": "3261:114:30",
                            "statements": [
                              {
                                "nodeType": "YulAssignment",
                                "src": "3279:32:30",
                                "value": {
                                  "arguments": [
                                    {
                                      "arguments": [
                                        {
                                          "name": "signature",
                                          "nodeType": "YulIdentifier",
                                          "src": "3294:9:30"
                                        },
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "3305:4:30",
                                          "type": "",
                                          "value": "0x20"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "add",
                                        "nodeType": "YulIdentifier",
                                        "src": "3290:3:30"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "3290:20:30"
                                    }
                                  ],
                                  "functionName": {
                                    "name": "mload",
                                    "nodeType": "YulIdentifier",
                                    "src": "3284:5:30"
                                  },
                                  "nodeType": "YulFunctionCall",
                                  "src": "3284:27:30"
                                },
                                "variableNames": [
                                  {
                                    "name": "r",
                                    "nodeType": "YulIdentifier",
                                    "src": "3279:1:30"
                                  }
                                ]
                              },
                              {
                                "nodeType": "YulAssignment",
                                "src": "3328:33:30",
                                "value": {
                                  "arguments": [
                                    {
                                      "arguments": [
                                        {
                                          "name": "signature",
                                          "nodeType": "YulIdentifier",
                                          "src": "3344:9:30"
                                        },
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "3355:4:30",
                                          "type": "",
                                          "value": "0x40"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "add",
                                        "nodeType": "YulIdentifier",
                                        "src": "3340:3:30"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "3340:20:30"
                                    }
                                  ],
                                  "functionName": {
                                    "name": "mload",
                                    "nodeType": "YulIdentifier",
                                    "src": "3334:5:30"
                                  },
                                  "nodeType": "YulFunctionCall",
                                  "src": "3334:27:30"
                                },
                                "variableNames": [
                                  {
                                    "name": "vs",
                                    "nodeType": "YulIdentifier",
                                    "src": "3328:2:30"
                                  }
                                ]
                              }
                            ]
                          },
                          "evmVersion": "london",
                          "externalReferences": [
                            {
                              "declaration": 5678,
                              "isOffset": false,
                              "isSlot": false,
                              "src": "3279:1:30",
                              "valueSize": 1
                            },
                            {
                              "declaration": 5643,
                              "isOffset": false,
                              "isSlot": false,
                              "src": "3294:9:30",
                              "valueSize": 1
                            },
                            {
                              "declaration": 5643,
                              "isOffset": false,
                              "isSlot": false,
                              "src": "3344:9:30",
                              "valueSize": 1
                            },
                            {
                              "declaration": 5681,
                              "isOffset": false,
                              "isSlot": false,
                              "src": "3328:2:30",
                              "valueSize": 1
                            }
                          ],
                          "id": 5683,
                          "nodeType": "InlineAssembly",
                          "src": "3252:123:30"
                        },
                        {
                          "expression": {
                            "arguments": [
                              {
                                "id": 5685,
                                "name": "hash",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5641,
                                "src": "3406:4:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              {
                                "id": 5686,
                                "name": "r",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5678,
                                "src": "3412:1:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              {
                                "id": 5687,
                                "name": "vs",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5681,
                                "src": "3415:2:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                },
                                {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                },
                                {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              ],
                              "id": 5684,
                              "name": "tryRecover",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [
                                5703,
                                5777,
                                5888
                              ],
                              "referencedDeclaration": 5777,
                              "src": "3395:10:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$5584_$",
                                "typeString": "function (bytes32,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError)"
                              }
                            },
                            "id": 5688,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "3395:23:30",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                              "typeString": "tuple(address,enum ECDSA.RecoverError)"
                            }
                          },
                          "functionReturnParameters": 5650,
                          "id": 5689,
                          "nodeType": "Return",
                          "src": "3388:30:30"
                        }
                      ]
                    }
                  },
                  "id": 5701,
                  "nodeType": "IfStatement",
                  "src": "2550:966:30",
                  "trueBody": {
                    "id": 5672,
                    "nodeType": "Block",
                    "src": "2578:448:30",
                    "statements": [
                      {
                        "assignments": [
                          5656
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5656,
                            "mutability": "mutable",
                            "name": "r",
                            "nameLocation": "2600:1:30",
                            "nodeType": "VariableDeclaration",
                            "scope": 5672,
                            "src": "2592:9:30",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            "typeName": {
                              "id": 5655,
                              "name": "bytes32",
                              "nodeType": "ElementaryTypeName",
                              "src": "2592:7:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 5657,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2592:9:30"
                      },
                      {
                        "assignments": [
                          5659
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5659,
                            "mutability": "mutable",
                            "name": "s",
                            "nameLocation": "2623:1:30",
                            "nodeType": "VariableDeclaration",
                            "scope": 5672,
                            "src": "2615:9:30",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            "typeName": {
                              "id": 5658,
                              "name": "bytes32",
                              "nodeType": "ElementaryTypeName",
                              "src": "2615:7:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 5660,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2615:9:30"
                      },
                      {
                        "assignments": [
                          5662
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5662,
                            "mutability": "mutable",
                            "name": "v",
                            "nameLocation": "2644:1:30",
                            "nodeType": "VariableDeclaration",
                            "scope": 5672,
                            "src": "2638:7:30",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            },
                            "typeName": {
                              "id": 5661,
                              "name": "uint8",
                              "nodeType": "ElementaryTypeName",
                              "src": "2638:5:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 5663,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2638:7:30"
                      },
                      {
                        "AST": {
                          "nodeType": "YulBlock",
                          "src": "2799:171:30",
                          "statements": [
                            {
                              "nodeType": "YulAssignment",
                              "src": "2817:32:30",
                              "value": {
                                "arguments": [
                                  {
                                    "arguments": [
                                      {
                                        "name": "signature",
                                        "nodeType": "YulIdentifier",
                                        "src": "2832:9:30"
                                      },
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "2843:4:30",
                                        "type": "",
                                        "value": "0x20"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "add",
                                      "nodeType": "YulIdentifier",
                                      "src": "2828:3:30"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "2828:20:30"
                                  }
                                ],
                                "functionName": {
                                  "name": "mload",
                                  "nodeType": "YulIdentifier",
                                  "src": "2822:5:30"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "2822:27:30"
                              },
                              "variableNames": [
                                {
                                  "name": "r",
                                  "nodeType": "YulIdentifier",
                                  "src": "2817:1:30"
                                }
                              ]
                            },
                            {
                              "nodeType": "YulAssignment",
                              "src": "2866:32:30",
                              "value": {
                                "arguments": [
                                  {
                                    "arguments": [
                                      {
                                        "name": "signature",
                                        "nodeType": "YulIdentifier",
                                        "src": "2881:9:30"
                                      },
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "2892:4:30",
                                        "type": "",
                                        "value": "0x40"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "add",
                                      "nodeType": "YulIdentifier",
                                      "src": "2877:3:30"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "2877:20:30"
                                  }
                                ],
                                "functionName": {
                                  "name": "mload",
                                  "nodeType": "YulIdentifier",
                                  "src": "2871:5:30"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "2871:27:30"
                              },
                              "variableNames": [
                                {
                                  "name": "s",
                                  "nodeType": "YulIdentifier",
                                  "src": "2866:1:30"
                                }
                              ]
                            },
                            {
                              "nodeType": "YulAssignment",
                              "src": "2915:41:30",
                              "value": {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "2925:1:30",
                                    "type": "",
                                    "value": "0"
                                  },
                                  {
                                    "arguments": [
                                      {
                                        "arguments": [
                                          {
                                            "name": "signature",
                                            "nodeType": "YulIdentifier",
                                            "src": "2938:9:30"
                                          },
                                          {
                                            "kind": "number",
                                            "nodeType": "YulLiteral",
                                            "src": "2949:4:30",
                                            "type": "",
                                            "value": "0x60"
                                          }
                                        ],
                                        "functionName": {
                                          "name": "add",
                                          "nodeType": "YulIdentifier",
                                          "src": "2934:3:30"
                                        },
                                        "nodeType": "YulFunctionCall",
                                        "src": "2934:20:30"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "mload",
                                      "nodeType": "YulIdentifier",
                                      "src": "2928:5:30"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "2928:27:30"
                                  }
                                ],
                                "functionName": {
                                  "name": "byte",
                                  "nodeType": "YulIdentifier",
                                  "src": "2920:4:30"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "2920:36:30"
                              },
                              "variableNames": [
                                {
                                  "name": "v",
                                  "nodeType": "YulIdentifier",
                                  "src": "2915:1:30"
                                }
                              ]
                            }
                          ]
                        },
                        "evmVersion": "london",
                        "externalReferences": [
                          {
                            "declaration": 5656,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "2817:1:30",
                            "valueSize": 1
                          },
                          {
                            "declaration": 5659,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "2866:1:30",
                            "valueSize": 1
                          },
                          {
                            "declaration": 5643,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "2832:9:30",
                            "valueSize": 1
                          },
                          {
                            "declaration": 5643,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "2881:9:30",
                            "valueSize": 1
                          },
                          {
                            "declaration": 5643,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "2938:9:30",
                            "valueSize": 1
                          },
                          {
                            "declaration": 5662,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "2915:1:30",
                            "valueSize": 1
                          }
                        ],
                        "id": 5664,
                        "nodeType": "InlineAssembly",
                        "src": "2790:180:30"
                      },
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 5666,
                              "name": "hash",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5641,
                              "src": "3001:4:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "id": 5667,
                              "name": "v",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5662,
                              "src": "3007:1:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "id": 5668,
                              "name": "r",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5656,
                              "src": "3010:1:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "id": 5669,
                              "name": "s",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5659,
                              "src": "3013:1:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "id": 5665,
                            "name": "tryRecover",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              5703,
                              5777,
                              5888
                            ],
                            "referencedDeclaration": 5888,
                            "src": "2990:10:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$5584_$",
                              "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError)"
                            }
                          },
                          "id": 5670,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2990:25:30",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                            "typeString": "tuple(address,enum ECDSA.RecoverError)"
                          }
                        },
                        "functionReturnParameters": 5650,
                        "id": 5671,
                        "nodeType": "Return",
                        "src": "2983:32:30"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 5639,
              "nodeType": "StructuredDocumentation",
              "src": "1185:1053:30",
              "text": " @dev Returns the address that signed a hashed message (`hash`) with\n `signature` or error string. This address can then be used for verification purposes.\n The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n this function rejects them by requiring the `s` value to be in the lower\n half order, and the `v` value to be either 27 or 28.\n IMPORTANT: `hash` _must_ be the result of a hash operation for the\n verification to be secure: it is possible to craft signatures that\n recover to arbitrary addresses for non-hashed data. A safe way to ensure\n this is by receiving a hash of the original message (which may otherwise\n be too long), and then calling {toEthSignedMessageHash} on it.\n Documentation for signature generation:\n - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n _Available since v4.3._"
            },
            "id": 5703,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "tryRecover",
            "nameLocation": "2252:10:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5644,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5641,
                  "mutability": "mutable",
                  "name": "hash",
                  "nameLocation": "2271:4:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5703,
                  "src": "2263:12:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5640,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2263:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5643,
                  "mutability": "mutable",
                  "name": "signature",
                  "nameLocation": "2290:9:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5703,
                  "src": "2277:22:30",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 5642,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "2277:5:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2262:38:30"
            },
            "returnParameters": {
              "id": 5650,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5646,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5703,
                  "src": "2324:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5645,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2324:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5649,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5703,
                  "src": "2333:12:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_enum$_RecoverError_$5584",
                    "typeString": "enum ECDSA.RecoverError"
                  },
                  "typeName": {
                    "id": 5648,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 5647,
                      "name": "RecoverError",
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 5584,
                      "src": "2333:12:30"
                    },
                    "referencedDeclaration": 5584,
                    "src": "2333:12:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_enum$_RecoverError_$5584",
                      "typeString": "enum ECDSA.RecoverError"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2323:23:30"
            },
            "scope": 5981,
            "src": "2243:1279:30",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5729,
              "nodeType": "Block",
              "src": "4395:140:30",
              "statements": [
                {
                  "assignments": [
                    5714,
                    5717
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5714,
                      "mutability": "mutable",
                      "name": "recovered",
                      "nameLocation": "4414:9:30",
                      "nodeType": "VariableDeclaration",
                      "scope": 5729,
                      "src": "4406:17:30",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 5713,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "4406:7:30",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 5717,
                      "mutability": "mutable",
                      "name": "error",
                      "nameLocation": "4438:5:30",
                      "nodeType": "VariableDeclaration",
                      "scope": 5729,
                      "src": "4425:18:30",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_enum$_RecoverError_$5584",
                        "typeString": "enum ECDSA.RecoverError"
                      },
                      "typeName": {
                        "id": 5716,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 5715,
                          "name": "RecoverError",
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 5584,
                          "src": "4425:12:30"
                        },
                        "referencedDeclaration": 5584,
                        "src": "4425:12:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 5722,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 5719,
                        "name": "hash",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5706,
                        "src": "4458:4:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 5720,
                        "name": "signature",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5708,
                        "src": "4464:9:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 5718,
                      "name": "tryRecover",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5703,
                        5777,
                        5888
                      ],
                      "referencedDeclaration": 5703,
                      "src": "4447:10:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_address_$_t_enum$_RecoverError_$5584_$",
                        "typeString": "function (bytes32,bytes memory) pure returns (address,enum ECDSA.RecoverError)"
                      }
                    },
                    "id": 5721,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4447:27:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                      "typeString": "tuple(address,enum ECDSA.RecoverError)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4405:69:30"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 5724,
                        "name": "error",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5717,
                        "src": "4496:5:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      ],
                      "id": 5723,
                      "name": "_throwError",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5638,
                      "src": "4484:11:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_enum$_RecoverError_$5584_$returns$__$",
                        "typeString": "function (enum ECDSA.RecoverError) pure"
                      }
                    },
                    "id": 5725,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4484:18:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5726,
                  "nodeType": "ExpressionStatement",
                  "src": "4484:18:30"
                },
                {
                  "expression": {
                    "id": 5727,
                    "name": "recovered",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 5714,
                    "src": "4519:9:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 5712,
                  "id": 5728,
                  "nodeType": "Return",
                  "src": "4512:16:30"
                }
              ]
            },
            "documentation": {
              "id": 5704,
              "nodeType": "StructuredDocumentation",
              "src": "3528:775:30",
              "text": " @dev Returns the address that signed a hashed message (`hash`) with\n `signature`. This address can then be used for verification purposes.\n The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n this function rejects them by requiring the `s` value to be in the lower\n half order, and the `v` value to be either 27 or 28.\n IMPORTANT: `hash` _must_ be the result of a hash operation for the\n verification to be secure: it is possible to craft signatures that\n recover to arbitrary addresses for non-hashed data. A safe way to ensure\n this is by receiving a hash of the original message (which may otherwise\n be too long), and then calling {toEthSignedMessageHash} on it."
            },
            "id": 5730,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "recover",
            "nameLocation": "4317:7:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5709,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5706,
                  "mutability": "mutable",
                  "name": "hash",
                  "nameLocation": "4333:4:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5730,
                  "src": "4325:12:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5705,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4325:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5708,
                  "mutability": "mutable",
                  "name": "signature",
                  "nameLocation": "4352:9:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5730,
                  "src": "4339:22:30",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 5707,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "4339:5:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4324:38:30"
            },
            "returnParameters": {
              "id": 5712,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5711,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5730,
                  "src": "4386:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5710,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4386:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4385:9:30"
            },
            "scope": 5981,
            "src": "4308:227:30",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5776,
              "nodeType": "Block",
              "src": "4922:203:30",
              "statements": [
                {
                  "assignments": [
                    5746
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5746,
                      "mutability": "mutable",
                      "name": "s",
                      "nameLocation": "4940:1:30",
                      "nodeType": "VariableDeclaration",
                      "scope": 5776,
                      "src": "4932:9:30",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      },
                      "typeName": {
                        "id": 5745,
                        "name": "bytes32",
                        "nodeType": "ElementaryTypeName",
                        "src": "4932:7:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 5753,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    },
                    "id": 5752,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 5747,
                      "name": "vs",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5737,
                      "src": "4944:2:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "&",
                    "rightExpression": {
                      "arguments": [
                        {
                          "hexValue": "307837666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666",
                          "id": 5750,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "4957:66:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_57896044618658097711785492504343953926634992332820282019728792003956564819967_by_1",
                            "typeString": "int_const 5789...(69 digits omitted)...9967"
                          },
                          "value": "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_rational_57896044618658097711785492504343953926634992332820282019728792003956564819967_by_1",
                            "typeString": "int_const 5789...(69 digits omitted)...9967"
                          }
                        ],
                        "id": 5749,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "4949:7:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_bytes32_$",
                          "typeString": "type(bytes32)"
                        },
                        "typeName": {
                          "id": 5748,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "4949:7:30",
                          "typeDescriptions": {}
                        }
                      },
                      "id": 5751,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "4949:75:30",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "src": "4944:80:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4932:92:30"
                },
                {
                  "assignments": [
                    5755
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5755,
                      "mutability": "mutable",
                      "name": "v",
                      "nameLocation": "5040:1:30",
                      "nodeType": "VariableDeclaration",
                      "scope": 5776,
                      "src": "5034:7:30",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 5754,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "5034:5:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 5768,
                  "initialValue": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 5766,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "components": [
                            {
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 5763,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "arguments": [
                                  {
                                    "id": 5760,
                                    "name": "vs",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 5737,
                                    "src": "5059:2:30",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  ],
                                  "id": 5759,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "5051:7:30",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_uint256_$",
                                    "typeString": "type(uint256)"
                                  },
                                  "typeName": {
                                    "id": 5758,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "5051:7:30",
                                    "typeDescriptions": {}
                                  }
                                },
                                "id": 5761,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "5051:11:30",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">>",
                              "rightExpression": {
                                "hexValue": "323535",
                                "id": 5762,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "5066:3:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_255_by_1",
                                  "typeString": "int_const 255"
                                },
                                "value": "255"
                              },
                              "src": "5051:18:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 5764,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "5050:20:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "+",
                        "rightExpression": {
                          "hexValue": "3237",
                          "id": 5765,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "5073:2:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_27_by_1",
                            "typeString": "int_const 27"
                          },
                          "value": "27"
                        },
                        "src": "5050:25:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 5757,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "5044:5:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_uint8_$",
                        "typeString": "type(uint8)"
                      },
                      "typeName": {
                        "id": 5756,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "5044:5:30",
                        "typeDescriptions": {}
                      }
                    },
                    "id": 5767,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5044:32:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5034:42:30"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 5770,
                        "name": "hash",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5733,
                        "src": "5104:4:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 5771,
                        "name": "v",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5755,
                        "src": "5110:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 5772,
                        "name": "r",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5735,
                        "src": "5113:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 5773,
                        "name": "s",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5746,
                        "src": "5116:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      ],
                      "id": 5769,
                      "name": "tryRecover",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5703,
                        5777,
                        5888
                      ],
                      "referencedDeclaration": 5888,
                      "src": "5093:10:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$5584_$",
                        "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError)"
                      }
                    },
                    "id": 5774,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5093:25:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                      "typeString": "tuple(address,enum ECDSA.RecoverError)"
                    }
                  },
                  "functionReturnParameters": 5744,
                  "id": 5775,
                  "nodeType": "Return",
                  "src": "5086:32:30"
                }
              ]
            },
            "documentation": {
              "id": 5731,
              "nodeType": "StructuredDocumentation",
              "src": "4541:243:30",
              "text": " @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n _Available since v4.3._"
            },
            "id": 5777,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "tryRecover",
            "nameLocation": "4798:10:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5738,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5733,
                  "mutability": "mutable",
                  "name": "hash",
                  "nameLocation": "4826:4:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5777,
                  "src": "4818:12:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5732,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4818:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5735,
                  "mutability": "mutable",
                  "name": "r",
                  "nameLocation": "4848:1:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5777,
                  "src": "4840:9:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5734,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4840:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5737,
                  "mutability": "mutable",
                  "name": "vs",
                  "nameLocation": "4867:2:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5777,
                  "src": "4859:10:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5736,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4859:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4808:67:30"
            },
            "returnParameters": {
              "id": 5744,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5740,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5777,
                  "src": "4899:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5739,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4899:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5743,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5777,
                  "src": "4908:12:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_enum$_RecoverError_$5584",
                    "typeString": "enum ECDSA.RecoverError"
                  },
                  "typeName": {
                    "id": 5742,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 5741,
                      "name": "RecoverError",
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 5584,
                      "src": "4908:12:30"
                    },
                    "referencedDeclaration": 5584,
                    "src": "4908:12:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_enum$_RecoverError_$5584",
                      "typeString": "enum ECDSA.RecoverError"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4898:23:30"
            },
            "scope": 5981,
            "src": "4789:336:30",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5806,
              "nodeType": "Block",
              "src": "5406:136:30",
              "statements": [
                {
                  "assignments": [
                    5790,
                    5793
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5790,
                      "mutability": "mutable",
                      "name": "recovered",
                      "nameLocation": "5425:9:30",
                      "nodeType": "VariableDeclaration",
                      "scope": 5806,
                      "src": "5417:17:30",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 5789,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "5417:7:30",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 5793,
                      "mutability": "mutable",
                      "name": "error",
                      "nameLocation": "5449:5:30",
                      "nodeType": "VariableDeclaration",
                      "scope": 5806,
                      "src": "5436:18:30",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_enum$_RecoverError_$5584",
                        "typeString": "enum ECDSA.RecoverError"
                      },
                      "typeName": {
                        "id": 5792,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 5791,
                          "name": "RecoverError",
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 5584,
                          "src": "5436:12:30"
                        },
                        "referencedDeclaration": 5584,
                        "src": "5436:12:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 5799,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 5795,
                        "name": "hash",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5780,
                        "src": "5469:4:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 5796,
                        "name": "r",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5782,
                        "src": "5475:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 5797,
                        "name": "vs",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5784,
                        "src": "5478:2:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      ],
                      "id": 5794,
                      "name": "tryRecover",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5703,
                        5777,
                        5888
                      ],
                      "referencedDeclaration": 5777,
                      "src": "5458:10:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$5584_$",
                        "typeString": "function (bytes32,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError)"
                      }
                    },
                    "id": 5798,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5458:23:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                      "typeString": "tuple(address,enum ECDSA.RecoverError)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5416:65:30"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 5801,
                        "name": "error",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5793,
                        "src": "5503:5:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      ],
                      "id": 5800,
                      "name": "_throwError",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5638,
                      "src": "5491:11:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_enum$_RecoverError_$5584_$returns$__$",
                        "typeString": "function (enum ECDSA.RecoverError) pure"
                      }
                    },
                    "id": 5802,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5491:18:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5803,
                  "nodeType": "ExpressionStatement",
                  "src": "5491:18:30"
                },
                {
                  "expression": {
                    "id": 5804,
                    "name": "recovered",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 5790,
                    "src": "5526:9:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 5788,
                  "id": 5805,
                  "nodeType": "Return",
                  "src": "5519:16:30"
                }
              ]
            },
            "documentation": {
              "id": 5778,
              "nodeType": "StructuredDocumentation",
              "src": "5131:154:30",
              "text": " @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n _Available since v4.2._"
            },
            "id": 5807,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "recover",
            "nameLocation": "5299:7:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5785,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5780,
                  "mutability": "mutable",
                  "name": "hash",
                  "nameLocation": "5324:4:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5807,
                  "src": "5316:12:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5779,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5316:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5782,
                  "mutability": "mutable",
                  "name": "r",
                  "nameLocation": "5346:1:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5807,
                  "src": "5338:9:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5781,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5338:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5784,
                  "mutability": "mutable",
                  "name": "vs",
                  "nameLocation": "5365:2:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5807,
                  "src": "5357:10:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5783,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5357:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5306:67:30"
            },
            "returnParameters": {
              "id": 5788,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5787,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5807,
                  "src": "5397:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5786,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5397:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5396:9:30"
            },
            "scope": 5981,
            "src": "5290:252:30",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5887,
              "nodeType": "Block",
              "src": "5865:1454:30",
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 5829,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "arguments": [
                        {
                          "id": 5826,
                          "name": "s",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5816,
                          "src": "6761:1:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        ],
                        "id": 5825,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "6753:7:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_uint256_$",
                          "typeString": "type(uint256)"
                        },
                        "typeName": {
                          "id": 5824,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6753:7:30",
                          "typeDescriptions": {}
                        }
                      },
                      "id": 5827,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "6753:10:30",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "hexValue": "307837464646464646464646464646464646464646464646464646464646464646463544353736453733353741343530314444464539324634363638314232304130",
                      "id": 5828,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "6766:66:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_57896044618658097711785492504343953926418782139537452191302581570759080747168_by_1",
                        "typeString": "int_const 5789...(69 digits omitted)...7168"
                      },
                      "value": "0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0"
                    },
                    "src": "6753:79:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 5839,
                  "nodeType": "IfStatement",
                  "src": "6749:161:30",
                  "trueBody": {
                    "id": 5838,
                    "nodeType": "Block",
                    "src": "6834:76:30",
                    "statements": [
                      {
                        "expression": {
                          "components": [
                            {
                              "arguments": [
                                {
                                  "hexValue": "30",
                                  "id": 5832,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "6864:1:30",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 5831,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "6856:7:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 5830,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "6856:7:30",
                                  "typeDescriptions": {}
                                }
                              },
                              "id": 5833,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6856:10:30",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "expression": {
                                "id": 5834,
                                "name": "RecoverError",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5584,
                                "src": "6868:12:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_enum$_RecoverError_$5584_$",
                                  "typeString": "type(enum ECDSA.RecoverError)"
                                }
                              },
                              "id": 5835,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "memberName": "InvalidSignatureS",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5582,
                              "src": "6868:30:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_enum$_RecoverError_$5584",
                                "typeString": "enum ECDSA.RecoverError"
                              }
                            }
                          ],
                          "id": 5836,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "6855:44:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                            "typeString": "tuple(address,enum ECDSA.RecoverError)"
                          }
                        },
                        "functionReturnParameters": 5823,
                        "id": 5837,
                        "nodeType": "Return",
                        "src": "6848:51:30"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 5846,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "commonType": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "id": 5842,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "id": 5840,
                        "name": "v",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5812,
                        "src": "6923:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "!=",
                      "rightExpression": {
                        "hexValue": "3237",
                        "id": 5841,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "6928:2:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_27_by_1",
                          "typeString": "int_const 27"
                        },
                        "value": "27"
                      },
                      "src": "6923:7:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "&&",
                    "rightExpression": {
                      "commonType": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "id": 5845,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "id": 5843,
                        "name": "v",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5812,
                        "src": "6934:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "!=",
                      "rightExpression": {
                        "hexValue": "3238",
                        "id": 5844,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "6939:2:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_28_by_1",
                          "typeString": "int_const 28"
                        },
                        "value": "28"
                      },
                      "src": "6934:7:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "6923:18:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 5856,
                  "nodeType": "IfStatement",
                  "src": "6919:100:30",
                  "trueBody": {
                    "id": 5855,
                    "nodeType": "Block",
                    "src": "6943:76:30",
                    "statements": [
                      {
                        "expression": {
                          "components": [
                            {
                              "arguments": [
                                {
                                  "hexValue": "30",
                                  "id": 5849,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "6973:1:30",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 5848,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "6965:7:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 5847,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "6965:7:30",
                                  "typeDescriptions": {}
                                }
                              },
                              "id": 5850,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6965:10:30",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "expression": {
                                "id": 5851,
                                "name": "RecoverError",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5584,
                                "src": "6977:12:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_enum$_RecoverError_$5584_$",
                                  "typeString": "type(enum ECDSA.RecoverError)"
                                }
                              },
                              "id": 5852,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "memberName": "InvalidSignatureV",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5583,
                              "src": "6977:30:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_enum$_RecoverError_$5584",
                                "typeString": "enum ECDSA.RecoverError"
                              }
                            }
                          ],
                          "id": 5853,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "6964:44:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                            "typeString": "tuple(address,enum ECDSA.RecoverError)"
                          }
                        },
                        "functionReturnParameters": 5823,
                        "id": 5854,
                        "nodeType": "Return",
                        "src": "6957:51:30"
                      }
                    ]
                  }
                },
                {
                  "assignments": [
                    5858
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5858,
                      "mutability": "mutable",
                      "name": "signer",
                      "nameLocation": "7121:6:30",
                      "nodeType": "VariableDeclaration",
                      "scope": 5887,
                      "src": "7113:14:30",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 5857,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "7113:7:30",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 5865,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 5860,
                        "name": "hash",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5810,
                        "src": "7140:4:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 5861,
                        "name": "v",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5812,
                        "src": "7146:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 5862,
                        "name": "r",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5814,
                        "src": "7149:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 5863,
                        "name": "s",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5816,
                        "src": "7152:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      ],
                      "id": 5859,
                      "name": "ecrecover",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4294967290,
                      "src": "7130:9:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_ecrecover_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$",
                        "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address)"
                      }
                    },
                    "id": 5864,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7130:24:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7113:41:30"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 5871,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 5866,
                      "name": "signer",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5858,
                      "src": "7168:6:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "arguments": [
                        {
                          "hexValue": "30",
                          "id": 5869,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "7186:1:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          }
                        ],
                        "id": 5868,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "7178:7:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": {
                          "id": 5867,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7178:7:30",
                          "typeDescriptions": {}
                        }
                      },
                      "id": 5870,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "7178:10:30",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "7168:20:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 5881,
                  "nodeType": "IfStatement",
                  "src": "7164:101:30",
                  "trueBody": {
                    "id": 5880,
                    "nodeType": "Block",
                    "src": "7190:75:30",
                    "statements": [
                      {
                        "expression": {
                          "components": [
                            {
                              "arguments": [
                                {
                                  "hexValue": "30",
                                  "id": 5874,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "7220:1:30",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 5873,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "7212:7:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 5872,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "7212:7:30",
                                  "typeDescriptions": {}
                                }
                              },
                              "id": 5875,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7212:10:30",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "expression": {
                                "id": 5876,
                                "name": "RecoverError",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5584,
                                "src": "7224:12:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_enum$_RecoverError_$5584_$",
                                  "typeString": "type(enum ECDSA.RecoverError)"
                                }
                              },
                              "id": 5877,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "memberName": "InvalidSignature",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5580,
                              "src": "7224:29:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_enum$_RecoverError_$5584",
                                "typeString": "enum ECDSA.RecoverError"
                              }
                            }
                          ],
                          "id": 5878,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "7211:43:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                            "typeString": "tuple(address,enum ECDSA.RecoverError)"
                          }
                        },
                        "functionReturnParameters": 5823,
                        "id": 5879,
                        "nodeType": "Return",
                        "src": "7204:50:30"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "components": [
                      {
                        "id": 5882,
                        "name": "signer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5858,
                        "src": "7283:6:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "expression": {
                          "id": 5883,
                          "name": "RecoverError",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5584,
                          "src": "7291:12:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_enum$_RecoverError_$5584_$",
                            "typeString": "type(enum ECDSA.RecoverError)"
                          }
                        },
                        "id": 5884,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "memberName": "NoError",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 5579,
                        "src": "7291:20:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      }
                    ],
                    "id": 5885,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "7282:30:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                      "typeString": "tuple(address,enum ECDSA.RecoverError)"
                    }
                  },
                  "functionReturnParameters": 5823,
                  "id": 5886,
                  "nodeType": "Return",
                  "src": "7275:37:30"
                }
              ]
            },
            "documentation": {
              "id": 5808,
              "nodeType": "StructuredDocumentation",
              "src": "5548:163:30",
              "text": " @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n `r` and `s` signature fields separately.\n _Available since v4.3._"
            },
            "id": 5888,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "tryRecover",
            "nameLocation": "5725:10:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5817,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5810,
                  "mutability": "mutable",
                  "name": "hash",
                  "nameLocation": "5753:4:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5888,
                  "src": "5745:12:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5809,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5745:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5812,
                  "mutability": "mutable",
                  "name": "v",
                  "nameLocation": "5773:1:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5888,
                  "src": "5767:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 5811,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "5767:5:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5814,
                  "mutability": "mutable",
                  "name": "r",
                  "nameLocation": "5792:1:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5888,
                  "src": "5784:9:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5813,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5784:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5816,
                  "mutability": "mutable",
                  "name": "s",
                  "nameLocation": "5811:1:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5888,
                  "src": "5803:9:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5815,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5803:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5735:83:30"
            },
            "returnParameters": {
              "id": 5823,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5819,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5888,
                  "src": "5842:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5818,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5842:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5822,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5888,
                  "src": "5851:12:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_enum$_RecoverError_$5584",
                    "typeString": "enum ECDSA.RecoverError"
                  },
                  "typeName": {
                    "id": 5821,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 5820,
                      "name": "RecoverError",
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 5584,
                      "src": "5851:12:30"
                    },
                    "referencedDeclaration": 5584,
                    "src": "5851:12:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_enum$_RecoverError_$5584",
                      "typeString": "enum ECDSA.RecoverError"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5841:23:30"
            },
            "scope": 5981,
            "src": "5716:1603:30",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5920,
              "nodeType": "Block",
              "src": "7584:138:30",
              "statements": [
                {
                  "assignments": [
                    5903,
                    5906
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5903,
                      "mutability": "mutable",
                      "name": "recovered",
                      "nameLocation": "7603:9:30",
                      "nodeType": "VariableDeclaration",
                      "scope": 5920,
                      "src": "7595:17:30",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 5902,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "7595:7:30",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 5906,
                      "mutability": "mutable",
                      "name": "error",
                      "nameLocation": "7627:5:30",
                      "nodeType": "VariableDeclaration",
                      "scope": 5920,
                      "src": "7614:18:30",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_enum$_RecoverError_$5584",
                        "typeString": "enum ECDSA.RecoverError"
                      },
                      "typeName": {
                        "id": 5905,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 5904,
                          "name": "RecoverError",
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 5584,
                          "src": "7614:12:30"
                        },
                        "referencedDeclaration": 5584,
                        "src": "7614:12:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 5913,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 5908,
                        "name": "hash",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5891,
                        "src": "7647:4:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 5909,
                        "name": "v",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5893,
                        "src": "7653:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 5910,
                        "name": "r",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5895,
                        "src": "7656:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 5911,
                        "name": "s",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5897,
                        "src": "7659:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      ],
                      "id": 5907,
                      "name": "tryRecover",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5703,
                        5777,
                        5888
                      ],
                      "referencedDeclaration": 5888,
                      "src": "7636:10:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$5584_$",
                        "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError)"
                      }
                    },
                    "id": 5912,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7636:25:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                      "typeString": "tuple(address,enum ECDSA.RecoverError)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7594:67:30"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 5915,
                        "name": "error",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5906,
                        "src": "7683:5:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      ],
                      "id": 5914,
                      "name": "_throwError",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5638,
                      "src": "7671:11:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_enum$_RecoverError_$5584_$returns$__$",
                        "typeString": "function (enum ECDSA.RecoverError) pure"
                      }
                    },
                    "id": 5916,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7671:18:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5917,
                  "nodeType": "ExpressionStatement",
                  "src": "7671:18:30"
                },
                {
                  "expression": {
                    "id": 5918,
                    "name": "recovered",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 5903,
                    "src": "7706:9:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 5901,
                  "id": 5919,
                  "nodeType": "Return",
                  "src": "7699:16:30"
                }
              ]
            },
            "documentation": {
              "id": 5889,
              "nodeType": "StructuredDocumentation",
              "src": "7325:122:30",
              "text": " @dev Overload of {ECDSA-recover} that receives the `v`,\n `r` and `s` signature fields separately."
            },
            "id": 5921,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "recover",
            "nameLocation": "7461:7:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5898,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5891,
                  "mutability": "mutable",
                  "name": "hash",
                  "nameLocation": "7486:4:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5921,
                  "src": "7478:12:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5890,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "7478:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5893,
                  "mutability": "mutable",
                  "name": "v",
                  "nameLocation": "7506:1:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5921,
                  "src": "7500:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 5892,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "7500:5:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5895,
                  "mutability": "mutable",
                  "name": "r",
                  "nameLocation": "7525:1:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5921,
                  "src": "7517:9:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5894,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "7517:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5897,
                  "mutability": "mutable",
                  "name": "s",
                  "nameLocation": "7544:1:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5921,
                  "src": "7536:9:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5896,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "7536:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7468:83:30"
            },
            "returnParameters": {
              "id": 5901,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5900,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5921,
                  "src": "7575:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5899,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7575:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7574:9:30"
            },
            "scope": 5981,
            "src": "7452:270:30",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5937,
              "nodeType": "Block",
              "src": "8090:187:30",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "hexValue": "19457468657265756d205369676e6564204d6573736167653a0a3332",
                            "id": 5932,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "8228:34:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73",
                              "typeString": "literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a3332\""
                            },
                            "value": "\u0019Ethereum Signed Message:\n32"
                          },
                          {
                            "id": 5933,
                            "name": "hash",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5924,
                            "src": "8264:4:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73",
                              "typeString": "literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a3332\""
                            },
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          ],
                          "expression": {
                            "id": 5930,
                            "name": "abi",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4294967295,
                            "src": "8211:3:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_abi",
                              "typeString": "abi"
                            }
                          },
                          "id": 5931,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberName": "encodePacked",
                          "nodeType": "MemberAccess",
                          "src": "8211:16:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                            "typeString": "function () pure returns (bytes memory)"
                          }
                        },
                        "id": 5934,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "8211:58:30",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 5929,
                      "name": "keccak256",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4294967288,
                      "src": "8201:9:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                        "typeString": "function (bytes memory) pure returns (bytes32)"
                      }
                    },
                    "id": 5935,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8201:69:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "functionReturnParameters": 5928,
                  "id": 5936,
                  "nodeType": "Return",
                  "src": "8194:76:30"
                }
              ]
            },
            "documentation": {
              "id": 5922,
              "nodeType": "StructuredDocumentation",
              "src": "7728:279:30",
              "text": " @dev Returns an Ethereum Signed Message, created from a `hash`. This\n produces hash corresponding to the one signed with the\n https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n JSON-RPC method as part of EIP-191.\n See {recover}."
            },
            "id": 5938,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "toEthSignedMessageHash",
            "nameLocation": "8021:22:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5925,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5924,
                  "mutability": "mutable",
                  "name": "hash",
                  "nameLocation": "8052:4:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5938,
                  "src": "8044:12:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5923,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "8044:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8043:14:30"
            },
            "returnParameters": {
              "id": 5928,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5927,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5938,
                  "src": "8081:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5926,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "8081:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8080:9:30"
            },
            "scope": 5981,
            "src": "8012:265:30",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5959,
              "nodeType": "Block",
              "src": "8642:116:30",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "hexValue": "19457468657265756d205369676e6564204d6573736167653a0a",
                            "id": 5949,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "8686:32:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_9af2d9c228f6cfddaa6d1e5b94e0bce4ab16bd9a472a2b7fbfd74ebff4c720b4",
                              "typeString": "literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a\""
                            },
                            "value": "\u0019Ethereum Signed Message:\n"
                          },
                          {
                            "arguments": [
                              {
                                "expression": {
                                  "id": 5952,
                                  "name": "s",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5941,
                                  "src": "8737:1:30",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                },
                                "id": 5953,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "length",
                                "nodeType": "MemberAccess",
                                "src": "8737:8:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "id": 5950,
                                "name": "Strings",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5574,
                                "src": "8720:7:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_Strings_$5574_$",
                                  "typeString": "type(library Strings)"
                                }
                              },
                              "id": 5951,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "toString",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5456,
                              "src": "8720:16:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_string_memory_ptr_$",
                                "typeString": "function (uint256) pure returns (string memory)"
                              }
                            },
                            "id": 5954,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "8720:26:30",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_memory_ptr",
                              "typeString": "string memory"
                            }
                          },
                          {
                            "id": 5955,
                            "name": "s",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5941,
                            "src": "8748:1:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes memory"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_stringliteral_9af2d9c228f6cfddaa6d1e5b94e0bce4ab16bd9a472a2b7fbfd74ebff4c720b4",
                              "typeString": "literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a\""
                            },
                            {
                              "typeIdentifier": "t_string_memory_ptr",
                              "typeString": "string memory"
                            },
                            {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes memory"
                            }
                          ],
                          "expression": {
                            "id": 5947,
                            "name": "abi",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4294967295,
                            "src": "8669:3:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_abi",
                              "typeString": "abi"
                            }
                          },
                          "id": 5948,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberName": "encodePacked",
                          "nodeType": "MemberAccess",
                          "src": "8669:16:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                            "typeString": "function () pure returns (bytes memory)"
                          }
                        },
                        "id": 5956,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "8669:81:30",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 5946,
                      "name": "keccak256",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4294967288,
                      "src": "8659:9:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                        "typeString": "function (bytes memory) pure returns (bytes32)"
                      }
                    },
                    "id": 5957,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8659:92:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "functionReturnParameters": 5945,
                  "id": 5958,
                  "nodeType": "Return",
                  "src": "8652:99:30"
                }
              ]
            },
            "documentation": {
              "id": 5939,
              "nodeType": "StructuredDocumentation",
              "src": "8283:274:30",
              "text": " @dev Returns an Ethereum Signed Message, created from `s`. This\n produces hash corresponding to the one signed with the\n https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n JSON-RPC method as part of EIP-191.\n See {recover}."
            },
            "id": 5960,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "toEthSignedMessageHash",
            "nameLocation": "8571:22:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5942,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5941,
                  "mutability": "mutable",
                  "name": "s",
                  "nameLocation": "8607:1:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5960,
                  "src": "8594:14:30",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 5940,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "8594:5:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8593:16:30"
            },
            "returnParameters": {
              "id": 5945,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5944,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5960,
                  "src": "8633:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5943,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "8633:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8632:9:30"
            },
            "scope": 5981,
            "src": "8562:196:30",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5979,
              "nodeType": "Block",
              "src": "9199:92:30",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "hexValue": "1901",
                            "id": 5973,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "9243:10:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541",
                              "typeString": "literal_string hex\"1901\""
                            },
                            "value": "\u0019\u0001"
                          },
                          {
                            "id": 5974,
                            "name": "domainSeparator",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5963,
                            "src": "9255:15:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          {
                            "id": 5975,
                            "name": "structHash",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5965,
                            "src": "9272:10:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541",
                              "typeString": "literal_string hex\"1901\""
                            },
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          ],
                          "expression": {
                            "id": 5971,
                            "name": "abi",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4294967295,
                            "src": "9226:3:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_abi",
                              "typeString": "abi"
                            }
                          },
                          "id": 5972,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberName": "encodePacked",
                          "nodeType": "MemberAccess",
                          "src": "9226:16:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                            "typeString": "function () pure returns (bytes memory)"
                          }
                        },
                        "id": 5976,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "9226:57:30",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 5970,
                      "name": "keccak256",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4294967288,
                      "src": "9216:9:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                        "typeString": "function (bytes memory) pure returns (bytes32)"
                      }
                    },
                    "id": 5977,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9216:68:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "functionReturnParameters": 5969,
                  "id": 5978,
                  "nodeType": "Return",
                  "src": "9209:75:30"
                }
              ]
            },
            "documentation": {
              "id": 5961,
              "nodeType": "StructuredDocumentation",
              "src": "8764:328:30",
              "text": " @dev Returns an Ethereum Signed Typed Data, created from a\n `domainSeparator` and a `structHash`. This produces hash corresponding\n to the one signed with the\n https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n JSON-RPC method as part of EIP-712.\n See {recover}."
            },
            "id": 5980,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "toTypedDataHash",
            "nameLocation": "9106:15:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5966,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5963,
                  "mutability": "mutable",
                  "name": "domainSeparator",
                  "nameLocation": "9130:15:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5980,
                  "src": "9122:23:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5962,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "9122:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5965,
                  "mutability": "mutable",
                  "name": "structHash",
                  "nameLocation": "9155:10:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5980,
                  "src": "9147:18:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5964,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "9147:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "9121:45:30"
            },
            "returnParameters": {
              "id": 5969,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5968,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5980,
                  "src": "9190:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5967,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "9190:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "9189:9:30"
            },
            "scope": 5981,
            "src": "9097:194:30",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          }
        ],
        "scope": 5982,
        "src": "369:8924:30",
        "usedErrors": []
      }
    ],
    "src": "112:9182:30"
  },
  "legacyAST": {
    "absolutePath": "@openzeppelin/contracts/utils/cryptography/ECDSA.sol",
    "exportedSymbols": {
      "ECDSA": [
        5981
      ],
      "Strings": [
        5574
      ]
    },
    "id": 5982,
    "license": "MIT",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 5576,
        "literals": [
          "solidity",
          "^",
          "0.8",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "112:23:30"
      },
      {
        "absolutePath": "@openzeppelin/contracts/utils/Strings.sol",
        "file": "../Strings.sol",
        "id": 5577,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 5982,
        "sourceUnit": 5575,
        "src": "137:24:30",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [],
        "canonicalName": "ECDSA",
        "contractDependencies": [],
        "contractKind": "library",
        "documentation": {
          "id": 5578,
          "nodeType": "StructuredDocumentation",
          "src": "163:205:30",
          "text": " @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n These functions can be used to verify that a message was signed by the holder\n of the private keys of a given address."
        },
        "fullyImplemented": true,
        "id": 5981,
        "linearizedBaseContracts": [
          5981
        ],
        "name": "ECDSA",
        "nameLocation": "377:5:30",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "canonicalName": "ECDSA.RecoverError",
            "id": 5584,
            "members": [
              {
                "id": 5579,
                "name": "NoError",
                "nameLocation": "417:7:30",
                "nodeType": "EnumValue",
                "src": "417:7:30"
              },
              {
                "id": 5580,
                "name": "InvalidSignature",
                "nameLocation": "434:16:30",
                "nodeType": "EnumValue",
                "src": "434:16:30"
              },
              {
                "id": 5581,
                "name": "InvalidSignatureLength",
                "nameLocation": "460:22:30",
                "nodeType": "EnumValue",
                "src": "460:22:30"
              },
              {
                "id": 5582,
                "name": "InvalidSignatureS",
                "nameLocation": "492:17:30",
                "nodeType": "EnumValue",
                "src": "492:17:30"
              },
              {
                "id": 5583,
                "name": "InvalidSignatureV",
                "nameLocation": "519:17:30",
                "nodeType": "EnumValue",
                "src": "519:17:30"
              }
            ],
            "name": "RecoverError",
            "nameLocation": "394:12:30",
            "nodeType": "EnumDefinition",
            "src": "389:153:30"
          },
          {
            "body": {
              "id": 5637,
              "nodeType": "Block",
              "src": "602:577:30",
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_enum$_RecoverError_$5584",
                      "typeString": "enum ECDSA.RecoverError"
                    },
                    "id": 5593,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 5590,
                      "name": "error",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5587,
                      "src": "616:5:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_enum$_RecoverError_$5584",
                        "typeString": "enum ECDSA.RecoverError"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "expression": {
                        "id": 5591,
                        "name": "RecoverError",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5584,
                        "src": "625:12:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_enum$_RecoverError_$5584_$",
                          "typeString": "type(enum ECDSA.RecoverError)"
                        }
                      },
                      "id": 5592,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "memberName": "NoError",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 5579,
                      "src": "625:20:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_enum$_RecoverError_$5584",
                        "typeString": "enum ECDSA.RecoverError"
                      }
                    },
                    "src": "616:29:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "condition": {
                      "commonType": {
                        "typeIdentifier": "t_enum$_RecoverError_$5584",
                        "typeString": "enum ECDSA.RecoverError"
                      },
                      "id": 5599,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "id": 5596,
                        "name": "error",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5587,
                        "src": "712:5:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "==",
                      "rightExpression": {
                        "expression": {
                          "id": 5597,
                          "name": "RecoverError",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5584,
                          "src": "721:12:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_enum$_RecoverError_$5584_$",
                            "typeString": "type(enum ECDSA.RecoverError)"
                          }
                        },
                        "id": 5598,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "memberName": "InvalidSignature",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 5580,
                        "src": "721:29:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      },
                      "src": "712:38:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "falseBody": {
                      "condition": {
                        "commonType": {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        },
                        "id": 5608,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "id": 5605,
                          "name": "error",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5587,
                          "src": "821:5:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_enum$_RecoverError_$5584",
                            "typeString": "enum ECDSA.RecoverError"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "expression": {
                            "id": 5606,
                            "name": "RecoverError",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5584,
                            "src": "830:12:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_enum$_RecoverError_$5584_$",
                              "typeString": "type(enum ECDSA.RecoverError)"
                            }
                          },
                          "id": 5607,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberName": "InvalidSignatureLength",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 5581,
                          "src": "830:35:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_enum$_RecoverError_$5584",
                            "typeString": "enum ECDSA.RecoverError"
                          }
                        },
                        "src": "821:44:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "falseBody": {
                        "condition": {
                          "commonType": {
                            "typeIdentifier": "t_enum$_RecoverError_$5584",
                            "typeString": "enum ECDSA.RecoverError"
                          },
                          "id": 5617,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "leftExpression": {
                            "id": 5614,
                            "name": "error",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5587,
                            "src": "943:5:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_enum$_RecoverError_$5584",
                              "typeString": "enum ECDSA.RecoverError"
                            }
                          },
                          "nodeType": "BinaryOperation",
                          "operator": "==",
                          "rightExpression": {
                            "expression": {
                              "id": 5615,
                              "name": "RecoverError",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5584,
                              "src": "952:12:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_enum$_RecoverError_$5584_$",
                                "typeString": "type(enum ECDSA.RecoverError)"
                              }
                            },
                            "id": 5616,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "memberName": "InvalidSignatureS",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 5582,
                            "src": "952:30:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_enum$_RecoverError_$5584",
                              "typeString": "enum ECDSA.RecoverError"
                            }
                          },
                          "src": "943:39:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "falseBody": {
                          "condition": {
                            "commonType": {
                              "typeIdentifier": "t_enum$_RecoverError_$5584",
                              "typeString": "enum ECDSA.RecoverError"
                            },
                            "id": 5626,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "leftExpression": {
                              "id": 5623,
                              "name": "error",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5587,
                              "src": "1063:5:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_enum$_RecoverError_$5584",
                                "typeString": "enum ECDSA.RecoverError"
                              }
                            },
                            "nodeType": "BinaryOperation",
                            "operator": "==",
                            "rightExpression": {
                              "expression": {
                                "id": 5624,
                                "name": "RecoverError",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5584,
                                "src": "1072:12:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_enum$_RecoverError_$5584_$",
                                  "typeString": "type(enum ECDSA.RecoverError)"
                                }
                              },
                              "id": 5625,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "memberName": "InvalidSignatureV",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5583,
                              "src": "1072:30:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_enum$_RecoverError_$5584",
                                "typeString": "enum ECDSA.RecoverError"
                              }
                            },
                            "src": "1063:39:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bool",
                              "typeString": "bool"
                            }
                          },
                          "id": 5632,
                          "nodeType": "IfStatement",
                          "src": "1059:114:30",
                          "trueBody": {
                            "id": 5631,
                            "nodeType": "Block",
                            "src": "1104:69:30",
                            "statements": [
                              {
                                "expression": {
                                  "arguments": [
                                    {
                                      "hexValue": "45434453413a20696e76616c6964207369676e6174757265202776272076616c7565",
                                      "id": 5628,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": true,
                                      "kind": "string",
                                      "lValueRequested": false,
                                      "nodeType": "Literal",
                                      "src": "1125:36:30",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_stringliteral_8522ee1b53216f595394db8e80a64d9e7d9bd512c0811c18debe9f40858597e4",
                                        "typeString": "literal_string \"ECDSA: invalid signature 'v' value\""
                                      },
                                      "value": "ECDSA: invalid signature 'v' value"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": [
                                      {
                                        "typeIdentifier": "t_stringliteral_8522ee1b53216f595394db8e80a64d9e7d9bd512c0811c18debe9f40858597e4",
                                        "typeString": "literal_string \"ECDSA: invalid signature 'v' value\""
                                      }
                                    ],
                                    "id": 5627,
                                    "name": "revert",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [
                                      4294967277,
                                      4294967277
                                    ],
                                    "referencedDeclaration": 4294967277,
                                    "src": "1118:6:30",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$",
                                      "typeString": "function (string memory) pure"
                                    }
                                  },
                                  "id": 5629,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "kind": "functionCall",
                                  "lValueRequested": false,
                                  "names": [],
                                  "nodeType": "FunctionCall",
                                  "src": "1118:44:30",
                                  "tryCall": false,
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_tuple$__$",
                                    "typeString": "tuple()"
                                  }
                                },
                                "id": 5630,
                                "nodeType": "ExpressionStatement",
                                "src": "1118:44:30"
                              }
                            ]
                          }
                        },
                        "id": 5633,
                        "nodeType": "IfStatement",
                        "src": "939:234:30",
                        "trueBody": {
                          "id": 5622,
                          "nodeType": "Block",
                          "src": "984:69:30",
                          "statements": [
                            {
                              "expression": {
                                "arguments": [
                                  {
                                    "hexValue": "45434453413a20696e76616c6964207369676e6174757265202773272076616c7565",
                                    "id": 5619,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "string",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "1005:36:30",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd",
                                      "typeString": "literal_string \"ECDSA: invalid signature 's' value\""
                                    },
                                    "value": "ECDSA: invalid signature 's' value"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_stringliteral_520d1f787dbcafbbfc007fd2c4ecf3d2711ec587f3ee9a1215c0b646c3e530bd",
                                      "typeString": "literal_string \"ECDSA: invalid signature 's' value\""
                                    }
                                  ],
                                  "id": 5618,
                                  "name": "revert",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [
                                    4294967277,
                                    4294967277
                                  ],
                                  "referencedDeclaration": 4294967277,
                                  "src": "998:6:30",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$",
                                    "typeString": "function (string memory) pure"
                                  }
                                },
                                "id": 5620,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "998:44:30",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_tuple$__$",
                                  "typeString": "tuple()"
                                }
                              },
                              "id": 5621,
                              "nodeType": "ExpressionStatement",
                              "src": "998:44:30"
                            }
                          ]
                        }
                      },
                      "id": 5634,
                      "nodeType": "IfStatement",
                      "src": "817:356:30",
                      "trueBody": {
                        "id": 5613,
                        "nodeType": "Block",
                        "src": "867:66:30",
                        "statements": [
                          {
                            "expression": {
                              "arguments": [
                                {
                                  "hexValue": "45434453413a20696e76616c6964207369676e6174757265206c656e677468",
                                  "id": 5610,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "string",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "888:33:30",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77",
                                    "typeString": "literal_string \"ECDSA: invalid signature length\""
                                  },
                                  "value": "ECDSA: invalid signature length"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_stringliteral_1669ff3ba3cdf64474e1193492d05b8434e29b0b495e60095eb5f5c8ec14ce77",
                                    "typeString": "literal_string \"ECDSA: invalid signature length\""
                                  }
                                ],
                                "id": 5609,
                                "name": "revert",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [
                                  4294967277,
                                  4294967277
                                ],
                                "referencedDeclaration": 4294967277,
                                "src": "881:6:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$",
                                  "typeString": "function (string memory) pure"
                                }
                              },
                              "id": 5611,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "881:41:30",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_tuple$__$",
                                "typeString": "tuple()"
                              }
                            },
                            "id": 5612,
                            "nodeType": "ExpressionStatement",
                            "src": "881:41:30"
                          }
                        ]
                      }
                    },
                    "id": 5635,
                    "nodeType": "IfStatement",
                    "src": "708:465:30",
                    "trueBody": {
                      "id": 5604,
                      "nodeType": "Block",
                      "src": "752:59:30",
                      "statements": [
                        {
                          "expression": {
                            "arguments": [
                              {
                                "hexValue": "45434453413a20696e76616c6964207369676e6174757265",
                                "id": 5601,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "string",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "773:26:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be",
                                  "typeString": "literal_string \"ECDSA: invalid signature\""
                                },
                                "value": "ECDSA: invalid signature"
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_stringliteral_00043f6bf76368aa97c21698e9b9d4779e31902453daccf3525ddfb36e53e2be",
                                  "typeString": "literal_string \"ECDSA: invalid signature\""
                                }
                              ],
                              "id": 5600,
                              "name": "revert",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [
                                4294967277,
                                4294967277
                              ],
                              "referencedDeclaration": 4294967277,
                              "src": "766:6:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_revert_pure$_t_string_memory_ptr_$returns$__$",
                                "typeString": "function (string memory) pure"
                              }
                            },
                            "id": 5602,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "766:34:30",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$__$",
                              "typeString": "tuple()"
                            }
                          },
                          "id": 5603,
                          "nodeType": "ExpressionStatement",
                          "src": "766:34:30"
                        }
                      ]
                    }
                  },
                  "id": 5636,
                  "nodeType": "IfStatement",
                  "src": "612:561:30",
                  "trueBody": {
                    "id": 5595,
                    "nodeType": "Block",
                    "src": "647:55:30",
                    "statements": [
                      {
                        "functionReturnParameters": 5589,
                        "id": 5594,
                        "nodeType": "Return",
                        "src": "661:7:30"
                      }
                    ]
                  }
                }
              ]
            },
            "id": 5638,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_throwError",
            "nameLocation": "557:11:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5588,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5587,
                  "mutability": "mutable",
                  "name": "error",
                  "nameLocation": "582:5:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5638,
                  "src": "569:18:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_enum$_RecoverError_$5584",
                    "typeString": "enum ECDSA.RecoverError"
                  },
                  "typeName": {
                    "id": 5586,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 5585,
                      "name": "RecoverError",
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 5584,
                      "src": "569:12:30"
                    },
                    "referencedDeclaration": 5584,
                    "src": "569:12:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_enum$_RecoverError_$5584",
                      "typeString": "enum ECDSA.RecoverError"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "568:20:30"
            },
            "returnParameters": {
              "id": 5589,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "602:0:30"
            },
            "scope": 5981,
            "src": "548:631:30",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "private"
          },
          {
            "body": {
              "id": 5702,
              "nodeType": "Block",
              "src": "2347:1175:30",
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 5654,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "expression": {
                        "id": 5651,
                        "name": "signature",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5643,
                        "src": "2554:9:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      },
                      "id": 5652,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "src": "2554:16:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "hexValue": "3635",
                      "id": 5653,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2574:2:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_65_by_1",
                        "typeString": "int_const 65"
                      },
                      "value": "65"
                    },
                    "src": "2554:22:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "condition": {
                      "commonType": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "id": 5676,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "expression": {
                          "id": 5673,
                          "name": "signature",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5643,
                          "src": "3036:9:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes_memory_ptr",
                            "typeString": "bytes memory"
                          }
                        },
                        "id": 5674,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "length",
                        "nodeType": "MemberAccess",
                        "src": "3036:16:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "==",
                      "rightExpression": {
                        "hexValue": "3634",
                        "id": 5675,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "3056:2:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_64_by_1",
                          "typeString": "int_const 64"
                        },
                        "value": "64"
                      },
                      "src": "3036:22:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "falseBody": {
                      "id": 5699,
                      "nodeType": "Block",
                      "src": "3435:81:30",
                      "statements": [
                        {
                          "expression": {
                            "components": [
                              {
                                "arguments": [
                                  {
                                    "hexValue": "30",
                                    "id": 5693,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": true,
                                    "kind": "number",
                                    "lValueRequested": false,
                                    "nodeType": "Literal",
                                    "src": "3465:1:30",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    },
                                    "value": "0"
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_rational_0_by_1",
                                      "typeString": "int_const 0"
                                    }
                                  ],
                                  "id": 5692,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "3457:7:30",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_address_$",
                                    "typeString": "type(address)"
                                  },
                                  "typeName": {
                                    "id": 5691,
                                    "name": "address",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "3457:7:30",
                                    "typeDescriptions": {}
                                  }
                                },
                                "id": 5694,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "3457:10:30",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              },
                              {
                                "expression": {
                                  "id": 5695,
                                  "name": "RecoverError",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5584,
                                  "src": "3469:12:30",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_enum$_RecoverError_$5584_$",
                                    "typeString": "type(enum ECDSA.RecoverError)"
                                  }
                                },
                                "id": 5696,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "memberName": "InvalidSignatureLength",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 5581,
                                "src": "3469:35:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_enum$_RecoverError_$5584",
                                  "typeString": "enum ECDSA.RecoverError"
                                }
                              }
                            ],
                            "id": 5697,
                            "isConstant": false,
                            "isInlineArray": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "TupleExpression",
                            "src": "3456:49:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                              "typeString": "tuple(address,enum ECDSA.RecoverError)"
                            }
                          },
                          "functionReturnParameters": 5650,
                          "id": 5698,
                          "nodeType": "Return",
                          "src": "3449:56:30"
                        }
                      ]
                    },
                    "id": 5700,
                    "nodeType": "IfStatement",
                    "src": "3032:484:30",
                    "trueBody": {
                      "id": 5690,
                      "nodeType": "Block",
                      "src": "3060:369:30",
                      "statements": [
                        {
                          "assignments": [
                            5678
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 5678,
                              "mutability": "mutable",
                              "name": "r",
                              "nameLocation": "3082:1:30",
                              "nodeType": "VariableDeclaration",
                              "scope": 5690,
                              "src": "3074:9:30",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              "typeName": {
                                "id": 5677,
                                "name": "bytes32",
                                "nodeType": "ElementaryTypeName",
                                "src": "3074:7:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "visibility": "internal"
                            }
                          ],
                          "id": 5679,
                          "nodeType": "VariableDeclarationStatement",
                          "src": "3074:9:30"
                        },
                        {
                          "assignments": [
                            5681
                          ],
                          "declarations": [
                            {
                              "constant": false,
                              "id": 5681,
                              "mutability": "mutable",
                              "name": "vs",
                              "nameLocation": "3105:2:30",
                              "nodeType": "VariableDeclaration",
                              "scope": 5690,
                              "src": "3097:10:30",
                              "stateVariable": false,
                              "storageLocation": "default",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              "typeName": {
                                "id": 5680,
                                "name": "bytes32",
                                "nodeType": "ElementaryTypeName",
                                "src": "3097:7:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              "visibility": "internal"
                            }
                          ],
                          "id": 5682,
                          "nodeType": "VariableDeclarationStatement",
                          "src": "3097:10:30"
                        },
                        {
                          "AST": {
                            "nodeType": "YulBlock",
                            "src": "3261:114:30",
                            "statements": [
                              {
                                "nodeType": "YulAssignment",
                                "src": "3279:32:30",
                                "value": {
                                  "arguments": [
                                    {
                                      "arguments": [
                                        {
                                          "name": "signature",
                                          "nodeType": "YulIdentifier",
                                          "src": "3294:9:30"
                                        },
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "3305:4:30",
                                          "type": "",
                                          "value": "0x20"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "add",
                                        "nodeType": "YulIdentifier",
                                        "src": "3290:3:30"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "3290:20:30"
                                    }
                                  ],
                                  "functionName": {
                                    "name": "mload",
                                    "nodeType": "YulIdentifier",
                                    "src": "3284:5:30"
                                  },
                                  "nodeType": "YulFunctionCall",
                                  "src": "3284:27:30"
                                },
                                "variableNames": [
                                  {
                                    "name": "r",
                                    "nodeType": "YulIdentifier",
                                    "src": "3279:1:30"
                                  }
                                ]
                              },
                              {
                                "nodeType": "YulAssignment",
                                "src": "3328:33:30",
                                "value": {
                                  "arguments": [
                                    {
                                      "arguments": [
                                        {
                                          "name": "signature",
                                          "nodeType": "YulIdentifier",
                                          "src": "3344:9:30"
                                        },
                                        {
                                          "kind": "number",
                                          "nodeType": "YulLiteral",
                                          "src": "3355:4:30",
                                          "type": "",
                                          "value": "0x40"
                                        }
                                      ],
                                      "functionName": {
                                        "name": "add",
                                        "nodeType": "YulIdentifier",
                                        "src": "3340:3:30"
                                      },
                                      "nodeType": "YulFunctionCall",
                                      "src": "3340:20:30"
                                    }
                                  ],
                                  "functionName": {
                                    "name": "mload",
                                    "nodeType": "YulIdentifier",
                                    "src": "3334:5:30"
                                  },
                                  "nodeType": "YulFunctionCall",
                                  "src": "3334:27:30"
                                },
                                "variableNames": [
                                  {
                                    "name": "vs",
                                    "nodeType": "YulIdentifier",
                                    "src": "3328:2:30"
                                  }
                                ]
                              }
                            ]
                          },
                          "evmVersion": "london",
                          "externalReferences": [
                            {
                              "declaration": 5678,
                              "isOffset": false,
                              "isSlot": false,
                              "src": "3279:1:30",
                              "valueSize": 1
                            },
                            {
                              "declaration": 5643,
                              "isOffset": false,
                              "isSlot": false,
                              "src": "3294:9:30",
                              "valueSize": 1
                            },
                            {
                              "declaration": 5643,
                              "isOffset": false,
                              "isSlot": false,
                              "src": "3344:9:30",
                              "valueSize": 1
                            },
                            {
                              "declaration": 5681,
                              "isOffset": false,
                              "isSlot": false,
                              "src": "3328:2:30",
                              "valueSize": 1
                            }
                          ],
                          "id": 5683,
                          "nodeType": "InlineAssembly",
                          "src": "3252:123:30"
                        },
                        {
                          "expression": {
                            "arguments": [
                              {
                                "id": 5685,
                                "name": "hash",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5641,
                                "src": "3406:4:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              {
                                "id": 5686,
                                "name": "r",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5678,
                                "src": "3412:1:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              },
                              {
                                "id": 5687,
                                "name": "vs",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5681,
                                "src": "3415:2:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                },
                                {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                },
                                {
                                  "typeIdentifier": "t_bytes32",
                                  "typeString": "bytes32"
                                }
                              ],
                              "id": 5684,
                              "name": "tryRecover",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [
                                5703,
                                5777,
                                5888
                              ],
                              "referencedDeclaration": 5777,
                              "src": "3395:10:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$5584_$",
                                "typeString": "function (bytes32,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError)"
                              }
                            },
                            "id": 5688,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "3395:23:30",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                              "typeString": "tuple(address,enum ECDSA.RecoverError)"
                            }
                          },
                          "functionReturnParameters": 5650,
                          "id": 5689,
                          "nodeType": "Return",
                          "src": "3388:30:30"
                        }
                      ]
                    }
                  },
                  "id": 5701,
                  "nodeType": "IfStatement",
                  "src": "2550:966:30",
                  "trueBody": {
                    "id": 5672,
                    "nodeType": "Block",
                    "src": "2578:448:30",
                    "statements": [
                      {
                        "assignments": [
                          5656
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5656,
                            "mutability": "mutable",
                            "name": "r",
                            "nameLocation": "2600:1:30",
                            "nodeType": "VariableDeclaration",
                            "scope": 5672,
                            "src": "2592:9:30",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            "typeName": {
                              "id": 5655,
                              "name": "bytes32",
                              "nodeType": "ElementaryTypeName",
                              "src": "2592:7:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 5657,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2592:9:30"
                      },
                      {
                        "assignments": [
                          5659
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5659,
                            "mutability": "mutable",
                            "name": "s",
                            "nameLocation": "2623:1:30",
                            "nodeType": "VariableDeclaration",
                            "scope": 5672,
                            "src": "2615:9:30",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            "typeName": {
                              "id": 5658,
                              "name": "bytes32",
                              "nodeType": "ElementaryTypeName",
                              "src": "2615:7:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 5660,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2615:9:30"
                      },
                      {
                        "assignments": [
                          5662
                        ],
                        "declarations": [
                          {
                            "constant": false,
                            "id": 5662,
                            "mutability": "mutable",
                            "name": "v",
                            "nameLocation": "2644:1:30",
                            "nodeType": "VariableDeclaration",
                            "scope": 5672,
                            "src": "2638:7:30",
                            "stateVariable": false,
                            "storageLocation": "default",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            },
                            "typeName": {
                              "id": 5661,
                              "name": "uint8",
                              "nodeType": "ElementaryTypeName",
                              "src": "2638:5:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            "visibility": "internal"
                          }
                        ],
                        "id": 5663,
                        "nodeType": "VariableDeclarationStatement",
                        "src": "2638:7:30"
                      },
                      {
                        "AST": {
                          "nodeType": "YulBlock",
                          "src": "2799:171:30",
                          "statements": [
                            {
                              "nodeType": "YulAssignment",
                              "src": "2817:32:30",
                              "value": {
                                "arguments": [
                                  {
                                    "arguments": [
                                      {
                                        "name": "signature",
                                        "nodeType": "YulIdentifier",
                                        "src": "2832:9:30"
                                      },
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "2843:4:30",
                                        "type": "",
                                        "value": "0x20"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "add",
                                      "nodeType": "YulIdentifier",
                                      "src": "2828:3:30"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "2828:20:30"
                                  }
                                ],
                                "functionName": {
                                  "name": "mload",
                                  "nodeType": "YulIdentifier",
                                  "src": "2822:5:30"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "2822:27:30"
                              },
                              "variableNames": [
                                {
                                  "name": "r",
                                  "nodeType": "YulIdentifier",
                                  "src": "2817:1:30"
                                }
                              ]
                            },
                            {
                              "nodeType": "YulAssignment",
                              "src": "2866:32:30",
                              "value": {
                                "arguments": [
                                  {
                                    "arguments": [
                                      {
                                        "name": "signature",
                                        "nodeType": "YulIdentifier",
                                        "src": "2881:9:30"
                                      },
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "2892:4:30",
                                        "type": "",
                                        "value": "0x40"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "add",
                                      "nodeType": "YulIdentifier",
                                      "src": "2877:3:30"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "2877:20:30"
                                  }
                                ],
                                "functionName": {
                                  "name": "mload",
                                  "nodeType": "YulIdentifier",
                                  "src": "2871:5:30"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "2871:27:30"
                              },
                              "variableNames": [
                                {
                                  "name": "s",
                                  "nodeType": "YulIdentifier",
                                  "src": "2866:1:30"
                                }
                              ]
                            },
                            {
                              "nodeType": "YulAssignment",
                              "src": "2915:41:30",
                              "value": {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "2925:1:30",
                                    "type": "",
                                    "value": "0"
                                  },
                                  {
                                    "arguments": [
                                      {
                                        "arguments": [
                                          {
                                            "name": "signature",
                                            "nodeType": "YulIdentifier",
                                            "src": "2938:9:30"
                                          },
                                          {
                                            "kind": "number",
                                            "nodeType": "YulLiteral",
                                            "src": "2949:4:30",
                                            "type": "",
                                            "value": "0x60"
                                          }
                                        ],
                                        "functionName": {
                                          "name": "add",
                                          "nodeType": "YulIdentifier",
                                          "src": "2934:3:30"
                                        },
                                        "nodeType": "YulFunctionCall",
                                        "src": "2934:20:30"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "mload",
                                      "nodeType": "YulIdentifier",
                                      "src": "2928:5:30"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "2928:27:30"
                                  }
                                ],
                                "functionName": {
                                  "name": "byte",
                                  "nodeType": "YulIdentifier",
                                  "src": "2920:4:30"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "2920:36:30"
                              },
                              "variableNames": [
                                {
                                  "name": "v",
                                  "nodeType": "YulIdentifier",
                                  "src": "2915:1:30"
                                }
                              ]
                            }
                          ]
                        },
                        "evmVersion": "london",
                        "externalReferences": [
                          {
                            "declaration": 5656,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "2817:1:30",
                            "valueSize": 1
                          },
                          {
                            "declaration": 5659,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "2866:1:30",
                            "valueSize": 1
                          },
                          {
                            "declaration": 5643,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "2832:9:30",
                            "valueSize": 1
                          },
                          {
                            "declaration": 5643,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "2881:9:30",
                            "valueSize": 1
                          },
                          {
                            "declaration": 5643,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "2938:9:30",
                            "valueSize": 1
                          },
                          {
                            "declaration": 5662,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "2915:1:30",
                            "valueSize": 1
                          }
                        ],
                        "id": 5664,
                        "nodeType": "InlineAssembly",
                        "src": "2790:180:30"
                      },
                      {
                        "expression": {
                          "arguments": [
                            {
                              "id": 5666,
                              "name": "hash",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5641,
                              "src": "3001:4:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "id": 5667,
                              "name": "v",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5662,
                              "src": "3007:1:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "id": 5668,
                              "name": "r",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5656,
                              "src": "3010:1:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            },
                            {
                              "id": 5669,
                              "name": "s",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 5659,
                              "src": "3013:1:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              },
                              {
                                "typeIdentifier": "t_bytes32",
                                "typeString": "bytes32"
                              }
                            ],
                            "id": 5665,
                            "name": "tryRecover",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [
                              5703,
                              5777,
                              5888
                            ],
                            "referencedDeclaration": 5888,
                            "src": "2990:10:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$5584_$",
                              "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError)"
                            }
                          },
                          "id": 5670,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2990:25:30",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                            "typeString": "tuple(address,enum ECDSA.RecoverError)"
                          }
                        },
                        "functionReturnParameters": 5650,
                        "id": 5671,
                        "nodeType": "Return",
                        "src": "2983:32:30"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 5639,
              "nodeType": "StructuredDocumentation",
              "src": "1185:1053:30",
              "text": " @dev Returns the address that signed a hashed message (`hash`) with\n `signature` or error string. This address can then be used for verification purposes.\n The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n this function rejects them by requiring the `s` value to be in the lower\n half order, and the `v` value to be either 27 or 28.\n IMPORTANT: `hash` _must_ be the result of a hash operation for the\n verification to be secure: it is possible to craft signatures that\n recover to arbitrary addresses for non-hashed data. A safe way to ensure\n this is by receiving a hash of the original message (which may otherwise\n be too long), and then calling {toEthSignedMessageHash} on it.\n Documentation for signature generation:\n - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n _Available since v4.3._"
            },
            "id": 5703,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "tryRecover",
            "nameLocation": "2252:10:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5644,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5641,
                  "mutability": "mutable",
                  "name": "hash",
                  "nameLocation": "2271:4:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5703,
                  "src": "2263:12:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5640,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "2263:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5643,
                  "mutability": "mutable",
                  "name": "signature",
                  "nameLocation": "2290:9:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5703,
                  "src": "2277:22:30",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 5642,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "2277:5:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2262:38:30"
            },
            "returnParameters": {
              "id": 5650,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5646,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5703,
                  "src": "2324:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5645,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2324:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5649,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5703,
                  "src": "2333:12:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_enum$_RecoverError_$5584",
                    "typeString": "enum ECDSA.RecoverError"
                  },
                  "typeName": {
                    "id": 5648,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 5647,
                      "name": "RecoverError",
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 5584,
                      "src": "2333:12:30"
                    },
                    "referencedDeclaration": 5584,
                    "src": "2333:12:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_enum$_RecoverError_$5584",
                      "typeString": "enum ECDSA.RecoverError"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "2323:23:30"
            },
            "scope": 5981,
            "src": "2243:1279:30",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5729,
              "nodeType": "Block",
              "src": "4395:140:30",
              "statements": [
                {
                  "assignments": [
                    5714,
                    5717
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5714,
                      "mutability": "mutable",
                      "name": "recovered",
                      "nameLocation": "4414:9:30",
                      "nodeType": "VariableDeclaration",
                      "scope": 5729,
                      "src": "4406:17:30",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 5713,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "4406:7:30",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 5717,
                      "mutability": "mutable",
                      "name": "error",
                      "nameLocation": "4438:5:30",
                      "nodeType": "VariableDeclaration",
                      "scope": 5729,
                      "src": "4425:18:30",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_enum$_RecoverError_$5584",
                        "typeString": "enum ECDSA.RecoverError"
                      },
                      "typeName": {
                        "id": 5716,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 5715,
                          "name": "RecoverError",
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 5584,
                          "src": "4425:12:30"
                        },
                        "referencedDeclaration": 5584,
                        "src": "4425:12:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 5722,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 5719,
                        "name": "hash",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5706,
                        "src": "4458:4:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 5720,
                        "name": "signature",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5708,
                        "src": "4464:9:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 5718,
                      "name": "tryRecover",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5703,
                        5777,
                        5888
                      ],
                      "referencedDeclaration": 5703,
                      "src": "4447:10:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes_memory_ptr_$returns$_t_address_$_t_enum$_RecoverError_$5584_$",
                        "typeString": "function (bytes32,bytes memory) pure returns (address,enum ECDSA.RecoverError)"
                      }
                    },
                    "id": 5721,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4447:27:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                      "typeString": "tuple(address,enum ECDSA.RecoverError)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4405:69:30"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 5724,
                        "name": "error",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5717,
                        "src": "4496:5:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      ],
                      "id": 5723,
                      "name": "_throwError",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5638,
                      "src": "4484:11:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_enum$_RecoverError_$5584_$returns$__$",
                        "typeString": "function (enum ECDSA.RecoverError) pure"
                      }
                    },
                    "id": 5725,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4484:18:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5726,
                  "nodeType": "ExpressionStatement",
                  "src": "4484:18:30"
                },
                {
                  "expression": {
                    "id": 5727,
                    "name": "recovered",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 5714,
                    "src": "4519:9:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 5712,
                  "id": 5728,
                  "nodeType": "Return",
                  "src": "4512:16:30"
                }
              ]
            },
            "documentation": {
              "id": 5704,
              "nodeType": "StructuredDocumentation",
              "src": "3528:775:30",
              "text": " @dev Returns the address that signed a hashed message (`hash`) with\n `signature`. This address can then be used for verification purposes.\n The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n this function rejects them by requiring the `s` value to be in the lower\n half order, and the `v` value to be either 27 or 28.\n IMPORTANT: `hash` _must_ be the result of a hash operation for the\n verification to be secure: it is possible to craft signatures that\n recover to arbitrary addresses for non-hashed data. A safe way to ensure\n this is by receiving a hash of the original message (which may otherwise\n be too long), and then calling {toEthSignedMessageHash} on it."
            },
            "id": 5730,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "recover",
            "nameLocation": "4317:7:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5709,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5706,
                  "mutability": "mutable",
                  "name": "hash",
                  "nameLocation": "4333:4:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5730,
                  "src": "4325:12:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5705,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4325:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5708,
                  "mutability": "mutable",
                  "name": "signature",
                  "nameLocation": "4352:9:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5730,
                  "src": "4339:22:30",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 5707,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "4339:5:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4324:38:30"
            },
            "returnParameters": {
              "id": 5712,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5711,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5730,
                  "src": "4386:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5710,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4386:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4385:9:30"
            },
            "scope": 5981,
            "src": "4308:227:30",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5776,
              "nodeType": "Block",
              "src": "4922:203:30",
              "statements": [
                {
                  "assignments": [
                    5746
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5746,
                      "mutability": "mutable",
                      "name": "s",
                      "nameLocation": "4940:1:30",
                      "nodeType": "VariableDeclaration",
                      "scope": 5776,
                      "src": "4932:9:30",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      },
                      "typeName": {
                        "id": 5745,
                        "name": "bytes32",
                        "nodeType": "ElementaryTypeName",
                        "src": "4932:7:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 5753,
                  "initialValue": {
                    "commonType": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    },
                    "id": 5752,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 5747,
                      "name": "vs",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5737,
                      "src": "4944:2:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "&",
                    "rightExpression": {
                      "arguments": [
                        {
                          "hexValue": "307837666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666",
                          "id": 5750,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "4957:66:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_57896044618658097711785492504343953926634992332820282019728792003956564819967_by_1",
                            "typeString": "int_const 5789...(69 digits omitted)...9967"
                          },
                          "value": "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_rational_57896044618658097711785492504343953926634992332820282019728792003956564819967_by_1",
                            "typeString": "int_const 5789...(69 digits omitted)...9967"
                          }
                        ],
                        "id": 5749,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "4949:7:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_bytes32_$",
                          "typeString": "type(bytes32)"
                        },
                        "typeName": {
                          "id": 5748,
                          "name": "bytes32",
                          "nodeType": "ElementaryTypeName",
                          "src": "4949:7:30",
                          "typeDescriptions": {}
                        }
                      },
                      "id": 5751,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "4949:75:30",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes32",
                        "typeString": "bytes32"
                      }
                    },
                    "src": "4944:80:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4932:92:30"
                },
                {
                  "assignments": [
                    5755
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5755,
                      "mutability": "mutable",
                      "name": "v",
                      "nameLocation": "5040:1:30",
                      "nodeType": "VariableDeclaration",
                      "scope": 5776,
                      "src": "5034:7:30",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 5754,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "5034:5:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 5768,
                  "initialValue": {
                    "arguments": [
                      {
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 5766,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "components": [
                            {
                              "commonType": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              },
                              "id": 5763,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "leftExpression": {
                                "arguments": [
                                  {
                                    "id": 5760,
                                    "name": "vs",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 5737,
                                    "src": "5059:2:30",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_bytes32",
                                      "typeString": "bytes32"
                                    }
                                  ],
                                  "id": 5759,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "lValueRequested": false,
                                  "nodeType": "ElementaryTypeNameExpression",
                                  "src": "5051:7:30",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_type$_t_uint256_$",
                                    "typeString": "type(uint256)"
                                  },
                                  "typeName": {
                                    "id": 5758,
                                    "name": "uint256",
                                    "nodeType": "ElementaryTypeName",
                                    "src": "5051:7:30",
                                    "typeDescriptions": {}
                                  }
                                },
                                "id": 5761,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "typeConversion",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "5051:11:30",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "nodeType": "BinaryOperation",
                              "operator": ">>",
                              "rightExpression": {
                                "hexValue": "323535",
                                "id": 5762,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "kind": "number",
                                "lValueRequested": false,
                                "nodeType": "Literal",
                                "src": "5066:3:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_rational_255_by_1",
                                  "typeString": "int_const 255"
                                },
                                "value": "255"
                              },
                              "src": "5051:18:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "id": 5764,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "5050:20:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "+",
                        "rightExpression": {
                          "hexValue": "3237",
                          "id": 5765,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "5073:2:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_27_by_1",
                            "typeString": "int_const 27"
                          },
                          "value": "27"
                        },
                        "src": "5050:25:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 5757,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "5044:5:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_uint8_$",
                        "typeString": "type(uint8)"
                      },
                      "typeName": {
                        "id": 5756,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "5044:5:30",
                        "typeDescriptions": {}
                      }
                    },
                    "id": 5767,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5044:32:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5034:42:30"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 5770,
                        "name": "hash",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5733,
                        "src": "5104:4:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 5771,
                        "name": "v",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5755,
                        "src": "5110:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 5772,
                        "name": "r",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5735,
                        "src": "5113:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 5773,
                        "name": "s",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5746,
                        "src": "5116:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      ],
                      "id": 5769,
                      "name": "tryRecover",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5703,
                        5777,
                        5888
                      ],
                      "referencedDeclaration": 5888,
                      "src": "5093:10:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$5584_$",
                        "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError)"
                      }
                    },
                    "id": 5774,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5093:25:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                      "typeString": "tuple(address,enum ECDSA.RecoverError)"
                    }
                  },
                  "functionReturnParameters": 5744,
                  "id": 5775,
                  "nodeType": "Return",
                  "src": "5086:32:30"
                }
              ]
            },
            "documentation": {
              "id": 5731,
              "nodeType": "StructuredDocumentation",
              "src": "4541:243:30",
              "text": " @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n _Available since v4.3._"
            },
            "id": 5777,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "tryRecover",
            "nameLocation": "4798:10:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5738,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5733,
                  "mutability": "mutable",
                  "name": "hash",
                  "nameLocation": "4826:4:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5777,
                  "src": "4818:12:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5732,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4818:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5735,
                  "mutability": "mutable",
                  "name": "r",
                  "nameLocation": "4848:1:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5777,
                  "src": "4840:9:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5734,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4840:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5737,
                  "mutability": "mutable",
                  "name": "vs",
                  "nameLocation": "4867:2:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5777,
                  "src": "4859:10:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5736,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "4859:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4808:67:30"
            },
            "returnParameters": {
              "id": 5744,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5740,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5777,
                  "src": "4899:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5739,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4899:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5743,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5777,
                  "src": "4908:12:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_enum$_RecoverError_$5584",
                    "typeString": "enum ECDSA.RecoverError"
                  },
                  "typeName": {
                    "id": 5742,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 5741,
                      "name": "RecoverError",
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 5584,
                      "src": "4908:12:30"
                    },
                    "referencedDeclaration": 5584,
                    "src": "4908:12:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_enum$_RecoverError_$5584",
                      "typeString": "enum ECDSA.RecoverError"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "4898:23:30"
            },
            "scope": 5981,
            "src": "4789:336:30",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5806,
              "nodeType": "Block",
              "src": "5406:136:30",
              "statements": [
                {
                  "assignments": [
                    5790,
                    5793
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5790,
                      "mutability": "mutable",
                      "name": "recovered",
                      "nameLocation": "5425:9:30",
                      "nodeType": "VariableDeclaration",
                      "scope": 5806,
                      "src": "5417:17:30",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 5789,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "5417:7:30",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 5793,
                      "mutability": "mutable",
                      "name": "error",
                      "nameLocation": "5449:5:30",
                      "nodeType": "VariableDeclaration",
                      "scope": 5806,
                      "src": "5436:18:30",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_enum$_RecoverError_$5584",
                        "typeString": "enum ECDSA.RecoverError"
                      },
                      "typeName": {
                        "id": 5792,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 5791,
                          "name": "RecoverError",
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 5584,
                          "src": "5436:12:30"
                        },
                        "referencedDeclaration": 5584,
                        "src": "5436:12:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 5799,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 5795,
                        "name": "hash",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5780,
                        "src": "5469:4:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 5796,
                        "name": "r",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5782,
                        "src": "5475:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 5797,
                        "name": "vs",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5784,
                        "src": "5478:2:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      ],
                      "id": 5794,
                      "name": "tryRecover",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5703,
                        5777,
                        5888
                      ],
                      "referencedDeclaration": 5777,
                      "src": "5458:10:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$5584_$",
                        "typeString": "function (bytes32,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError)"
                      }
                    },
                    "id": 5798,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5458:23:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                      "typeString": "tuple(address,enum ECDSA.RecoverError)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5416:65:30"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 5801,
                        "name": "error",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5793,
                        "src": "5503:5:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      ],
                      "id": 5800,
                      "name": "_throwError",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5638,
                      "src": "5491:11:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_enum$_RecoverError_$5584_$returns$__$",
                        "typeString": "function (enum ECDSA.RecoverError) pure"
                      }
                    },
                    "id": 5802,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5491:18:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5803,
                  "nodeType": "ExpressionStatement",
                  "src": "5491:18:30"
                },
                {
                  "expression": {
                    "id": 5804,
                    "name": "recovered",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 5790,
                    "src": "5526:9:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 5788,
                  "id": 5805,
                  "nodeType": "Return",
                  "src": "5519:16:30"
                }
              ]
            },
            "documentation": {
              "id": 5778,
              "nodeType": "StructuredDocumentation",
              "src": "5131:154:30",
              "text": " @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n _Available since v4.2._"
            },
            "id": 5807,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "recover",
            "nameLocation": "5299:7:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5785,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5780,
                  "mutability": "mutable",
                  "name": "hash",
                  "nameLocation": "5324:4:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5807,
                  "src": "5316:12:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5779,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5316:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5782,
                  "mutability": "mutable",
                  "name": "r",
                  "nameLocation": "5346:1:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5807,
                  "src": "5338:9:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5781,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5338:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5784,
                  "mutability": "mutable",
                  "name": "vs",
                  "nameLocation": "5365:2:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5807,
                  "src": "5357:10:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5783,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5357:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5306:67:30"
            },
            "returnParameters": {
              "id": 5788,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5787,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5807,
                  "src": "5397:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5786,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5397:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5396:9:30"
            },
            "scope": 5981,
            "src": "5290:252:30",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5887,
              "nodeType": "Block",
              "src": "5865:1454:30",
              "statements": [
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 5829,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "arguments": [
                        {
                          "id": 5826,
                          "name": "s",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5816,
                          "src": "6761:1:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_bytes32",
                            "typeString": "bytes32"
                          }
                        ],
                        "id": 5825,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "6753:7:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_uint256_$",
                          "typeString": "type(uint256)"
                        },
                        "typeName": {
                          "id": 5824,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "6753:7:30",
                          "typeDescriptions": {}
                        }
                      },
                      "id": 5827,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "6753:10:30",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "hexValue": "307837464646464646464646464646464646464646464646464646464646464646463544353736453733353741343530314444464539324634363638314232304130",
                      "id": 5828,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "6766:66:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_57896044618658097711785492504343953926418782139537452191302581570759080747168_by_1",
                        "typeString": "int_const 5789...(69 digits omitted)...7168"
                      },
                      "value": "0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0"
                    },
                    "src": "6753:79:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 5839,
                  "nodeType": "IfStatement",
                  "src": "6749:161:30",
                  "trueBody": {
                    "id": 5838,
                    "nodeType": "Block",
                    "src": "6834:76:30",
                    "statements": [
                      {
                        "expression": {
                          "components": [
                            {
                              "arguments": [
                                {
                                  "hexValue": "30",
                                  "id": 5832,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "6864:1:30",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 5831,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "6856:7:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 5830,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "6856:7:30",
                                  "typeDescriptions": {}
                                }
                              },
                              "id": 5833,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6856:10:30",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "expression": {
                                "id": 5834,
                                "name": "RecoverError",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5584,
                                "src": "6868:12:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_enum$_RecoverError_$5584_$",
                                  "typeString": "type(enum ECDSA.RecoverError)"
                                }
                              },
                              "id": 5835,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "memberName": "InvalidSignatureS",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5582,
                              "src": "6868:30:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_enum$_RecoverError_$5584",
                                "typeString": "enum ECDSA.RecoverError"
                              }
                            }
                          ],
                          "id": 5836,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "6855:44:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                            "typeString": "tuple(address,enum ECDSA.RecoverError)"
                          }
                        },
                        "functionReturnParameters": 5823,
                        "id": 5837,
                        "nodeType": "Return",
                        "src": "6848:51:30"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 5846,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "commonType": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "id": 5842,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "id": 5840,
                        "name": "v",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5812,
                        "src": "6923:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "!=",
                      "rightExpression": {
                        "hexValue": "3237",
                        "id": 5841,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "6928:2:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_27_by_1",
                          "typeString": "int_const 27"
                        },
                        "value": "27"
                      },
                      "src": "6923:7:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "&&",
                    "rightExpression": {
                      "commonType": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "id": 5845,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "id": 5843,
                        "name": "v",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5812,
                        "src": "6934:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "!=",
                      "rightExpression": {
                        "hexValue": "3238",
                        "id": 5844,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "number",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "6939:2:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_rational_28_by_1",
                          "typeString": "int_const 28"
                        },
                        "value": "28"
                      },
                      "src": "6934:7:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "6923:18:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 5856,
                  "nodeType": "IfStatement",
                  "src": "6919:100:30",
                  "trueBody": {
                    "id": 5855,
                    "nodeType": "Block",
                    "src": "6943:76:30",
                    "statements": [
                      {
                        "expression": {
                          "components": [
                            {
                              "arguments": [
                                {
                                  "hexValue": "30",
                                  "id": 5849,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "6973:1:30",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 5848,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "6965:7:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 5847,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "6965:7:30",
                                  "typeDescriptions": {}
                                }
                              },
                              "id": 5850,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "6965:10:30",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "expression": {
                                "id": 5851,
                                "name": "RecoverError",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5584,
                                "src": "6977:12:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_enum$_RecoverError_$5584_$",
                                  "typeString": "type(enum ECDSA.RecoverError)"
                                }
                              },
                              "id": 5852,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "memberName": "InvalidSignatureV",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5583,
                              "src": "6977:30:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_enum$_RecoverError_$5584",
                                "typeString": "enum ECDSA.RecoverError"
                              }
                            }
                          ],
                          "id": 5853,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "6964:44:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                            "typeString": "tuple(address,enum ECDSA.RecoverError)"
                          }
                        },
                        "functionReturnParameters": 5823,
                        "id": 5854,
                        "nodeType": "Return",
                        "src": "6957:51:30"
                      }
                    ]
                  }
                },
                {
                  "assignments": [
                    5858
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5858,
                      "mutability": "mutable",
                      "name": "signer",
                      "nameLocation": "7121:6:30",
                      "nodeType": "VariableDeclaration",
                      "scope": 5887,
                      "src": "7113:14:30",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 5857,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "7113:7:30",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 5865,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 5860,
                        "name": "hash",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5810,
                        "src": "7140:4:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 5861,
                        "name": "v",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5812,
                        "src": "7146:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 5862,
                        "name": "r",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5814,
                        "src": "7149:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 5863,
                        "name": "s",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5816,
                        "src": "7152:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      ],
                      "id": 5859,
                      "name": "ecrecover",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4294967290,
                      "src": "7130:9:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_ecrecover_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$",
                        "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address)"
                      }
                    },
                    "id": 5864,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7130:24:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7113:41:30"
                },
                {
                  "condition": {
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 5871,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "id": 5866,
                      "name": "signer",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5858,
                      "src": "7168:6:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "arguments": [
                        {
                          "hexValue": "30",
                          "id": 5869,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "7186:1:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          }
                        ],
                        "id": 5868,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "nodeType": "ElementaryTypeNameExpression",
                        "src": "7178:7:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_type$_t_address_$",
                          "typeString": "type(address)"
                        },
                        "typeName": {
                          "id": 5867,
                          "name": "address",
                          "nodeType": "ElementaryTypeName",
                          "src": "7178:7:30",
                          "typeDescriptions": {}
                        }
                      },
                      "id": 5870,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "typeConversion",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "7178:10:30",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "7168:20:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 5881,
                  "nodeType": "IfStatement",
                  "src": "7164:101:30",
                  "trueBody": {
                    "id": 5880,
                    "nodeType": "Block",
                    "src": "7190:75:30",
                    "statements": [
                      {
                        "expression": {
                          "components": [
                            {
                              "arguments": [
                                {
                                  "hexValue": "30",
                                  "id": 5874,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": true,
                                  "kind": "number",
                                  "lValueRequested": false,
                                  "nodeType": "Literal",
                                  "src": "7220:1:30",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  },
                                  "value": "0"
                                }
                              ],
                              "expression": {
                                "argumentTypes": [
                                  {
                                    "typeIdentifier": "t_rational_0_by_1",
                                    "typeString": "int_const 0"
                                  }
                                ],
                                "id": 5873,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": true,
                                "lValueRequested": false,
                                "nodeType": "ElementaryTypeNameExpression",
                                "src": "7212:7:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_address_$",
                                  "typeString": "type(address)"
                                },
                                "typeName": {
                                  "id": 5872,
                                  "name": "address",
                                  "nodeType": "ElementaryTypeName",
                                  "src": "7212:7:30",
                                  "typeDescriptions": {}
                                }
                              },
                              "id": 5875,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "typeConversion",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "7212:10:30",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "expression": {
                                "id": 5876,
                                "name": "RecoverError",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5584,
                                "src": "7224:12:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_enum$_RecoverError_$5584_$",
                                  "typeString": "type(enum ECDSA.RecoverError)"
                                }
                              },
                              "id": 5877,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "memberName": "InvalidSignature",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5580,
                              "src": "7224:29:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_enum$_RecoverError_$5584",
                                "typeString": "enum ECDSA.RecoverError"
                              }
                            }
                          ],
                          "id": 5878,
                          "isConstant": false,
                          "isInlineArray": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "TupleExpression",
                          "src": "7211:43:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                            "typeString": "tuple(address,enum ECDSA.RecoverError)"
                          }
                        },
                        "functionReturnParameters": 5823,
                        "id": 5879,
                        "nodeType": "Return",
                        "src": "7204:50:30"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "components": [
                      {
                        "id": 5882,
                        "name": "signer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5858,
                        "src": "7283:6:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "expression": {
                          "id": 5883,
                          "name": "RecoverError",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 5584,
                          "src": "7291:12:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_enum$_RecoverError_$5584_$",
                            "typeString": "type(enum ECDSA.RecoverError)"
                          }
                        },
                        "id": 5884,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "lValueRequested": false,
                        "memberName": "NoError",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 5579,
                        "src": "7291:20:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      }
                    ],
                    "id": 5885,
                    "isConstant": false,
                    "isInlineArray": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "TupleExpression",
                    "src": "7282:30:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                      "typeString": "tuple(address,enum ECDSA.RecoverError)"
                    }
                  },
                  "functionReturnParameters": 5823,
                  "id": 5886,
                  "nodeType": "Return",
                  "src": "7275:37:30"
                }
              ]
            },
            "documentation": {
              "id": 5808,
              "nodeType": "StructuredDocumentation",
              "src": "5548:163:30",
              "text": " @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n `r` and `s` signature fields separately.\n _Available since v4.3._"
            },
            "id": 5888,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "tryRecover",
            "nameLocation": "5725:10:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5817,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5810,
                  "mutability": "mutable",
                  "name": "hash",
                  "nameLocation": "5753:4:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5888,
                  "src": "5745:12:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5809,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5745:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5812,
                  "mutability": "mutable",
                  "name": "v",
                  "nameLocation": "5773:1:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5888,
                  "src": "5767:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 5811,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "5767:5:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5814,
                  "mutability": "mutable",
                  "name": "r",
                  "nameLocation": "5792:1:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5888,
                  "src": "5784:9:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5813,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5784:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5816,
                  "mutability": "mutable",
                  "name": "s",
                  "nameLocation": "5811:1:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5888,
                  "src": "5803:9:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5815,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "5803:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5735:83:30"
            },
            "returnParameters": {
              "id": 5823,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5819,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5888,
                  "src": "5842:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5818,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5842:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5822,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5888,
                  "src": "5851:12:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_enum$_RecoverError_$5584",
                    "typeString": "enum ECDSA.RecoverError"
                  },
                  "typeName": {
                    "id": 5821,
                    "nodeType": "UserDefinedTypeName",
                    "pathNode": {
                      "id": 5820,
                      "name": "RecoverError",
                      "nodeType": "IdentifierPath",
                      "referencedDeclaration": 5584,
                      "src": "5851:12:30"
                    },
                    "referencedDeclaration": 5584,
                    "src": "5851:12:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_enum$_RecoverError_$5584",
                      "typeString": "enum ECDSA.RecoverError"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "5841:23:30"
            },
            "scope": 5981,
            "src": "5716:1603:30",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5920,
              "nodeType": "Block",
              "src": "7584:138:30",
              "statements": [
                {
                  "assignments": [
                    5903,
                    5906
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5903,
                      "mutability": "mutable",
                      "name": "recovered",
                      "nameLocation": "7603:9:30",
                      "nodeType": "VariableDeclaration",
                      "scope": 5920,
                      "src": "7595:17:30",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 5902,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "7595:7:30",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    },
                    {
                      "constant": false,
                      "id": 5906,
                      "mutability": "mutable",
                      "name": "error",
                      "nameLocation": "7627:5:30",
                      "nodeType": "VariableDeclaration",
                      "scope": 5920,
                      "src": "7614:18:30",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_enum$_RecoverError_$5584",
                        "typeString": "enum ECDSA.RecoverError"
                      },
                      "typeName": {
                        "id": 5905,
                        "nodeType": "UserDefinedTypeName",
                        "pathNode": {
                          "id": 5904,
                          "name": "RecoverError",
                          "nodeType": "IdentifierPath",
                          "referencedDeclaration": 5584,
                          "src": "7614:12:30"
                        },
                        "referencedDeclaration": 5584,
                        "src": "7614:12:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 5913,
                  "initialValue": {
                    "arguments": [
                      {
                        "id": 5908,
                        "name": "hash",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5891,
                        "src": "7647:4:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 5909,
                        "name": "v",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5893,
                        "src": "7653:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "id": 5910,
                        "name": "r",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5895,
                        "src": "7656:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      },
                      {
                        "id": 5911,
                        "name": "s",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5897,
                        "src": "7659:1:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        },
                        {
                          "typeIdentifier": "t_bytes32",
                          "typeString": "bytes32"
                        }
                      ],
                      "id": 5907,
                      "name": "tryRecover",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        5703,
                        5777,
                        5888
                      ],
                      "referencedDeclaration": 5888,
                      "src": "7636:10:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_bytes32_$_t_uint8_$_t_bytes32_$_t_bytes32_$returns$_t_address_$_t_enum$_RecoverError_$5584_$",
                        "typeString": "function (bytes32,uint8,bytes32,bytes32) pure returns (address,enum ECDSA.RecoverError)"
                      }
                    },
                    "id": 5912,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7636:25:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_address_$_t_enum$_RecoverError_$5584_$",
                      "typeString": "tuple(address,enum ECDSA.RecoverError)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7594:67:30"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 5915,
                        "name": "error",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5906,
                        "src": "7683:5:30",
                        "typeDescriptions": {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_enum$_RecoverError_$5584",
                          "typeString": "enum ECDSA.RecoverError"
                        }
                      ],
                      "id": 5914,
                      "name": "_throwError",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 5638,
                      "src": "7671:11:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_enum$_RecoverError_$5584_$returns$__$",
                        "typeString": "function (enum ECDSA.RecoverError) pure"
                      }
                    },
                    "id": 5916,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "7671:18:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 5917,
                  "nodeType": "ExpressionStatement",
                  "src": "7671:18:30"
                },
                {
                  "expression": {
                    "id": 5918,
                    "name": "recovered",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 5903,
                    "src": "7706:9:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 5901,
                  "id": 5919,
                  "nodeType": "Return",
                  "src": "7699:16:30"
                }
              ]
            },
            "documentation": {
              "id": 5889,
              "nodeType": "StructuredDocumentation",
              "src": "7325:122:30",
              "text": " @dev Overload of {ECDSA-recover} that receives the `v`,\n `r` and `s` signature fields separately."
            },
            "id": 5921,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "recover",
            "nameLocation": "7461:7:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5898,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5891,
                  "mutability": "mutable",
                  "name": "hash",
                  "nameLocation": "7486:4:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5921,
                  "src": "7478:12:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5890,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "7478:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5893,
                  "mutability": "mutable",
                  "name": "v",
                  "nameLocation": "7506:1:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5921,
                  "src": "7500:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 5892,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "7500:5:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5895,
                  "mutability": "mutable",
                  "name": "r",
                  "nameLocation": "7525:1:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5921,
                  "src": "7517:9:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5894,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "7517:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5897,
                  "mutability": "mutable",
                  "name": "s",
                  "nameLocation": "7544:1:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5921,
                  "src": "7536:9:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5896,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "7536:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7468:83:30"
            },
            "returnParameters": {
              "id": 5901,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5900,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5921,
                  "src": "7575:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5899,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "7575:7:30",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "7574:9:30"
            },
            "scope": 5981,
            "src": "7452:270:30",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5937,
              "nodeType": "Block",
              "src": "8090:187:30",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "hexValue": "19457468657265756d205369676e6564204d6573736167653a0a3332",
                            "id": 5932,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "8228:34:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73",
                              "typeString": "literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a3332\""
                            },
                            "value": "\u0019Ethereum Signed Message:\n32"
                          },
                          {
                            "id": 5933,
                            "name": "hash",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5924,
                            "src": "8264:4:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_stringliteral_178a2411ab6fbc1ba11064408972259c558d0e82fd48b0aba3ad81d14f065e73",
                              "typeString": "literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a3332\""
                            },
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          ],
                          "expression": {
                            "id": 5930,
                            "name": "abi",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4294967295,
                            "src": "8211:3:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_abi",
                              "typeString": "abi"
                            }
                          },
                          "id": 5931,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberName": "encodePacked",
                          "nodeType": "MemberAccess",
                          "src": "8211:16:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                            "typeString": "function () pure returns (bytes memory)"
                          }
                        },
                        "id": 5934,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "8211:58:30",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 5929,
                      "name": "keccak256",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4294967288,
                      "src": "8201:9:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                        "typeString": "function (bytes memory) pure returns (bytes32)"
                      }
                    },
                    "id": 5935,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8201:69:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "functionReturnParameters": 5928,
                  "id": 5936,
                  "nodeType": "Return",
                  "src": "8194:76:30"
                }
              ]
            },
            "documentation": {
              "id": 5922,
              "nodeType": "StructuredDocumentation",
              "src": "7728:279:30",
              "text": " @dev Returns an Ethereum Signed Message, created from a `hash`. This\n produces hash corresponding to the one signed with the\n https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n JSON-RPC method as part of EIP-191.\n See {recover}."
            },
            "id": 5938,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "toEthSignedMessageHash",
            "nameLocation": "8021:22:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5925,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5924,
                  "mutability": "mutable",
                  "name": "hash",
                  "nameLocation": "8052:4:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5938,
                  "src": "8044:12:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5923,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "8044:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8043:14:30"
            },
            "returnParameters": {
              "id": 5928,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5927,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5938,
                  "src": "8081:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5926,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "8081:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8080:9:30"
            },
            "scope": 5981,
            "src": "8012:265:30",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5959,
              "nodeType": "Block",
              "src": "8642:116:30",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "hexValue": "19457468657265756d205369676e6564204d6573736167653a0a",
                            "id": 5949,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "8686:32:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_9af2d9c228f6cfddaa6d1e5b94e0bce4ab16bd9a472a2b7fbfd74ebff4c720b4",
                              "typeString": "literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a\""
                            },
                            "value": "\u0019Ethereum Signed Message:\n"
                          },
                          {
                            "arguments": [
                              {
                                "expression": {
                                  "id": 5952,
                                  "name": "s",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 5941,
                                  "src": "8737:1:30",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_bytes_memory_ptr",
                                    "typeString": "bytes memory"
                                  }
                                },
                                "id": 5953,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "length",
                                "nodeType": "MemberAccess",
                                "src": "8737:8:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "id": 5950,
                                "name": "Strings",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 5574,
                                "src": "8720:7:30",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_type$_t_contract$_Strings_$5574_$",
                                  "typeString": "type(library Strings)"
                                }
                              },
                              "id": 5951,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "toString",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 5456,
                              "src": "8720:16:30",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$returns$_t_string_memory_ptr_$",
                                "typeString": "function (uint256) pure returns (string memory)"
                              }
                            },
                            "id": 5954,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "8720:26:30",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_memory_ptr",
                              "typeString": "string memory"
                            }
                          },
                          {
                            "id": 5955,
                            "name": "s",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5941,
                            "src": "8748:1:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes memory"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_stringliteral_9af2d9c228f6cfddaa6d1e5b94e0bce4ab16bd9a472a2b7fbfd74ebff4c720b4",
                              "typeString": "literal_string hex\"19457468657265756d205369676e6564204d6573736167653a0a\""
                            },
                            {
                              "typeIdentifier": "t_string_memory_ptr",
                              "typeString": "string memory"
                            },
                            {
                              "typeIdentifier": "t_bytes_memory_ptr",
                              "typeString": "bytes memory"
                            }
                          ],
                          "expression": {
                            "id": 5947,
                            "name": "abi",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4294967295,
                            "src": "8669:3:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_abi",
                              "typeString": "abi"
                            }
                          },
                          "id": 5948,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberName": "encodePacked",
                          "nodeType": "MemberAccess",
                          "src": "8669:16:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                            "typeString": "function () pure returns (bytes memory)"
                          }
                        },
                        "id": 5956,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "8669:81:30",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 5946,
                      "name": "keccak256",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4294967288,
                      "src": "8659:9:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                        "typeString": "function (bytes memory) pure returns (bytes32)"
                      }
                    },
                    "id": 5957,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8659:92:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "functionReturnParameters": 5945,
                  "id": 5958,
                  "nodeType": "Return",
                  "src": "8652:99:30"
                }
              ]
            },
            "documentation": {
              "id": 5939,
              "nodeType": "StructuredDocumentation",
              "src": "8283:274:30",
              "text": " @dev Returns an Ethereum Signed Message, created from `s`. This\n produces hash corresponding to the one signed with the\n https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n JSON-RPC method as part of EIP-191.\n See {recover}."
            },
            "id": 5960,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "toEthSignedMessageHash",
            "nameLocation": "8571:22:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5942,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5941,
                  "mutability": "mutable",
                  "name": "s",
                  "nameLocation": "8607:1:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5960,
                  "src": "8594:14:30",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_memory_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 5940,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "8594:5:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8593:16:30"
            },
            "returnParameters": {
              "id": 5945,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5944,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5960,
                  "src": "8633:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5943,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "8633:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "8632:9:30"
            },
            "scope": 5981,
            "src": "8562:196:30",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5979,
              "nodeType": "Block",
              "src": "9199:92:30",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "hexValue": "1901",
                            "id": 5973,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "9243:10:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541",
                              "typeString": "literal_string hex\"1901\""
                            },
                            "value": "\u0019\u0001"
                          },
                          {
                            "id": 5974,
                            "name": "domainSeparator",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5963,
                            "src": "9255:15:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          },
                          {
                            "id": 5975,
                            "name": "structHash",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 5965,
                            "src": "9272:10:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_stringliteral_301a50b291d33ce1e8e9064e3f6a6c51d902ec22892b50d58abf6357c6a45541",
                              "typeString": "literal_string hex\"1901\""
                            },
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            },
                            {
                              "typeIdentifier": "t_bytes32",
                              "typeString": "bytes32"
                            }
                          ],
                          "expression": {
                            "id": 5971,
                            "name": "abi",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4294967295,
                            "src": "9226:3:30",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_abi",
                              "typeString": "abi"
                            }
                          },
                          "id": 5972,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberName": "encodePacked",
                          "nodeType": "MemberAccess",
                          "src": "9226:16:30",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_abiencodepacked_pure$__$returns$_t_bytes_memory_ptr_$",
                            "typeString": "function () pure returns (bytes memory)"
                          }
                        },
                        "id": 5976,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "9226:57:30",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "id": 5970,
                      "name": "keccak256",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 4294967288,
                      "src": "9216:9:30",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$",
                        "typeString": "function (bytes memory) pure returns (bytes32)"
                      }
                    },
                    "id": 5977,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "9216:68:30",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "functionReturnParameters": 5969,
                  "id": 5978,
                  "nodeType": "Return",
                  "src": "9209:75:30"
                }
              ]
            },
            "documentation": {
              "id": 5961,
              "nodeType": "StructuredDocumentation",
              "src": "8764:328:30",
              "text": " @dev Returns an Ethereum Signed Typed Data, created from a\n `domainSeparator` and a `structHash`. This produces hash corresponding\n to the one signed with the\n https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n JSON-RPC method as part of EIP-712.\n See {recover}."
            },
            "id": 5980,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "toTypedDataHash",
            "nameLocation": "9106:15:30",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5966,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5963,
                  "mutability": "mutable",
                  "name": "domainSeparator",
                  "nameLocation": "9130:15:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5980,
                  "src": "9122:23:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5962,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "9122:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5965,
                  "mutability": "mutable",
                  "name": "structHash",
                  "nameLocation": "9155:10:30",
                  "nodeType": "VariableDeclaration",
                  "scope": 5980,
                  "src": "9147:18:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5964,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "9147:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "9121:45:30"
            },
            "returnParameters": {
              "id": 5969,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5968,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 5980,
                  "src": "9190:7:30",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes32",
                    "typeString": "bytes32"
                  },
                  "typeName": {
                    "id": 5967,
                    "name": "bytes32",
                    "nodeType": "ElementaryTypeName",
                    "src": "9190:7:30",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes32",
                      "typeString": "bytes32"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "9189:9:30"
            },
            "scope": 5981,
            "src": "9097:194:30",
            "stateMutability": "pure",
            "virtual": false,
            "visibility": "internal"
          }
        ],
        "scope": 5982,
        "src": "369:8924:30",
        "usedErrors": []
      }
    ],
    "src": "112:9182:30"
  },
  "compiler": {
    "name": "solc",
    "version": "0.8.11+commit.d7f03943.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.4.4",
  "updatedAt": "2022-03-06T23:47:11.061Z",
  "devdoc": {
    "details": "Elliptic Curve Digital Signature Algorithm (ECDSA) operations. These functions can be used to verify that a message was signed by the holder of the private keys of a given address.",
    "kind": "dev",
    "methods": {},
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  }
}