{"action":"created","comment":{"url":"https://api.github.com/repos/exercism/problem-specifications/pulls/comments/180638468","pull_request_review_id":111089993,"id":180638468,"diff_hunk":"@@ -0,0 +1,67 @@\n+{\n+  \"exercise\": \"diffie-hellman\",\n+  \"version\": \"1.0.0\",\n+  \"comments\": [\n+    \"Optional tests to consider:\",\n+    \"* Validation of parameters:\",\n+    \"  Validate that `p`, `g` are valid.\",\n+    \"  Validate that keys given as inputs are valid.\",\n+    \"  Resources that show what happens if parameters are not validated:\",\n+    \"  http://cryptopals.com/sets/5/challenges/34\",\n+    \"  http://cryptopals.com/sets/5/challenges/35\",\n+    \"* Large numbers:\",\n+    \"  Although the calculations fundamentally do not require large numbers,\",\n+    \"  this is a reasonable real-world use for them\",\n+    \"  and it may be instructive to have an exercise on their use.\",\n+    \"  Consult tracks with this exercise (such as the Go track) for possible inputs to use.\"\n+  ],\n+  \"cases\": [\n+    {\n+      \"description\": \"private key is in range 1 .. p\",\n+      \"property\": \"privateKeyIsInRange\",\n+      \"input\": {},\n+      \"expected\": {}\n+    },\n+    {\n+      \"description\": \"private key is random\",\n+      \"property\": \"privateKeyIsRandom\",\n+      \"input\": {},\n+      \"expected\": {}\n+    },\n+    {\n+      \"description\": \"can calculate public key using private key\",\n+      \"property\": \"publicKey\",\n+      \"input\": {\n+        \"p\": 23,\n+        \"g\": 5,\n+        \"privateKey\": 6\n+      },\n+      \"expected\": 8\n+    },\n+    {\n+      \"description\": \"can calculate secret using other party's public key\",\n+      \"property\": \"secret\",\n+      \"input\": {\n+        \"p\": 23,\n+        \"theirPublicKey\": 19,\n+        \"myPrivateKey\": 6\n+      },\n+      \"expected\": 2\n+    },\n+    {\n+      \"description\": \"key exchange\",\n+      \"property\": \"keyExchange\",\n+      \"input\": {\n+        \"p\": 23,\n+        \"g\": 5,\n+        \"alicePrivateKey\": \"privateKey(p)\",\n+        \"bobPrivateKey\": \"privateKey(p)\",\n+        \"alicePublicKey\": \"publicKey(p, g, alicePrivateKey)\",\n+        \"bobPublicKey\": \"publicKey(p, g, bobPrivateKey)\",\n+        \"secretA\": \"secret(p, bobPublicKey, alicePrivateKey)\",\n+        \"secretB\": \"secret(p, alicePublicKey, bobPrivateKey)\"\n+      },\n+      \"expected\": \"secretA == secretB\"","path":"exercises/diffie-hellman/canonical-data.json","position":64,"original_position":64,"commit_id":"face0f2733651a660e4d07ac6db45a8d31cbf4b4","original_commit_id":"face0f2733651a660e4d07ac6db45a8d31cbf4b4","user":{"login":"petertseng","id":346181,"avatar_url":"https://avatars2.githubusercontent.com/u/346181?v=4","gravatar_id":"","url":"https://api.github.com/users/petertseng","html_url":"https://github.com/petertseng","followers_url":"https://api.github.com/users/petertseng/followers","following_url":"https://api.github.com/users/petertseng/following{/other_user}","gists_url":"https://api.github.com/users/petertseng/gists{/gist_id}","starred_url":"https://api.github.com/users/petertseng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/petertseng/subscriptions","organizations_url":"https://api.github.com/users/petertseng/orgs","repos_url":"https://api.github.com/users/petertseng/repos","events_url":"https://api.github.com/users/petertseng/events{/privacy}","received_events_url":"https://api.github.com/users/petertseng/received_events","type":"User","site_admin":false},"body":"A departure from the usual \"your calculated value should equal the pre-calculated value known to the test\". This is \"these two values that you calculate should be equal\". \r\n\r\nThe only other instance of this I remember is https://github.com/exercism/problem-specifications/blob/master/exercises/zipper/canonical-data.json; see the sameResultFromOperations test and possibly the related discussion around https://github.com/exercism/problem-specifications/pull/934#issuecomment-335202217 and https://github.com/exercism/problem-specifications/pull/934#issuecomment-335952991","created_at":"2018-04-11T05:25:05Z","updated_at":"2018-04-11T05:26:29Z","html_url":"https://github.com/exercism/problem-specifications/pull/1224#discussion_r180638468","pull_request_url":"https://api.github.com/repos/exercism/problem-specifications/pulls/1224","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/exercism/problem-specifications/pulls/comments/180638468"},"html":{"href":"https://github.com/exercism/problem-specifications/pull/1224#discussion_r180638468"},"pull_request":{"href":"https://api.github.com/repos/exercism/problem-specifications/pulls/1224"}}},"pull_request":{"url":"https://api.github.com/repos/exercism/problem-specifications/pulls/1224","id":180791903,"html_url":"https://github.com/exercism/problem-specifications/pull/1224","diff_url":"https://github.com/exercism/problem-specifications/pull/1224.diff","patch_url":"https://github.com/exercism/problem-specifications/pull/1224.patch","issue_url":"https://api.github.com/repos/exercism/problem-specifications/issues/1224","number":1224,"state":"open","locked":false,"title":"diffie-hellman: Add canonical data","user":{"login":"petertseng","id":346181,"avatar_url":"https://avatars2.githubusercontent.com/u/346181?v=4","gravatar_id":"","url":"https://api.github.com/users/petertseng","html_url":"https://github.com/petertseng","followers_url":"https://api.github.com/users/petertseng/followers","following_url":"https://api.github.com/users/petertseng/following{/other_user}","gists_url":"https://api.github.com/users/petertseng/gists{/gist_id}","starred_url":"https://api.github.com/users/petertseng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/petertseng/subscriptions","organizations_url":"https://api.github.com/users/petertseng/orgs","repos_url":"https://api.github.com/users/petertseng/repos","events_url":"https://api.github.com/users/petertseng/events{/privacy}","received_events_url":"https://api.github.com/users/petertseng/received_events","type":"User","site_admin":false},"body":"Resources:\r\n\r\n* https://github.com/exercism/problem-specifications/blob/master/exercises/diffie-hellman/description.md\r\n* https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange\r\n* http://cryptopals.com/sets/5\r\n\r\nImplementing tracks (10):\r\n\r\n* https://github.com/exercism/csharp/blob/master/exercises/diffie-hellman/DiffieHellmanTest.cs\r\n* https://github.com/exercism/ecmascript/blob/master/exercises/diffie-hellman/diffie-hellman.spec.js\r\n* https://github.com/exercism/elixir/blob/master/exercises/diffie-hellman/diffie_hellman_test.exs\r\n* https://github.com/exercism/fsharp/blob/master/exercises/diffie-hellman/DiffieHellmanTest.fs\r\n* https://github.com/exercism/go/blob/master/exercises/diffie-hellman/diffie_hellman_test.go\r\n* https://github.com/exercism/java/blob/master/exercises/diffie-hellman/src/test/java/DiffieHellmanTest.java\r\n* https://github.com/exercism/javascript/blob/master/exercises/diffie-hellman/diffie-hellman.spec.js\r\n* https://github.com/exercism/python/blob/master/exercises/diffie-hellman/diffie_hellman_test.py\r\n* https://github.com/exercism/rust/blob/master/exercises/diffie-hellman/tests/diffie-hellman.rs\r\n* https://github.com/exercism/typescript/blob/master/exercises/diffie-hellman/diffie-hellman.test.ts\r\n\r\nIn the below discussion:\r\n\r\n* \"The ECMAScript family\" is used to refer to the three tracks:\r\n  ECMAScript, JavaScript, TypeScript.\r\n* MITM means man-in-the-middle\r\n* DH means Diffie-Hellman\r\n\r\nAll implementing tracks have the same tests, those shown here, with the\r\nfollowing differences:\r\n\r\n**Inconsequential changes** based on different values selected:\r\n\r\n* Rust used different values for the secret key calculation.\r\n* All three members of the ECMAScript family used only fixed values for\r\n  private keys in the key exchange, rather than random values.\r\n\r\nFundamentally, these changes make no difference, as the same operations\r\nare being tested either way. It is, however, instructive to show the\r\nentire process of a key exchange, so the test is kept.\r\n\r\nAll three members of the ECMAScript family **require implementations to\r\nperform extra validation**:\r\n\r\n* values of `p` are sensible (> 2, prime)\r\n* (though they do not test `g`)\r\n* private keys provided to the public key calculation are < `p`.\r\n\r\nThese tests are **not** included, for the following reasons:\r\n\r\n* The README states that `p` is to be provided by the test suite. Thus,\r\n  validating `p` is not inherently in scope for this exercise. This is\r\n  despite the fact that validating `p` is important when actually doing\r\n  DH! What happens when parameters are not validated:\r\n  http://cryptopals.com/sets/5/challenges/35\r\n* Generating a private key is part of the exercise, and an earlier test\r\n  has already ensured that private keys are in range. Because private\r\n  keys are kept private and not received from others, a MITM cannot\r\n  cause either party to suddenly use a bogus value for a private key.\r\n  In contrast, a MITM might attack DH by tricking the parties into using\r\n  bogus public keys:\r\n  http://cryptopals.com/sets/5/challenges/34\r\n* Allows the core operations to declare Garbage In Garbage Out and not\r\n  concern themselves with validation, whereas the parameters should be\r\n  validated at the points where they may be received from outside.\r\n\r\nOn **testing large numbers**:\r\n\r\n* C#, F#, Java, and Python test that secret calculation works.\r\n* Elixir and Go test that all operations (private key generation, public\r\n  key calculation, secret calculation) work.\r\n* Rust and the ECMAScript family do not test large numbers at all.\r\n\r\nThese are not included because past discussion indicates large numbers\r\nhold no additional value, but may impose implementation hardships in\r\nsome languages:\r\nhttps://github.com/exercism/problem-specifications/pull/944#issuecomment-336730635\r\n\r\nCloses https://github.com/exercism/problem-specifications/issues/557","created_at":"2018-04-11T05:12:13Z","updated_at":"2018-04-11T05:26:29Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1a607302d42f162e91cc61cfe6237654bb87f1ab","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/exercism/problem-specifications/pulls/1224/commits","review_comments_url":"https://api.github.com/repos/exercism/problem-specifications/pulls/1224/comments","review_comment_url":"https://api.github.com/repos/exercism/problem-specifications/pulls/comments{/number}","comments_url":"https://api.github.com/repos/exercism/problem-specifications/issues/1224/comments","statuses_url":"https://api.github.com/repos/exercism/problem-specifications/statuses/face0f2733651a660e4d07ac6db45a8d31cbf4b4","head":{"label":"petertseng:dh","ref":"dh","sha":"face0f2733651a660e4d07ac6db45a8d31cbf4b4","user":{"login":"petertseng","id":346181,"avatar_url":"https://avatars2.githubusercontent.com/u/346181?v=4","gravatar_id":"","url":"https://api.github.com/users/petertseng","html_url":"https://github.com/petertseng","followers_url":"https://api.github.com/users/petertseng/followers","following_url":"https://api.github.com/users/petertseng/following{/other_user}","gists_url":"https://api.github.com/users/petertseng/gists{/gist_id}","starred_url":"https://api.github.com/users/petertseng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/petertseng/subscriptions","organizations_url":"https://api.github.com/users/petertseng/orgs","repos_url":"https://api.github.com/users/petertseng/repos","events_url":"https://api.github.com/users/petertseng/events{/privacy}","received_events_url":"https://api.github.com/users/petertseng/received_events","type":"User","site_admin":false},"repo":{"id":50249694,"name":"exercism-problem-specifications","full_name":"petertseng/exercism-problem-specifications","owner":{"login":"petertseng","id":346181,"avatar_url":"https://avatars2.githubusercontent.com/u/346181?v=4","gravatar_id":"","url":"https://api.github.com/users/petertseng","html_url":"https://github.com/petertseng","followers_url":"https://api.github.com/users/petertseng/followers","following_url":"https://api.github.com/users/petertseng/following{/other_user}","gists_url":"https://api.github.com/users/petertseng/gists{/gist_id}","starred_url":"https://api.github.com/users/petertseng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/petertseng/subscriptions","organizations_url":"https://api.github.com/users/petertseng/orgs","repos_url":"https://api.github.com/users/petertseng/repos","events_url":"https://api.github.com/users/petertseng/events{/privacy}","received_events_url":"https://api.github.com/users/petertseng/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/petertseng/exercism-problem-specifications","description":"Shared metadata for exercism exercises.","fork":true,"url":"https://api.github.com/repos/petertseng/exercism-problem-specifications","forks_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/forks","keys_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/keys{/key_id}","collaborators_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/teams","hooks_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/hooks","issue_events_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/issues/events{/number}","events_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/events","assignees_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/assignees{/user}","branches_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/branches{/branch}","tags_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/tags","blobs_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/git/refs{/sha}","trees_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/git/trees{/sha}","statuses_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/statuses/{sha}","languages_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/languages","stargazers_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/stargazers","contributors_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/contributors","subscribers_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/subscribers","subscription_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/subscription","commits_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/commits{/sha}","git_commits_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/git/commits{/sha}","comments_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/comments{/number}","issue_comment_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/issues/comments{/number}","contents_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/contents/{+path}","compare_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/compare/{base}...{head}","merges_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/merges","archive_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/downloads","issues_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/issues{/number}","pulls_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/pulls{/number}","milestones_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/milestones{/number}","notifications_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/labels{/name}","releases_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/releases{/id}","deployments_url":"https://api.github.com/repos/petertseng/exercism-problem-specifications/deployments","created_at":"2016-01-23T17:34:18Z","updated_at":"2018-04-10T23:32:56Z","pushed_at":"2018-04-11T05:15:39Z","git_url":"git://github.com/petertseng/exercism-problem-specifications.git","ssh_url":"git@github.com:petertseng/exercism-problem-specifications.git","clone_url":"https://github.com/petertseng/exercism-problem-specifications.git","svn_url":"https://github.com/petertseng/exercism-problem-specifications","homepage":null,"size":1715,"stargazers_count":0,"watchers_count":0,"language":"Ruby","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":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"verify"}},"base":{"label":"exercism:master","ref":"master","sha":"adb99f792624d4cdaaede43d5f081da958e93e9b","user":{"login":"exercism","id":5624255,"avatar_url":"https://avatars0.githubusercontent.com/u/5624255?v=4","gravatar_id":"","url":"https://api.github.com/users/exercism","html_url":"https://github.com/exercism","followers_url":"https://api.github.com/users/exercism/followers","following_url":"https://api.github.com/users/exercism/following{/other_user}","gists_url":"https://api.github.com/users/exercism/gists{/gist_id}","starred_url":"https://api.github.com/users/exercism/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/exercism/subscriptions","organizations_url":"https://api.github.com/users/exercism/orgs","repos_url":"https://api.github.com/users/exercism/repos","events_url":"https://api.github.com/users/exercism/events{/privacy}","received_events_url":"https://api.github.com/users/exercism/received_events","type":"Organization","site_admin":false},"repo":{"id":17259886,"name":"problem-specifications","full_name":"exercism/problem-specifications","owner":{"login":"exercism","id":5624255,"avatar_url":"https://avatars0.githubusercontent.com/u/5624255?v=4","gravatar_id":"","url":"https://api.github.com/users/exercism","html_url":"https://github.com/exercism","followers_url":"https://api.github.com/users/exercism/followers","following_url":"https://api.github.com/users/exercism/following{/other_user}","gists_url":"https://api.github.com/users/exercism/gists{/gist_id}","starred_url":"https://api.github.com/users/exercism/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/exercism/subscriptions","organizations_url":"https://api.github.com/users/exercism/orgs","repos_url":"https://api.github.com/users/exercism/repos","events_url":"https://api.github.com/users/exercism/events{/privacy}","received_events_url":"https://api.github.com/users/exercism/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/exercism/problem-specifications","description":"Shared metadata for exercism exercises.","fork":false,"url":"https://api.github.com/repos/exercism/problem-specifications","forks_url":"https://api.github.com/repos/exercism/problem-specifications/forks","keys_url":"https://api.github.com/repos/exercism/problem-specifications/keys{/key_id}","collaborators_url":"https://api.github.com/repos/exercism/problem-specifications/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/exercism/problem-specifications/teams","hooks_url":"https://api.github.com/repos/exercism/problem-specifications/hooks","issue_events_url":"https://api.github.com/repos/exercism/problem-specifications/issues/events{/number}","events_url":"https://api.github.com/repos/exercism/problem-specifications/events","assignees_url":"https://api.github.com/repos/exercism/problem-specifications/assignees{/user}","branches_url":"https://api.github.com/repos/exercism/problem-specifications/branches{/branch}","tags_url":"https://api.github.com/repos/exercism/problem-specifications/tags","blobs_url":"https://api.github.com/repos/exercism/problem-specifications/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/exercism/problem-specifications/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/exercism/problem-specifications/git/refs{/sha}","trees_url":"https://api.github.com/repos/exercism/problem-specifications/git/trees{/sha}","statuses_url":"https://api.github.com/repos/exercism/problem-specifications/statuses/{sha}","languages_url":"https://api.github.com/repos/exercism/problem-specifications/languages","stargazers_url":"https://api.github.com/repos/exercism/problem-specifications/stargazers","contributors_url":"https://api.github.com/repos/exercism/problem-specifications/contributors","subscribers_url":"https://api.github.com/repos/exercism/problem-specifications/subscribers","subscription_url":"https://api.github.com/repos/exercism/problem-specifications/subscription","commits_url":"https://api.github.com/repos/exercism/problem-specifications/commits{/sha}","git_commits_url":"https://api.github.com/repos/exercism/problem-specifications/git/commits{/sha}","comments_url":"https://api.github.com/repos/exercism/problem-specifications/comments{/number}","issue_comment_url":"https://api.github.com/repos/exercism/problem-specifications/issues/comments{/number}","contents_url":"https://api.github.com/repos/exercism/problem-specifications/contents/{+path}","compare_url":"https://api.github.com/repos/exercism/problem-specifications/compare/{base}...{head}","merges_url":"https://api.github.com/repos/exercism/problem-specifications/merges","archive_url":"https://api.github.com/repos/exercism/problem-specifications/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/exercism/problem-specifications/downloads","issues_url":"https://api.github.com/repos/exercism/problem-specifications/issues{/number}","pulls_url":"https://api.github.com/repos/exercism/problem-specifications/pulls{/number}","milestones_url":"https://api.github.com/repos/exercism/problem-specifications/milestones{/number}","notifications_url":"https://api.github.com/repos/exercism/problem-specifications/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/exercism/problem-specifications/labels{/name}","releases_url":"https://api.github.com/repos/exercism/problem-specifications/releases{/id}","deployments_url":"https://api.github.com/repos/exercism/problem-specifications/deployments","created_at":"2014-02-27T18:40:48Z","updated_at":"2018-04-11T01:20:21Z","pushed_at":"2018-04-11T05:15:40Z","git_url":"git://github.com/exercism/problem-specifications.git","ssh_url":"git@github.com:exercism/problem-specifications.git","clone_url":"https://github.com/exercism/problem-specifications.git","svn_url":"https://github.com/exercism/problem-specifications","homepage":null,"size":1515,"stargazers_count":138,"watchers_count":138,"language":"Ruby","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":307,"mirror_url":null,"archived":false,"open_issues_count":88,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":307,"open_issues":88,"watchers":138,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/exercism/problem-specifications/pulls/1224"},"html":{"href":"https://github.com/exercism/problem-specifications/pull/1224"},"issue":{"href":"https://api.github.com/repos/exercism/problem-specifications/issues/1224"},"comments":{"href":"https://api.github.com/repos/exercism/problem-specifications/issues/1224/comments"},"review_comments":{"href":"https://api.github.com/repos/exercism/problem-specifications/pulls/1224/comments"},"review_comment":{"href":"https://api.github.com/repos/exercism/problem-specifications/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/exercism/problem-specifications/pulls/1224/commits"},"statuses":{"href":"https://api.github.com/repos/exercism/problem-specifications/statuses/face0f2733651a660e4d07ac6db45a8d31cbf4b4"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"petertseng"}}