From 8a24193efd375db54d9ae68d4361a5775b025c72 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 15 Feb 2024 14:53:29 +0800 Subject: [PATCH] Add HAR: 520cc (#521) Co-authored-by: a76yyyy --- 520cc.cc.har | 268 ++++++++++++++++++++++++++++++++++++++++++++++ tpls_history.json | 12 +++ 2 files changed, 280 insertions(+) create mode 100644 520cc.cc.har diff --git a/520cc.cc.har b/520cc.cc.har new file mode 100644 index 0000000..7e278e3 --- /dev/null +++ b/520cc.cc.har @@ -0,0 +1,268 @@ +[ + { + "request": { + "method": "POST", + "url": "https://www.520cc.cc/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1", + "headers": [], + "cookies": [ + { + "name": "agree18", + "value": "yes" + } + ], + "data": "username={{username}}&password={{password}}" + }, + "rule": { + "success_asserts": [ + { + "re": "200", + "from": "status" + } + ], + "failed_asserts": [], + "extract_variables": [] + } + }, + { + "comment": "签到", + "request": { + "method": "GET", + "url": "https://www.520cc.cc/plugin.php?id=checkin&ac=dian", + "headers": [], + "cookies": [] + }, + "rule": { + "success_asserts": [ + { + "re": "200", + "from": "status" + } + ], + "failed_asserts": [], + "extract_variables": [ + { + "name": "formhash", + "re": "formhash=(\\w+)", + "from": "content" + }, + { + "name": "uid", + "re": "uid = '(\\d+)'", + "from": "content" + } + ] + } + }, + { + "comment": "重复签到", + "request": { + "method": "GET", + "url": "https://www.520cc.cc/plugin.php?id=checkin&ac=dian", + "headers": [], + "cookies": [] + }, + "rule": { + "success_asserts": [ + { + "re": "每天只能簽到一次", + "from": "content" + } + ], + "failed_asserts": [], + "extract_variables": [] + } + }, + { + "comment": "循环开始 访问他人空间", + "request": { + "method": "GET", + "url": "{% for value in range(0, 12, 1) %} ", + "headers": [], + "cookies": [], + "data": "" + }, + "rule": { + "success_asserts": [], + "failed_asserts": [], + "extract_variables": [] + } + }, + { + "comment": "", + "request": { + "method": "GET", + "url": "https://www.520cc.cc/?{{random(111111,333333,0)|urlencode}}", + "headers": [], + "cookies": [] + }, + "rule": { + "success_asserts": [ + { + "re": "200", + "from": "status" + } + ], + "failed_asserts": [], + "extract_variables": [] + } + }, + { + "comment": "循环块结束", + "request": { + "method": "GET", + "url": "{% endfor %}", + "headers": [], + "cookies": [], + "data": "" + }, + "rule": { + "success_asserts": [], + "failed_asserts": [], + "extract_variables": [] + } + }, + { + "comment": "发表日志", + "request": { + "method": "POST", + "url": "https://www.520cc.cc/home.php?mod=spacecp&ac=blog&blogid=", + "headers": [ + { + "name": "Content-Type", + "value": "multipart/form-data; boundary=----------------------------" + } + ], + "cookies": [], + "data": "------------------------------\nContent-Disposition: form-data; name=\"subject\"\n\n{{date_time(1,1,0)}}\n------------------------------\nContent-Disposition: form-data; name=\"savealbumid\"\n\n0\n------------------------------\nContent-Disposition: form-data; name=\"newalbum\"\n\n請輸入相冊名稱\n------------------------------\nContent-Disposition: form-data; name=\"view_albumid\"\n\nnone\n------------------------------\nContent-Disposition: form-data; name=\"message\"\n\n{{date_time(1,1,0)}}\n------------------------------\nContent-Disposition: form-data; name=\"catid\"\n\n\n------------------------------\nContent-Disposition: form-data; name=\"classid\"\n\n0\n------------------------------\nContent-Disposition: form-data; name=\"tag\"\n\n \n------------------------------\nContent-Disposition: form-data; name=\"friend\"\n\n3\n------------------------------\nContent-Disposition: form-data; name=\"noreply\"\n\n1\n------------------------------\nContent-Disposition: form-data; name=\"password\"\n\n\n------------------------------\nContent-Disposition: form-data; name=\"selectgroup\"\n\n\n------------------------------\nContent-Disposition: form-data; name=\"target_names\"\n\n\n------------------------------\nContent-Disposition: form-data; name=\"blogsubmit\"\n\ntrue\n------------------------------\nContent-Disposition: form-data; name=\"formhash\"\n\n{{formhash}}\n--------------------------------" + }, + "rule": { + "success_asserts": [ + { + "re": "301", + "from": "status" + } + ], + "failed_asserts": [], + "extract_variables": [] + } + }, + { + "comment": "获取日志id", + "request": { + "method": "GET", + "url": "https://www.520cc.cc/home.php?mod=space&uid={{uid|urlencode}}&do=blog&view=me&from=space", + "headers": [], + "cookies": [], + "data": "" + }, + "rule": { + "success_asserts": [ + { + "re": "200", + "from": "status" + } + ], + "failed_asserts": [], + "extract_variables": [ + { + "name": "blogid", + "re": "blog_delete_(\\d+)", + "from": "content" + } + ] + } + }, + { + "comment": "删除日志", + "request": { + "method": "POST", + "url": "https://www.520cc.cc/home.php?mod=spacecp&ac=blog&op=delete&blogid={{blogid|urlencode}}", + "headers": [], + "cookies": [], + "data": "deletesubmit=true&formhash={{formhash}}" + }, + "rule": { + "success_asserts": [ + { + "re": "301", + "from": "status" + } + ], + "failed_asserts": [], + "extract_variables": [] + } + }, + { + "comment": "For 循环开始", + "request": { + "method": "GET", + "url": "{% for value in range(0, 12, 1) %} ", + "headers": [], + "cookies": [], + "data": "" + }, + "rule": { + "success_asserts": [], + "failed_asserts": [], + "extract_variables": [] + } + }, + { + "comment": "循环打招呼", + "request": { + "method": "POST", + "url": "https://www.520cc.cc/home.php?mod=spacecp&ac=poke&op=send&uid={{random(111111,333333,0)|urlencode}}&inajax=1", + "headers": [], + "cookies": [], + "data": "pokesubmit=true&formhash={{formhash}}&from=&handlekey=a_poke_{{random(111111,333333,0)|urlencode}}&iconid=0¬e=" + }, + "rule": { + "success_asserts": [ + { + "re": "200", + "from": "status" + } + ], + "failed_asserts": [], + "extract_variables": [] + } + }, + { + "comment": "For 循环结束", + "request": { + "method": "GET", + "url": "{% endfor %}", + "headers": [], + "cookies": [], + "data": "" + }, + "rule": { + "success_asserts": [] + } + }, + { + "comment": "", + "request": { + "method": "GET", + "url": "https://www.520cc.cc/home.php?mod=space&do=notice&view=system", + "headers": [], + "cookies": [] + }, + "rule": { + "success_asserts": [ + { + "re": "退出", + "from": "content" + } + ], + "failed_asserts": [], + "extract_variables": [ + { + "name": "__log__", + "re": "(積分:.\\d+)", + "from": "content" + } + ] + } + } +] \ No newline at end of file diff --git a/tpls_history.json b/tpls_history.json index 7f8a8f0..f048a87 100644 --- a/tpls_history.json +++ b/tpls_history.json @@ -3024,6 +3024,18 @@ "date": "2024-02-15 14:50:17", "version": "20240215", "commenturl": "https://github.com/qd-today/templates/issues/518" + }, + "520cc": { + "name": "520cc", + "author": "loveqianool", + "url": "https://raw.githubusercontent.com/qd-today/templates/master/520cc.cc.har", + "update": false, + "comments": "用户名密码", + "filename": "520cc.cc.har", + "content": "W3sicmVxdWVzdCI6IHsibWV0aG9kIjogIlBPU1QiLCAidXJsIjogImh0dHBzOi8vd3d3LjUyMGNjLmNjL21lbWJlci5waHA/bW9kPWxvZ2dpbmcmYWN0aW9uPWxvZ2luJmxvZ2luc3VibWl0PXllcyZpbmZsb2F0PXllcyZsc3N1Ym1pdD15ZXMmaW5hamF4PTEiLCAiaGVhZGVycyI6IFtdLCAiY29va2llcyI6IFt7Im5hbWUiOiAiYWdyZWUxOCIsICJ2YWx1ZSI6ICJ5ZXMifV0sICJkYXRhIjogInVzZXJuYW1lPXt7dXNlcm5hbWV9fSZwYXNzd29yZD17e3Bhc3N3b3JkfX0ifSwgInJ1bGUiOiB7InN1Y2Nlc3NfYXNzZXJ0cyI6IFt7InJlIjogIjIwMCIsICJmcm9tIjogInN0YXR1cyJ9XSwgImZhaWxlZF9hc3NlcnRzIjogW10sICJleHRyYWN0X3ZhcmlhYmxlcyI6IFtdfX0sIHsiY29tbWVudCI6ICLnrb7liLAiLCAicmVxdWVzdCI6IHsibWV0aG9kIjogIkdFVCIsICJ1cmwiOiAiaHR0cHM6Ly93d3cuNTIwY2MuY2MvcGx1Z2luLnBocD9pZD1jaGVja2luJmFjPWRpYW4iLCAiaGVhZGVycyI6IFtdLCAiY29va2llcyI6IFtdfSwgInJ1bGUiOiB7InN1Y2Nlc3NfYXNzZXJ0cyI6IFt7InJlIjogIjIwMCIsICJmcm9tIjogInN0YXR1cyJ9XSwgImZhaWxlZF9hc3NlcnRzIjogW10sICJleHRyYWN0X3ZhcmlhYmxlcyI6IFt7Im5hbWUiOiAiZm9ybWhhc2giLCAicmUiOiAiZm9ybWhhc2g9KFxcdyspIiwgImZyb20iOiAiY29udGVudCJ9LCB7Im5hbWUiOiAidWlkIiwgInJlIjogInVpZCA9ICcoXFxkKyknIiwgImZyb20iOiAiY29udGVudCJ9XX19LCB7ImNvbW1lbnQiOiAi6YeN5aSN562+5YiwIiwgInJlcXVlc3QiOiB7Im1ldGhvZCI6ICJHRVQiLCAidXJsIjogImh0dHBzOi8vd3d3LjUyMGNjLmNjL3BsdWdpbi5waHA/aWQ9Y2hlY2tpbiZhYz1kaWFuIiwgImhlYWRlcnMiOiBbXSwgImNvb2tpZXMiOiBbXX0sICJydWxlIjogeyJzdWNjZXNzX2Fzc2VydHMiOiBbeyJyZSI6ICLmr4/lpKnlj6rog73nsL3liLDkuIDmrKEiLCAiZnJvbSI6ICJjb250ZW50In1dLCAiZmFpbGVkX2Fzc2VydHMiOiBbXSwgImV4dHJhY3RfdmFyaWFibGVzIjogW119fSwgeyJjb21tZW50IjogIuW+queOr+W8gOWniyDorr/pl67ku5bkurrnqbrpl7QiLCAicmVxdWVzdCI6IHsibWV0aG9kIjogIkdFVCIsICJ1cmwiOiAieyUgZm9yIHZhbHVlIGluIHJhbmdlKDAsIDEyLCAxKSAlfSAgICAgIiwgImhlYWRlcnMiOiBbXSwgImNvb2tpZXMiOiBbXSwgImRhdGEiOiAiIn0sICJydWxlIjogeyJzdWNjZXNzX2Fzc2VydHMiOiBbXSwgImZhaWxlZF9hc3NlcnRzIjogW10sICJleHRyYWN0X3ZhcmlhYmxlcyI6IFtdfX0sIHsiY29tbWVudCI6ICIiLCAicmVxdWVzdCI6IHsibWV0aG9kIjogIkdFVCIsICJ1cmwiOiAiaHR0cHM6Ly93d3cuNTIwY2MuY2MvP3t7cmFuZG9tKDExMTExMSwzMzMzMzMsMCl8dXJsZW5jb2RlfX0iLCAiaGVhZGVycyI6IFtdLCAiY29va2llcyI6IFtdfSwgInJ1bGUiOiB7InN1Y2Nlc3NfYXNzZXJ0cyI6IFt7InJlIjogIjIwMCIsICJmcm9tIjogInN0YXR1cyJ9XSwgImZhaWxlZF9hc3NlcnRzIjogW10sICJleHRyYWN0X3ZhcmlhYmxlcyI6IFtdfX0sIHsiY29tbWVudCI6ICLlvqrnjq/lnZfnu5PmnZ8iLCAicmVxdWVzdCI6IHsibWV0aG9kIjogIkdFVCIsICJ1cmwiOiAieyUgZW5kZm9yICV9IiwgImhlYWRlcnMiOiBbXSwgImNvb2tpZXMiOiBbXSwgImRhdGEiOiAiIn0sICJydWxlIjogeyJzdWNjZXNzX2Fzc2VydHMiOiBbXSwgImZhaWxlZF9hc3NlcnRzIjogW10sICJleHRyYWN0X3ZhcmlhYmxlcyI6IFtdfX0sIHsiY29tbWVudCI6ICLlj5Hooajml6Xlv5ciLCAicmVxdWVzdCI6IHsibWV0aG9kIjogIlBPU1QiLCAidXJsIjogImh0dHBzOi8vd3d3LjUyMGNjLmNjL2hvbWUucGhwP21vZD1zcGFjZWNwJmFjPWJsb2cmYmxvZ2lkPSIsICJoZWFkZXJzIjogW3sibmFtZSI6ICJDb250ZW50LVR5cGUiLCAidmFsdWUiOiAibXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSJ9XSwgImNvb2tpZXMiOiBbXSwgImRhdGEiOiAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5Db250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJzdWJqZWN0XCJcblxue3tkYXRlX3RpbWUoMSwxLDApfX1cbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwic2F2ZWFsYnVtaWRcIlxuXG4wXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cIm5ld2FsYnVtXCJcblxu6KuL6Ly45YWl55u45YaK5ZCN56ixXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cInZpZXdfYWxidW1pZFwiXG5cbm5vbmVcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwibWVzc2FnZVwiXG5cbnt7ZGF0ZV90aW1lKDEsMSwwKX19XG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cImNhdGlkXCJcblxuXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cImNsYXNzaWRcIlxuXG4wXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT1cInRhZ1wiXG5cbiBcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiZnJpZW5kXCJcblxuM1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5Db250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJub3JlcGx5XCJcblxuMVxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5Db250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJwYXNzd29yZFwiXG5cblxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5Db250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJzZWxlY3Rncm91cFwiXG5cblxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5Db250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJ0YXJnZXRfbmFtZXNcIlxuXG5cbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiYmxvZ3N1Ym1pdFwiXG5cbnRydWVcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwiZm9ybWhhc2hcIlxuXG57e2Zvcm1oYXNofX1cbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIn0sICJydWxlIjogeyJzdWNjZXNzX2Fzc2VydHMiOiBbeyJyZSI6ICIzMDEiLCAiZnJvbSI6ICJzdGF0dXMifV0sICJmYWlsZWRfYXNzZXJ0cyI6IFtdLCAiZXh0cmFjdF92YXJpYWJsZXMiOiBbXX19LCB7ImNvbW1lbnQiOiAi6I635Y+W5pel5b+XaWQiLCAicmVxdWVzdCI6IHsibWV0aG9kIjogIkdFVCIsICJ1cmwiOiAiaHR0cHM6Ly93d3cuNTIwY2MuY2MvaG9tZS5waHA/bW9kPXNwYWNlJnVpZD17e3VpZHx1cmxlbmNvZGV9fSZkbz1ibG9nJnZpZXc9bWUmZnJvbT1zcGFjZSIsICJoZWFkZXJzIjogW10sICJjb29raWVzIjogW10sICJkYXRhIjogIiJ9LCAicnVsZSI6IHsic3VjY2Vzc19hc3NlcnRzIjogW3sicmUiOiAiMjAwIiwgImZyb20iOiAic3RhdHVzIn1dLCAiZmFpbGVkX2Fzc2VydHMiOiBbXSwgImV4dHJhY3RfdmFyaWFibGVzIjogW3sibmFtZSI6ICJibG9naWQiLCAicmUiOiAiYmxvZ19kZWxldGVfKFxcZCspIiwgImZyb20iOiAiY29udGVudCJ9XX19LCB7ImNvbW1lbnQiOiAi5Yig6Zmk5pel5b+XIiwgInJlcXVlc3QiOiB7Im1ldGhvZCI6ICJQT1NUIiwgInVybCI6ICJodHRwczovL3d3dy41MjBjYy5jYy9ob21lLnBocD9tb2Q9c3BhY2VjcCZhYz1ibG9nJm9wPWRlbGV0ZSZibG9naWQ9e3tibG9naWR8dXJsZW5jb2RlfX0iLCAiaGVhZGVycyI6IFtdLCAiY29va2llcyI6IFtdLCAiZGF0YSI6ICJkZWxldGVzdWJtaXQ9dHJ1ZSZmb3JtaGFzaD17e2Zvcm1oYXNofX0ifSwgInJ1bGUiOiB7InN1Y2Nlc3NfYXNzZXJ0cyI6IFt7InJlIjogIjMwMSIsICJmcm9tIjogInN0YXR1cyJ9XSwgImZhaWxlZF9hc3NlcnRzIjogW10sICJleHRyYWN0X3ZhcmlhYmxlcyI6IFtdfX0sIHsiY29tbWVudCI6ICJGb3Ig5b6q546v5byA5aeLIiwgInJlcXVlc3QiOiB7Im1ldGhvZCI6ICJHRVQiLCAidXJsIjogInslIGZvciB2YWx1ZSBpbiByYW5nZSgwLCAxMiwgMSkgJX0gICAgICIsICJoZWFkZXJzIjogW10sICJjb29raWVzIjogW10sICJkYXRhIjogIiJ9LCAicnVsZSI6IHsic3VjY2Vzc19hc3NlcnRzIjogW10sICJmYWlsZWRfYXNzZXJ0cyI6IFtdLCAiZXh0cmFjdF92YXJpYWJsZXMiOiBbXX19LCB7ImNvbW1lbnQiOiAi5b6q546v5omT5oub5ZG8IiwgInJlcXVlc3QiOiB7Im1ldGhvZCI6ICJQT1NUIiwgInVybCI6ICJodHRwczovL3d3dy41MjBjYy5jYy9ob21lLnBocD9tb2Q9c3BhY2VjcCZhYz1wb2tlJm9wPXNlbmQmdWlkPXt7cmFuZG9tKDExMTExMSwzMzMzMzMsMCl8dXJsZW5jb2RlfX0maW5hamF4PTEiLCAiaGVhZGVycyI6IFtdLCAiY29va2llcyI6IFtdLCAiZGF0YSI6ICJwb2tlc3VibWl0PXRydWUmZm9ybWhhc2g9e3tmb3JtaGFzaH19JmZyb209JmhhbmRsZWtleT1hX3Bva2Vfe3tyYW5kb20oMTExMTExLDMzMzMzMywwKXx1cmxlbmNvZGV9fSZpY29uaWQ9MCZub3RlPSJ9LCAicnVsZSI6IHsic3VjY2Vzc19hc3NlcnRzIjogW3sicmUiOiAiMjAwIiwgImZyb20iOiAic3RhdHVzIn1dLCAiZmFpbGVkX2Fzc2VydHMiOiBbXSwgImV4dHJhY3RfdmFyaWFibGVzIjogW119fSwgeyJjb21tZW50IjogIkZvciDlvqrnjq/nu5PmnZ8iLCAicmVxdWVzdCI6IHsibWV0aG9kIjogIkdFVCIsICJ1cmwiOiAieyUgZW5kZm9yICV9IiwgImhlYWRlcnMiOiBbXSwgImNvb2tpZXMiOiBbXSwgImRhdGEiOiAiIn0sICJydWxlIjogeyJzdWNjZXNzX2Fzc2VydHMiOiBbXX19LCB7ImNvbW1lbnQiOiAiIiwgInJlcXVlc3QiOiB7Im1ldGhvZCI6ICJHRVQiLCAidXJsIjogImh0dHBzOi8vd3d3LjUyMGNjLmNjL2hvbWUucGhwP21vZD1zcGFjZSZkbz1ub3RpY2Umdmlldz1zeXN0ZW0iLCAiaGVhZGVycyI6IFtdLCAiY29va2llcyI6IFtdfSwgInJ1bGUiOiB7InN1Y2Nlc3NfYXNzZXJ0cyI6IFt7InJlIjogIumAgOWHuiIsICJmcm9tIjogImNvbnRlbnQifV0sICJmYWlsZWRfYXNzZXJ0cyI6IFtdLCAiZXh0cmFjdF92YXJpYWJsZXMiOiBbeyJuYW1lIjogIl9fbG9nX18iLCAicmUiOiAiKOepjeWIhjouXFxkKykiLCAiZnJvbSI6ICJjb250ZW50In1dfX1d", + "date": "2024-02-15 14:53:02", + "version": "20240215", + "commenturl": "https://github.com/qd-today/templates/issues/520" } } } \ No newline at end of file