{"action":"created","comment":{"url":"https://api.github.com/repos/p4lang/behavioral-model/pulls/comments/225332097","pull_request_review_id":164906088,"id":225332097,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyNTMzMjA5Nw==","diff_hunk":"@@ -0,0 +1,170 @@\n+/* Copyright 2013-present Barefoot Networks, Inc.\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ *   http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+\n+#include <bm/bm_sim/periodic_task.h>\n+#include <bm/bm_sim/logger.h>\n+\n+#include <string>\n+#include <iostream>\n+\n+namespace bm {\n+\n+PeriodicTask::PeriodicTask(\n+    const std::string &name, std::function<void()> fn,\n+    std::chrono::milliseconds interval)\n+    : name(name), interval(interval),\n+      next(std::chrono::system_clock::now() + interval), fn(fn) {\n+  PeriodicTaskList::get_instance().register_task(this);\n+}\n+\n+PeriodicTask::~PeriodicTask() {\n+  // Destructor automatically unregisters the task\n+  cancel();\n+}\n+\n+void\n+PeriodicTask::cancel() {\n+  PeriodicTaskList::get_instance().unregister_task(this);\n+}\n+\n+void\n+PeriodicTask::reset_next() {\n+  next = std::chrono::system_clock::now() + interval;\n+}\n+\n+void\n+PeriodicTask::execute() {\n+  fn();\n+  reset_next();\n+}\n+\n+constexpr std::chrono::milliseconds PeriodicTaskList::kDefaultTimeout;\n+\n+bool\n+PeriodicTaskList::contains_task(PeriodicTask *task) {\n+  std::lock_guard<std::mutex> lock(queue_mutex);\n+\n+  TaskQueue tmp;\n+  bool contains = false;\n+  while (!task_queue.empty()) {\n+    if (task_queue.top() == task) {\n+      contains = true;\n+    }\n+    tmp.push(task_queue.top());\n+    task_queue.pop();\n+  }\n+  task_queue.swap(tmp);\n+  return contains;\n+}\n+\n+bool\n+PeriodicTaskList::register_task(PeriodicTask *task) {\n+  if (contains_task(task)) {\n+    BMLOG_DEBUG(\"Warning: Task {} already exists in periodic task queue\",\n+                task->name);\n+    return false;\n+  }\n+\n+  std::lock_guard<std::mutex> lock(queue_mutex);\n+  task_queue.push(task);\n+  cv.notify_all();\n+  return true;\n+}\n+\n+bool\n+PeriodicTaskList::unregister_task(PeriodicTask *task) {\n+  std::lock_guard<std::mutex> lock(queue_mutex);\n+\n+  TaskQueue tmp;\n+  bool removed = false;\n+  // Removal from a priority queue necessitates iterating over elements\n+  while (!task_queue.empty()) {\n+    if (task_queue.top() == task) {\n+      removed = true;\n+    } else {\n+      tmp.push(task_queue.top());\n+    }\n+    task_queue.pop();\n+  }\n+  task_queue.swap(tmp);\n+\n+  cv.notify_all();\n+  if (!removed) {\n+    BMLOG_DEBUG(\"Warning: Task {} does not exist in periodic task queue\",\n+                task->name);\n+    return false;\n+  }\n+  return true;\n+}\n+\n+void\n+PeriodicTaskList::start() {\n+  if (running) {\n+    BMLOG_DEBUG(\"Warning: Tried to start already-running periodic task loop\");\n+    return;\n+  }\n+  running = true;\n+  periodic_thread = std::thread(&PeriodicTaskList::loop, this);\n+}\n+\n+void\n+PeriodicTaskList::join() {\n+  {\n+    std::lock_guard<std::mutex> lock(queue_mutex);\n+    if (!running) {\n+      BMLOG_DEBUG(\"Warning: Tried to join non-running periodic thread\");\n+      return;\n+    }\n+    running = false;\n+    cv.notify_all();\n+  }\n+  periodic_thread.join();\n+}\n+\n+void\n+PeriodicTaskList::loop() {\n+  while (true) {\n+    std::unique_lock<std::mutex> lk(queue_mutex);\n+    if (!running) {\n+      break;\n+    }\n+    std::chrono::system_clock::time_point next;\n+    if (!task_queue.empty()) {\n+      next = task_queue.top()->next;\n+    } else {\n+      next = std::chrono::system_clock::now() + kDefaultTimeout;","path":"src/bm_sim/periodic_task.cpp","position":147,"original_position":147,"commit_id":"48001ee393939854a8fa0b86dc5bd10c0c78c406","original_commit_id":"48001ee393939854a8fa0b86dc5bd10c0c78c406","user":{"login":"antoninbas","id":2495809,"node_id":"MDQ6VXNlcjI0OTU4MDk=","avatar_url":"https://avatars1.githubusercontent.com/u/2495809?v=4","gravatar_id":"","url":"https://api.github.com/users/antoninbas","html_url":"https://github.com/antoninbas","followers_url":"https://api.github.com/users/antoninbas/followers","following_url":"https://api.github.com/users/antoninbas/following{/other_user}","gists_url":"https://api.github.com/users/antoninbas/gists{/gist_id}","starred_url":"https://api.github.com/users/antoninbas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/antoninbas/subscriptions","organizations_url":"https://api.github.com/users/antoninbas/orgs","repos_url":"https://api.github.com/users/antoninbas/repos","events_url":"https://api.github.com/users/antoninbas/events{/privacy}","received_events_url":"https://api.github.com/users/antoninbas/received_events","type":"User","site_admin":false},"body":"sorry if I'm missing something but why do we need a default timeout, given that we use a condition variable?","created_at":"2018-10-15T22:03:32Z","updated_at":"2018-10-15T22:09:01Z","html_url":"https://github.com/p4lang/behavioral-model/pull/665#discussion_r225332097","pull_request_url":"https://api.github.com/repos/p4lang/behavioral-model/pulls/665","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/p4lang/behavioral-model/pulls/comments/225332097"},"html":{"href":"https://github.com/p4lang/behavioral-model/pull/665#discussion_r225332097"},"pull_request":{"href":"https://api.github.com/repos/p4lang/behavioral-model/pulls/665"}}},"pull_request":{"url":"https://api.github.com/repos/p4lang/behavioral-model/pulls/665","id":219002601,"node_id":"MDExOlB1bGxSZXF1ZXN0MjE5MDAyNjAx","html_url":"https://github.com/p4lang/behavioral-model/pull/665","diff_url":"https://github.com/p4lang/behavioral-model/pull/665.diff","patch_url":"https://github.com/p4lang/behavioral-model/pull/665.patch","issue_url":"https://api.github.com/repos/p4lang/behavioral-model/issues/665","number":665,"state":"open","locked":false,"title":"Periodically-called externs","user":{"login":"isaac-ped","id":3009842,"node_id":"MDQ6VXNlcjMwMDk4NDI=","avatar_url":"https://avatars0.githubusercontent.com/u/3009842?v=4","gravatar_id":"","url":"https://api.github.com/users/isaac-ped","html_url":"https://github.com/isaac-ped","followers_url":"https://api.github.com/users/isaac-ped/followers","following_url":"https://api.github.com/users/isaac-ped/following{/other_user}","gists_url":"https://api.github.com/users/isaac-ped/gists{/gist_id}","starred_url":"https://api.github.com/users/isaac-ped/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/isaac-ped/subscriptions","organizations_url":"https://api.github.com/users/isaac-ped/orgs","repos_url":"https://api.github.com/users/isaac-ped/repos","events_url":"https://api.github.com/users/isaac-ped/events{/privacy}","received_events_url":"https://api.github.com/users/isaac-ped/received_events","type":"User","site_admin":false},"body":"This adds functionality to bm_sim and the simple_switch target to register an function to be called periodically with a given interval.\r\n\r\nA function declared outside of a primitive will always be called in that interval:\r\n\r\n```cpp\r\nstatic void run_always() {\r\n    BMLOG_DEBUG(\"This function will run once a second\");\r\n}\r\n\r\nREGISTER_PERIODIC_ACTION(run_always, std::chrono::seconds(1));\r\n```\r\n\r\nA function declared inside of a primitive will only be called if that primitive is used as an extern somewhere in the compiled P4 file:\r\n\r\n```cpp\r\nclass timeout_extern : public ActionPrimitive<> {\r\n\r\n    void operator() () {\r\n        BMLOG_DEBUG(\"Calling timeout_extern\");\r\n    }\r\n\r\n\r\n    static void periodic() {\r\n        BMLOG_DEBUG(\"This will be called 4 times a second if timeout_extern() is used in P4\");\r\n    }\r\n\r\n    REGISTER_PERIODIC_ACTION(periodic, std::chrono::milliseconds(250));\r\n};\r\n```","created_at":"2018-09-28T15:18:15Z","updated_at":"2018-10-15T22:09:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"05ff57c164ff998654ec99cbc1571577af43ff31","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/p4lang/behavioral-model/pulls/665/commits","review_comments_url":"https://api.github.com/repos/p4lang/behavioral-model/pulls/665/comments","review_comment_url":"https://api.github.com/repos/p4lang/behavioral-model/pulls/comments{/number}","comments_url":"https://api.github.com/repos/p4lang/behavioral-model/issues/665/comments","statuses_url":"https://api.github.com/repos/p4lang/behavioral-model/statuses/48001ee393939854a8fa0b86dc5bd10c0c78c406","head":{"label":"isaac-ped:periodic_extern","ref":"periodic_extern","sha":"48001ee393939854a8fa0b86dc5bd10c0c78c406","user":{"login":"isaac-ped","id":3009842,"node_id":"MDQ6VXNlcjMwMDk4NDI=","avatar_url":"https://avatars0.githubusercontent.com/u/3009842?v=4","gravatar_id":"","url":"https://api.github.com/users/isaac-ped","html_url":"https://github.com/isaac-ped","followers_url":"https://api.github.com/users/isaac-ped/followers","following_url":"https://api.github.com/users/isaac-ped/following{/other_user}","gists_url":"https://api.github.com/users/isaac-ped/gists{/gist_id}","starred_url":"https://api.github.com/users/isaac-ped/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/isaac-ped/subscriptions","organizations_url":"https://api.github.com/users/isaac-ped/orgs","repos_url":"https://api.github.com/users/isaac-ped/repos","events_url":"https://api.github.com/users/isaac-ped/events{/privacy}","received_events_url":"https://api.github.com/users/isaac-ped/received_events","type":"User","site_admin":false},"repo":{"id":150595030,"node_id":"MDEwOlJlcG9zaXRvcnkxNTA1OTUwMzA=","name":"behavioral-model","full_name":"isaac-ped/behavioral-model","private":false,"owner":{"login":"isaac-ped","id":3009842,"node_id":"MDQ6VXNlcjMwMDk4NDI=","avatar_url":"https://avatars0.githubusercontent.com/u/3009842?v=4","gravatar_id":"","url":"https://api.github.com/users/isaac-ped","html_url":"https://github.com/isaac-ped","followers_url":"https://api.github.com/users/isaac-ped/followers","following_url":"https://api.github.com/users/isaac-ped/following{/other_user}","gists_url":"https://api.github.com/users/isaac-ped/gists{/gist_id}","starred_url":"https://api.github.com/users/isaac-ped/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/isaac-ped/subscriptions","organizations_url":"https://api.github.com/users/isaac-ped/orgs","repos_url":"https://api.github.com/users/isaac-ped/repos","events_url":"https://api.github.com/users/isaac-ped/events{/privacy}","received_events_url":"https://api.github.com/users/isaac-ped/received_events","type":"User","site_admin":false},"html_url":"https://github.com/isaac-ped/behavioral-model","description":"Rewrite of the behavioral model as a C++ project without auto-generated code (except for the PD interface)","fork":true,"url":"https://api.github.com/repos/isaac-ped/behavioral-model","forks_url":"https://api.github.com/repos/isaac-ped/behavioral-model/forks","keys_url":"https://api.github.com/repos/isaac-ped/behavioral-model/keys{/key_id}","collaborators_url":"https://api.github.com/repos/isaac-ped/behavioral-model/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/isaac-ped/behavioral-model/teams","hooks_url":"https://api.github.com/repos/isaac-ped/behavioral-model/hooks","issue_events_url":"https://api.github.com/repos/isaac-ped/behavioral-model/issues/events{/number}","events_url":"https://api.github.com/repos/isaac-ped/behavioral-model/events","assignees_url":"https://api.github.com/repos/isaac-ped/behavioral-model/assignees{/user}","branches_url":"https://api.github.com/repos/isaac-ped/behavioral-model/branches{/branch}","tags_url":"https://api.github.com/repos/isaac-ped/behavioral-model/tags","blobs_url":"https://api.github.com/repos/isaac-ped/behavioral-model/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/isaac-ped/behavioral-model/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/isaac-ped/behavioral-model/git/refs{/sha}","trees_url":"https://api.github.com/repos/isaac-ped/behavioral-model/git/trees{/sha}","statuses_url":"https://api.github.com/repos/isaac-ped/behavioral-model/statuses/{sha}","languages_url":"https://api.github.com/repos/isaac-ped/behavioral-model/languages","stargazers_url":"https://api.github.com/repos/isaac-ped/behavioral-model/stargazers","contributors_url":"https://api.github.com/repos/isaac-ped/behavioral-model/contributors","subscribers_url":"https://api.github.com/repos/isaac-ped/behavioral-model/subscribers","subscription_url":"https://api.github.com/repos/isaac-ped/behavioral-model/subscription","commits_url":"https://api.github.com/repos/isaac-ped/behavioral-model/commits{/sha}","git_commits_url":"https://api.github.com/repos/isaac-ped/behavioral-model/git/commits{/sha}","comments_url":"https://api.github.com/repos/isaac-ped/behavioral-model/comments{/number}","issue_comment_url":"https://api.github.com/repos/isaac-ped/behavioral-model/issues/comments{/number}","contents_url":"https://api.github.com/repos/isaac-ped/behavioral-model/contents/{+path}","compare_url":"https://api.github.com/repos/isaac-ped/behavioral-model/compare/{base}...{head}","merges_url":"https://api.github.com/repos/isaac-ped/behavioral-model/merges","archive_url":"https://api.github.com/repos/isaac-ped/behavioral-model/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/isaac-ped/behavioral-model/downloads","issues_url":"https://api.github.com/repos/isaac-ped/behavioral-model/issues{/number}","pulls_url":"https://api.github.com/repos/isaac-ped/behavioral-model/pulls{/number}","milestones_url":"https://api.github.com/repos/isaac-ped/behavioral-model/milestones{/number}","notifications_url":"https://api.github.com/repos/isaac-ped/behavioral-model/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/isaac-ped/behavioral-model/labels{/name}","releases_url":"https://api.github.com/repos/isaac-ped/behavioral-model/releases{/id}","deployments_url":"https://api.github.com/repos/isaac-ped/behavioral-model/deployments","created_at":"2018-09-27T13:54:48Z","updated_at":"2018-09-27T13:54:52Z","pushed_at":"2018-10-15T20:48:21Z","git_url":"git://github.com/isaac-ped/behavioral-model.git","ssh_url":"git@github.com:isaac-ped/behavioral-model.git","clone_url":"https://github.com/isaac-ped/behavioral-model.git","svn_url":"https://github.com/isaac-ped/behavioral-model","homepage":null,"size":33472,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"p4lang:master","ref":"master","sha":"66cefc5e901eafcebb0e1a8f681a05795463215a","user":{"login":"p4lang","id":10765181,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwNzY1MTgx","avatar_url":"https://avatars1.githubusercontent.com/u/10765181?v=4","gravatar_id":"","url":"https://api.github.com/users/p4lang","html_url":"https://github.com/p4lang","followers_url":"https://api.github.com/users/p4lang/followers","following_url":"https://api.github.com/users/p4lang/following{/other_user}","gists_url":"https://api.github.com/users/p4lang/gists{/gist_id}","starred_url":"https://api.github.com/users/p4lang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/p4lang/subscriptions","organizations_url":"https://api.github.com/users/p4lang/orgs","repos_url":"https://api.github.com/users/p4lang/repos","events_url":"https://api.github.com/users/p4lang/events{/privacy}","received_events_url":"https://api.github.com/users/p4lang/received_events","type":"Organization","site_admin":false},"repo":{"id":29883110,"node_id":"MDEwOlJlcG9zaXRvcnkyOTg4MzExMA==","name":"behavioral-model","full_name":"p4lang/behavioral-model","private":false,"owner":{"login":"p4lang","id":10765181,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwNzY1MTgx","avatar_url":"https://avatars1.githubusercontent.com/u/10765181?v=4","gravatar_id":"","url":"https://api.github.com/users/p4lang","html_url":"https://github.com/p4lang","followers_url":"https://api.github.com/users/p4lang/followers","following_url":"https://api.github.com/users/p4lang/following{/other_user}","gists_url":"https://api.github.com/users/p4lang/gists{/gist_id}","starred_url":"https://api.github.com/users/p4lang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/p4lang/subscriptions","organizations_url":"https://api.github.com/users/p4lang/orgs","repos_url":"https://api.github.com/users/p4lang/repos","events_url":"https://api.github.com/users/p4lang/events{/privacy}","received_events_url":"https://api.github.com/users/p4lang/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/p4lang/behavioral-model","description":"Rewrite of the behavioral model as a C++ project without auto-generated code (except for the PD interface)","fork":false,"url":"https://api.github.com/repos/p4lang/behavioral-model","forks_url":"https://api.github.com/repos/p4lang/behavioral-model/forks","keys_url":"https://api.github.com/repos/p4lang/behavioral-model/keys{/key_id}","collaborators_url":"https://api.github.com/repos/p4lang/behavioral-model/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/p4lang/behavioral-model/teams","hooks_url":"https://api.github.com/repos/p4lang/behavioral-model/hooks","issue_events_url":"https://api.github.com/repos/p4lang/behavioral-model/issues/events{/number}","events_url":"https://api.github.com/repos/p4lang/behavioral-model/events","assignees_url":"https://api.github.com/repos/p4lang/behavioral-model/assignees{/user}","branches_url":"https://api.github.com/repos/p4lang/behavioral-model/branches{/branch}","tags_url":"https://api.github.com/repos/p4lang/behavioral-model/tags","blobs_url":"https://api.github.com/repos/p4lang/behavioral-model/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/p4lang/behavioral-model/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/p4lang/behavioral-model/git/refs{/sha}","trees_url":"https://api.github.com/repos/p4lang/behavioral-model/git/trees{/sha}","statuses_url":"https://api.github.com/repos/p4lang/behavioral-model/statuses/{sha}","languages_url":"https://api.github.com/repos/p4lang/behavioral-model/languages","stargazers_url":"https://api.github.com/repos/p4lang/behavioral-model/stargazers","contributors_url":"https://api.github.com/repos/p4lang/behavioral-model/contributors","subscribers_url":"https://api.github.com/repos/p4lang/behavioral-model/subscribers","subscription_url":"https://api.github.com/repos/p4lang/behavioral-model/subscription","commits_url":"https://api.github.com/repos/p4lang/behavioral-model/commits{/sha}","git_commits_url":"https://api.github.com/repos/p4lang/behavioral-model/git/commits{/sha}","comments_url":"https://api.github.com/repos/p4lang/behavioral-model/comments{/number}","issue_comment_url":"https://api.github.com/repos/p4lang/behavioral-model/issues/comments{/number}","contents_url":"https://api.github.com/repos/p4lang/behavioral-model/contents/{+path}","compare_url":"https://api.github.com/repos/p4lang/behavioral-model/compare/{base}...{head}","merges_url":"https://api.github.com/repos/p4lang/behavioral-model/merges","archive_url":"https://api.github.com/repos/p4lang/behavioral-model/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/p4lang/behavioral-model/downloads","issues_url":"https://api.github.com/repos/p4lang/behavioral-model/issues{/number}","pulls_url":"https://api.github.com/repos/p4lang/behavioral-model/pulls{/number}","milestones_url":"https://api.github.com/repos/p4lang/behavioral-model/milestones{/number}","notifications_url":"https://api.github.com/repos/p4lang/behavioral-model/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/p4lang/behavioral-model/labels{/name}","releases_url":"https://api.github.com/repos/p4lang/behavioral-model/releases{/id}","deployments_url":"https://api.github.com/repos/p4lang/behavioral-model/deployments","created_at":"2015-01-26T21:43:23Z","updated_at":"2018-10-10T14:04:22Z","pushed_at":"2018-10-15T20:48:22Z","git_url":"git://github.com/p4lang/behavioral-model.git","ssh_url":"git@github.com:p4lang/behavioral-model.git","clone_url":"https://github.com/p4lang/behavioral-model.git","svn_url":"https://github.com/p4lang/behavioral-model","homepage":null,"size":33444,"stargazers_count":116,"watchers_count":116,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":126,"mirror_url":null,"archived":false,"open_issues_count":25,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":126,"open_issues":25,"watchers":116,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/p4lang/behavioral-model/pulls/665"},"html":{"href":"https://github.com/p4lang/behavioral-model/pull/665"},"issue":{"href":"https://api.github.com/repos/p4lang/behavioral-model/issues/665"},"comments":{"href":"https://api.github.com/repos/p4lang/behavioral-model/issues/665/comments"},"review_comments":{"href":"https://api.github.com/repos/p4lang/behavioral-model/pulls/665/comments"},"review_comment":{"href":"https://api.github.com/repos/p4lang/behavioral-model/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/p4lang/behavioral-model/pulls/665/commits"},"statuses":{"href":"https://api.github.com/repos/p4lang/behavioral-model/statuses/48001ee393939854a8fa0b86dc5bd10c0c78c406"}},"author_association":"NONE"}}
{"actor":{"display_login":"antoninbas"}}