{
  "fileName": "TokenTimelock.sol",
  "contractName": "TokenTimelock",
  "source": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.7.0;\n\nimport \"./SafeERC20.sol\";\n\n/**\n * @dev A token holder contract that will allow a beneficiary to extract the\n * tokens after a given release time.\n *\n * Useful for simple vesting schedules like \"advisors get all of their tokens\n * after 1 year\".\n */\ncontract TokenTimelock {\n    using SafeERC20 for IERC20;\n\n    // ERC20 basic token contract being held\n    IERC20 private _token;\n\n    // beneficiary of tokens after they are released\n    address private _beneficiary;\n\n    // timestamp when token release is enabled\n    uint256 private _releaseTime;\n\n    constructor (IERC20 token, address beneficiary, uint256 releaseTime) {\n        // solhint-disable-next-line not-rely-on-time\n        require(releaseTime > block.timestamp, \"TokenTimelock: release time is before current time\");\n        _token = token;\n        _beneficiary = beneficiary;\n        _releaseTime = releaseTime;\n    }\n\n    /**\n     * @return the token being held.\n     */\n    function token() public view returns (IERC20) {\n        return _token;\n    }\n\n    /**\n     * @return the beneficiary of the tokens.\n     */\n    function beneficiary() public view returns (address) {\n        return _beneficiary;\n    }\n\n    /**\n     * @return the time when the tokens are released.\n     */\n    function releaseTime() public view returns (uint256) {\n        return _releaseTime;\n    }\n\n    /**\n     * @notice Transfers tokens held by timelock to beneficiary.\n     */\n    function release() public virtual {\n        // solhint-disable-next-line not-rely-on-time\n        require(block.timestamp >= _releaseTime, \"TokenTimelock: current time is before release time\");\n\n        uint256 amount = _token.balanceOf(address(this));\n        require(amount > 0, \"TokenTimelock: no tokens to release\");\n\n        _token.safeTransfer(_beneficiary, amount);\n    }\n}\n",
  "sourcePath": "contracts/token/ERC20/TokenTimelock.sol",
  "sourceMap": "307:1557:91:-:0;;;612:328;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;767:15;753:11;:29;745:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;856:5;847:6;;:14;;;;;;;;;;;;;;;;;;886:11;871:12;;:26;;;;;;;;;;;;;;;;;;922:11;907:12;:26;;;;612:328;;;307:1557;;;;;;",
  "deployedSourceMap": "307:1557:91:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1143:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1484:378;;;:::i;:::-;;1308:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;999:76;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1143:89;1187:7;1213:12;;;;;;;;;;;1206:19;;1143:89;:::o;1484:378::-;1609:12;;1590:15;:31;;1582:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1687:14;1704:6;;;;;;;;;;;:16;;;1729:4;1704:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1687:48;;1762:1;1753:6;:10;1745:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1814:41;1834:12;;;;;;;;;;;1848:6;1814;;;;;;;;;;:19;;;;:41;;;;;:::i;:::-;1484:378;:::o;1308:89::-;1352:7;1378:12;;1371:19;;1308:89;:::o;999:76::-;1037:6;1062;;;;;;;;;;;1055:13;;999:76;:::o;696:175:90:-;778:86;798:5;828:23;;;853:2;857:5;805:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;778:19;:86::i;:::-;696:175;;;:::o;2959:751::-;3378:23;3404:69;3432:4;3404:69;;;;;;;;;;;;;;;;;3412:5;3404:27;;;;:69;;;;;:::i;:::-;3378:95;;3507:1;3487:10;:17;:21;3483:221;;;3627:10;3616:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3608:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3483:221;2959:751;;;:::o;3573:194:104:-;3676:12;3707:53;3730:6;3738:4;3744:1;3747:12;3707:22;:53::i;:::-;3700:60;;3573:194;;;;;:::o;4920:958::-;5050:12;5082:18;5093:6;5082:10;:18::i;:::-;5074:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5205:12;5219:23;5246:6;:11;;5266:8;5277:4;5246:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5204:78;;;;5296:7;5292:580;;;5326:10;5319:17;;;;;;5292:580;5457:1;5437:10;:17;:21;5433:429;;;5695:10;5689:17;5755:15;5742:10;5738:2;5734:19;5727:44;5644:145;5834:12;5827:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4920:958;;;;;;;:::o;718:413::-;778:4;981:12;1090:7;1078:20;1070:28;;1123:1;1116:4;:8;1109:15;;;718:413;;;:::o",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract IERC20",
          "name": "token",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "beneficiary",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "releaseTime",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "beneficiary",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "release",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "releaseTime",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "token",
      "outputs": [
        {
          "internalType": "contract IERC20",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "ast": {
    "absolutePath": "contracts/token/ERC20/TokenTimelock.sol",
    "exportedSymbols": {
      "TokenTimelock": [
        10100
      ]
    },
    "id": 10101,
    "license": "MIT",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 9994,
        "literals": [
          "solidity",
          "^",
          "0.7",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "33:23:91"
      },
      {
        "absolutePath": "contracts/token/ERC20/SafeERC20.sol",
        "file": "./SafeERC20.sol",
        "id": 9995,
        "nodeType": "ImportDirective",
        "scope": 10101,
        "sourceUnit": 9993,
        "src": "58:25:91",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": {
          "id": 9996,
          "nodeType": "StructuredDocumentation",
          "src": "85:221:91",
          "text": " @dev A token holder contract that will allow a beneficiary to extract the\n tokens after a given release time.\n Useful for simple vesting schedules like \"advisors get all of their tokens\n after 1 year\"."
        },
        "fullyImplemented": true,
        "id": 10100,
        "linearizedBaseContracts": [
          10100
        ],
        "name": "TokenTimelock",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 9999,
            "libraryName": {
              "contractScope": null,
              "id": 9997,
              "name": "SafeERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 9992,
              "src": "342:9:91",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeERC20_$9992",
                "typeString": "library SafeERC20"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "336:27:91",
            "typeName": {
              "contractScope": null,
              "id": 9998,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 9779,
              "src": "356:6:91",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$9779",
                "typeString": "contract IERC20"
              }
            }
          },
          {
            "constant": false,
            "id": 10001,
            "mutability": "mutable",
            "name": "_token",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 10100,
            "src": "414:21:91",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IERC20_$9779",
              "typeString": "contract IERC20"
            },
            "typeName": {
              "contractScope": null,
              "id": 10000,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 9779,
              "src": "414:6:91",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$9779",
                "typeString": "contract IERC20"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 10003,
            "mutability": "mutable",
            "name": "_beneficiary",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 10100,
            "src": "495:28:91",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 10002,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "495:7:91",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 10005,
            "mutability": "mutable",
            "name": "_releaseTime",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 10100,
            "src": "577:28:91",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 10004,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "577:7:91",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 10034,
              "nodeType": "Block",
              "src": "681:259:91",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 10018,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 10015,
                          "name": "releaseTime",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10011,
                          "src": "753:11:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">",
                        "rightExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 10016,
                            "name": "block",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -4,
                            "src": "767:5:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_block",
                              "typeString": "block"
                            }
                          },
                          "id": 10017,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "timestamp",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "767:15:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "753:29:91",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "546f6b656e54696d656c6f636b3a2072656c656173652074696d65206973206265666f72652063757272656e742074696d65",
                        "id": 10019,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "784:52:91",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_e1658b776de3735ba90dc86438c12854f3617d6d488d64009fdab5928e27c313",
                          "typeString": "literal_string \"TokenTimelock: release time is before current time\""
                        },
                        "value": "TokenTimelock: release time is before current time"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_e1658b776de3735ba90dc86438c12854f3617d6d488d64009fdab5928e27c313",
                          "typeString": "literal_string \"TokenTimelock: release time is before current time\""
                        }
                      ],
                      "id": 10014,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "745:7:91",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 10020,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "745:92:91",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10021,
                  "nodeType": "ExpressionStatement",
                  "src": "745:92:91"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 10024,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 10022,
                      "name": "_token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10001,
                      "src": "847:6:91",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$9779",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 10023,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10007,
                      "src": "856:5:91",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$9779",
                        "typeString": "contract IERC20"
                      }
                    },
                    "src": "847:14:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$9779",
                      "typeString": "contract IERC20"
                    }
                  },
                  "id": 10025,
                  "nodeType": "ExpressionStatement",
                  "src": "847:14:91"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 10028,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 10026,
                      "name": "_beneficiary",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10003,
                      "src": "871:12:91",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 10027,
                      "name": "beneficiary",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10009,
                      "src": "886:11:91",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "871:26:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 10029,
                  "nodeType": "ExpressionStatement",
                  "src": "871:26:91"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 10032,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 10030,
                      "name": "_releaseTime",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10005,
                      "src": "907:12:91",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 10031,
                      "name": "releaseTime",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 10011,
                      "src": "922:11:91",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "907:26:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 10033,
                  "nodeType": "ExpressionStatement",
                  "src": "907:26:91"
                }
              ]
            },
            "documentation": null,
            "id": 10035,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10012,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10007,
                  "mutability": "mutable",
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10035,
                  "src": "625:12:91",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$9779",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 10006,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9779,
                    "src": "625:6:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$9779",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 10009,
                  "mutability": "mutable",
                  "name": "beneficiary",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10035,
                  "src": "639:19:91",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 10008,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "639:7:91",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 10011,
                  "mutability": "mutable",
                  "name": "releaseTime",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10035,
                  "src": "660:19:91",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 10010,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "660:7:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "624:56:91"
            },
            "returnParameters": {
              "id": 10013,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "681:0:91"
            },
            "scope": 10100,
            "src": "612:328:91",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 10043,
              "nodeType": "Block",
              "src": "1045:30:91",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 10041,
                    "name": "_token",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 10001,
                    "src": "1062:6:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$9779",
                      "typeString": "contract IERC20"
                    }
                  },
                  "functionReturnParameters": 10040,
                  "id": 10042,
                  "nodeType": "Return",
                  "src": "1055:13:91"
                }
              ]
            },
            "documentation": {
              "id": 10036,
              "nodeType": "StructuredDocumentation",
              "src": "946:48:91",
              "text": " @return the token being held."
            },
            "functionSelector": "fc0c546a",
            "id": 10044,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "token",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10037,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1013:2:91"
            },
            "returnParameters": {
              "id": 10040,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10039,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10044,
                  "src": "1037:6:91",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$9779",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 10038,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 9779,
                    "src": "1037:6:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$9779",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1036:8:91"
            },
            "scope": 10100,
            "src": "999:76:91",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 10052,
              "nodeType": "Block",
              "src": "1196:36:91",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 10050,
                    "name": "_beneficiary",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 10003,
                    "src": "1213:12:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 10049,
                  "id": 10051,
                  "nodeType": "Return",
                  "src": "1206:19:91"
                }
              ]
            },
            "documentation": {
              "id": 10045,
              "nodeType": "StructuredDocumentation",
              "src": "1081:57:91",
              "text": " @return the beneficiary of the tokens."
            },
            "functionSelector": "38af3eed",
            "id": 10053,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "beneficiary",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10046,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1163:2:91"
            },
            "returnParameters": {
              "id": 10049,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10048,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10053,
                  "src": "1187:7:91",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 10047,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1187:7:91",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1186:9:91"
            },
            "scope": 10100,
            "src": "1143:89:91",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 10061,
              "nodeType": "Block",
              "src": "1361:36:91",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 10059,
                    "name": "_releaseTime",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 10005,
                    "src": "1378:12:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 10058,
                  "id": 10060,
                  "nodeType": "Return",
                  "src": "1371:19:91"
                }
              ]
            },
            "documentation": {
              "id": 10054,
              "nodeType": "StructuredDocumentation",
              "src": "1238:65:91",
              "text": " @return the time when the tokens are released."
            },
            "functionSelector": "b91d4001",
            "id": 10062,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "releaseTime",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10055,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1328:2:91"
            },
            "returnParameters": {
              "id": 10058,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 10057,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 10062,
                  "src": "1352:7:91",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 10056,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1352:7:91",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1351:9:91"
            },
            "scope": 10100,
            "src": "1308:89:91",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 10098,
              "nodeType": "Block",
              "src": "1518:344:91",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 10070,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 10067,
                            "name": "block",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -4,
                            "src": "1590:5:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_block",
                              "typeString": "block"
                            }
                          },
                          "id": 10068,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "timestamp",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "1590:15:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 10069,
                          "name": "_releaseTime",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10005,
                          "src": "1609:12:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "1590:31:91",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "546f6b656e54696d656c6f636b3a2063757272656e742074696d65206973206265666f72652072656c656173652074696d65",
                        "id": 10071,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1623:52:91",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_0345c6084b4d4be2f1249aa1f58ddc5a11b524aacb744b63dfad68c56d61fad0",
                          "typeString": "literal_string \"TokenTimelock: current time is before release time\""
                        },
                        "value": "TokenTimelock: current time is before release time"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_0345c6084b4d4be2f1249aa1f58ddc5a11b524aacb744b63dfad68c56d61fad0",
                          "typeString": "literal_string \"TokenTimelock: current time is before release time\""
                        }
                      ],
                      "id": 10066,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "1582:7:91",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 10072,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1582:94:91",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10073,
                  "nodeType": "ExpressionStatement",
                  "src": "1582:94:91"
                },
                {
                  "assignments": [
                    10075
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 10075,
                      "mutability": "mutable",
                      "name": "amount",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 10098,
                      "src": "1687:14:91",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 10074,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "1687:7:91",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 10083,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 10080,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "1729:4:91",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TokenTimelock_$10100",
                              "typeString": "contract TokenTimelock"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_TokenTimelock_$10100",
                              "typeString": "contract TokenTimelock"
                            }
                          ],
                          "id": 10079,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "1721:7:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 10078,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "1721:7:91",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 10081,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1721:13:91",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 10076,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10001,
                        "src": "1704:6:91",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$9779",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 10077,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "balanceOf",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 9718,
                      "src": "1704:16:91",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                        "typeString": "function (address) view external returns (uint256)"
                      }
                    },
                    "id": 10082,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1704:31:91",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1687:48:91"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 10087,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 10085,
                          "name": "amount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 10075,
                          "src": "1753:6:91",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 10086,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "1762:1:91",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "1753:10:91",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "546f6b656e54696d656c6f636b3a206e6f20746f6b656e7320746f2072656c65617365",
                        "id": 10088,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1765:37:91",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_fd167cd15f7f49233a4aac5b2fadd1b9f782ba42f4eadaf31348954b9436eae8",
                          "typeString": "literal_string \"TokenTimelock: no tokens to release\""
                        },
                        "value": "TokenTimelock: no tokens to release"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_fd167cd15f7f49233a4aac5b2fadd1b9f782ba42f4eadaf31348954b9436eae8",
                          "typeString": "literal_string \"TokenTimelock: no tokens to release\""
                        }
                      ],
                      "id": 10084,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "1745:7:91",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 10089,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1745:58:91",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10090,
                  "nodeType": "ExpressionStatement",
                  "src": "1745:58:91"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 10094,
                        "name": "_beneficiary",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10003,
                        "src": "1834:12:91",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 10095,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10075,
                        "src": "1848:6:91",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 10091,
                        "name": "_token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 10001,
                        "src": "1814:6:91",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$9779",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 10093,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "safeTransfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 9813,
                      "src": "1814:19:91",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$9779_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$9779_$",
                        "typeString": "function (contract IERC20,address,uint256)"
                      }
                    },
                    "id": 10096,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1814:41:91",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 10097,
                  "nodeType": "ExpressionStatement",
                  "src": "1814:41:91"
                }
              ]
            },
            "documentation": {
              "id": 10063,
              "nodeType": "StructuredDocumentation",
              "src": "1403:76:91",
              "text": " @notice Transfers tokens held by timelock to beneficiary."
            },
            "functionSelector": "86d1a69f",
            "id": 10099,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "release",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 10064,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1500:2:91"
            },
            "returnParameters": {
              "id": 10065,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1518:0:91"
            },
            "scope": 10100,
            "src": "1484:378:91",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "public"
          }
        ],
        "scope": 10101,
        "src": "307:1557:91"
      }
    ],
    "src": "33:1832:91"
  },
  "bytecode": "0x608060405234801561001057600080fd5b5060405161091c38038061091c8339818101604052606081101561003357600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050504281116100b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806108ea6032913960400191505060405180910390fd5b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806002819055505050506107a08061014a6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806338af3eed1461005157806386d1a69f14610085578063b91d40011461008f578063fc0c546a146100ad575b600080fd5b6100596100e1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61008d61010b565b005b6100976102f6565b6040518082815260200191505060405180910390f35b6100b5610300565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600254421015610166576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806106ec6032913960400191505060405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156101f057600080fd5b505afa158015610204573d6000803e3d6000fd5b505050506040513d602081101561021a57600080fd5b8101908080519060200190929190505050905060008111610286576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806107486023913960400191505060405180910390fd5b6102f3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168260008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166103299092919063ffffffff16565b50565b6000600254905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6103c68363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506103cb565b505050565b606061042d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166104ba9092919063ffffffff16565b90506000815111156104b55780806020019051602081101561044e57600080fd5b81019080805190602001909291905050506104b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061071e602a913960400191505060405180910390fd5b5b505050565b60606104c984846000856104d2565b90509392505050565b60606104dd856106d8565b61054f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061059f578051825260208201915060208101905060208303925061057c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610601576040519150601f19603f3d011682016040523d82523d6000602084013e610606565b606091505b5091509150811561061b5780925050506106d0565b60008151111561062e5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561069557808201518184015260208101905061067a565b50505050905090810190601f1680156106c25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b90506000811191505091905056fe546f6b656e54696d656c6f636b3a2063757272656e742074696d65206973206265666f72652072656c656173652074696d655361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564546f6b656e54696d656c6f636b3a206e6f20746f6b656e7320746f2072656c65617365a2646970667358221220f4819e0c28f8f3b77ce62f7d2293b0ab4e4bdb8a60cc5a6452e5d6a345b2248464736f6c63430007000033546f6b656e54696d656c6f636b3a2072656c656173652074696d65206973206265666f72652063757272656e742074696d65",
  "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c806338af3eed1461005157806386d1a69f14610085578063b91d40011461008f578063fc0c546a146100ad575b600080fd5b6100596100e1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61008d61010b565b005b6100976102f6565b6040518082815260200191505060405180910390f35b6100b5610300565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600254421015610166576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806106ec6032913960400191505060405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156101f057600080fd5b505afa158015610204573d6000803e3d6000fd5b505050506040513d602081101561021a57600080fd5b8101908080519060200190929190505050905060008111610286576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806107486023913960400191505060405180910390fd5b6102f3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168260008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166103299092919063ffffffff16565b50565b6000600254905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6103c68363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506103cb565b505050565b606061042d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166104ba9092919063ffffffff16565b90506000815111156104b55780806020019051602081101561044e57600080fd5b81019080805190602001909291905050506104b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061071e602a913960400191505060405180910390fd5b5b505050565b60606104c984846000856104d2565b90509392505050565b60606104dd856106d8565b61054f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061059f578051825260208201915060208101905060208303925061057c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610601576040519150601f19603f3d011682016040523d82523d6000602084013e610606565b606091505b5091509150811561061b5780925050506106d0565b60008151111561062e5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561069557808201518184015260208101905061067a565b50505050905090810190601f1680156106c25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b90506000811191505091905056fe546f6b656e54696d656c6f636b3a2063757272656e742074696d65206973206265666f72652072656c656173652074696d655361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564546f6b656e54696d656c6f636b3a206e6f20746f6b656e7320746f2072656c65617365a2646970667358221220f4819e0c28f8f3b77ce62f7d2293b0ab4e4bdb8a60cc5a6452e5d6a345b2248464736f6c63430007000033",
  "compiler": {
    "name": "solc",
    "version": "0.7.0+commit.9e61f92b.Emscripten.clang",
    "optimizer": {
      "enabled": false,
      "runs": 200
    },
    "evmVersion": "petersburg"
  }
}
