{"action":"created","comment":{"url":"https://api.github.com/repos/dotnet/docs/pulls/comments/150951279","pull_request_review_id":76570661,"id":150951279,"diff_hunk":"@@ -0,0 +1,205 @@\n+---\n+title: Reference semantics with value types\n+description: Understand the language features that minimize copying structures safely\n+author: billwagner\n+ms.author: wiwagn\n+ms.date: 11/10/2017\n+ms.topic: article\n+ms.prod: .net\n+ms.technology: devlang-csharp\n+ms.devlang: csharp\n+ms.custom: mvc\n+---\n+\n+# Reference semantics with value types\n+\n+An advantage to using value types is that they often avoid heap allocations.\n+The corresponding disadvantage is that they are copied by value. This tradeoff\n+makes it harder to optimize algorithms that operate on large amounts of\n+data. New language features in C# 7.2 provide mechanisms that enable pass-by-refernce\n+semantics with value types. Use these features wisely, and you can minimize both allocations\n+and copy operations. This article explores those new features.\n+\n+Much of the sample code in this article demonstrates features added in C# 7.2. In order to\n+use those features, you have to configure the compiler to use C# 7.2 or later in your\n+project. You can use Visual Studio to select it. For each project, select **Project** from\n+the menu, then **Properties**. Select the **Build** tab and click **Advanced**. From there,\n+you can configure the language version. Choose either \"7.2\", or \"latest\".  Or, you can\n+edit the *csproj* file and add the following node:\n+\n+```XML\n+  <PropertyGroup>\n+    <LangVersion>7.2</LangVersion>\n+  </PropertyGroup>\n+```\n+\n+You can use either \"7.2\" or \"latest\" for the value.\n+\n+## Specifying `in` parameters\n+\n+C# 7.2 adds the `in` keyword to complement the existing `ref`\n+and `out` keywords when you write a method that passes arguments\n+by reference. The `in` keyword specifies that you are passing\n+the parameter by reference and the called method does not modify\n+the value passed to it. \n+\n+This addition provides a full vocabulary to express your design intent:\n+\n+- `out`: This method sets the value of the argument used as this parameter.\n+- `ref`: This method may set the value of the argument used as this parameter.\n+- `in`: This method does not modify the value of the argument used as this parameter.\n+\n+When you add the `in` modify to pass an argument by reference, you declare\n+your design intent is to pass arguments by reference to\n+avoid unnecessary copying. You do not intend to modify the object used\n+as that argument. The following code shows an example of a method\n+that calculates the distance between two points in 3D space. \n+\n+[!code-csharp[InArgument](../../samples/csharp/reference-semantics/Program.cs#InArgument \"Specifying an In argument\")]\n+\n+The arguments are two structures that each contain three doubles. A double is 8 bytes,\n+so each argument is 24 bytes. By specifying the `in` modifier, you pass a\n+reference to those arguments, either 4 bytes or 8 bytes each depending on the\n+architecture of the machine. The difference in size is small, but it can quickly add\n+up when your application calls this method in a tight loop using many different\n+values.\n+ \n+The `in` modifier complements `out` and `ref` in other ways as well. You\n+cannot create overloads of a method that differ only in the presence of\n+`in`, `out` or `ref`. These new rules extend the same behavior that had always been\n+defined for `out` and `ref` parameters.\n+\n+The `in` modifier may be applied to any member that takes parameters:\n+methods, delegates, lambdas, local functions, indexers, operators.\n+\n+Unlike `ref` and `out` arguments, you may use literal values or constants\n+for the argument to an `in` parameter. Also, unlike a `ref` or `out` parameter,\n+you don't need to apply the `in` modifier at the call site. The following\n+code shows you two examples of calling the `CalculateDistance` method. The\n+first uses two local variables, passed by reference. The second include a\n+temporary variable created as part of the method call. \n+\n+[!code-csharp[UseInArgument](../../samples/csharp/reference-semantics/Program.cs#UseInArgument \"Specifying an In argument\")]\n+\n+There are several ways in which the compiler ensures that the readonly\n+nature of an `in` argument is enforced.  First of all, the called method\n+can't directly assign to an `in` parameter. It can't directly assign\n+to any field of an `in` parameter. In addition, you cannot pass\n+an `in` parameter to any method demanding the `ref` or `out` modifier.\n+The compiler enforces that the `in` argument is a readonly variable. You\n+can call any instance method that uses pass-by-value semantics. In\n+those instances, a copy of the `in` parameter is created. Because the compiler\n+can create a temporary for any `in` parameter, you can also specify default\n+values for any `in` parameter. The follow code uses that to specify the origin\n+as the default value for the second point:\n+\n+[!code-csharp[InArgumentDefault](../../samples/csharp/reference-semantics/Program.cs#InArgumentDefault \"Specifying defaults for an in parameter\")]\n+\n+The `in` parameter designation can also be used with reference types, or built in\n+numeric values. However, the benefits inn both cases are minimal if any.\n+\n+## `ref readonly` returns\n+\n+You may also want to return a value type by reference, but disallow the\n+caller from modifying that value. Use the `ref readonly` modifier to\n+express that design intent. It notifies readers\n+that you are returning a reference to existing data, but not allowing\n+modification. \n+\n+The compiler enforces that the caller cannot modify the reference. Attempts\n+to assign to the value directly generate a compile-time error. Calling member\n+methods creates a defensive copy. \n+\n+Creating a copy of a ref readonly return is easy: Just assign it to a variable\n+not declared with the `ref readonly` modifier. The compiler generates code\n+to copy the object as part of the assignment. \n+\n+It's likely that the library using `Point3D` would often use the origin\n+throughout the code. Every instance creates a new object on the stack. It may\n+be advantageous to create a constant and return it by reference. But, if you\n+are returning a reference to internal storage, you may want to enforce that\n+the caller cannot modify the referenced storage. The following code\n+defines a read-only property that returns a `readonly ref` to a `Point3D`\n+that specifies the origin.\n+\n+[!code-csharp[OriginReference](../../samples/csharp/reference-semantics/Point3D.cs#OriginReference \"Creating a readonly Origin reference\")]\n+\n+When you assign a variable to a `ref return`, you can specify either a `ref readonly`\n+variable, or a by-value copy of the readonly reference:\n+\n+[!code-csharp[AssignRefReadonly](../../samples/csharp/reference-semantics/Program.cs#AssignRefReadonly \"Assigning a ref readonly\")]\n+\n+The first assignment in the preceding code makes a copy of the `Origin` constant, and assigns\n+that copy. The second assigns a reference. Notice that the `readonly` modifier\n+must be part of the declaration of the variable. The reference to which it refers\n+cannot be modified. Attempts to do so results in a compile-time error.\n+\n+## `readonly struct` type\n+\n+Applying `ref readonly` to high-traffic uses of a struct may be sufficient.\n+Other times, you may want to create an immutable struct. Then, you can\n+always pass by readonly reference. That practice \n+removes the defensive copies\n+that take place when you access methods of a struct used as an `in` parameter.\n+\n+You can do that by creating a `readonly struct` type. You can add the `readonly`\n+modifier to a struct declaration. The language enforces that all members of\n+the struct are `readonly`: the `struct` must be immutable.\n+\n+There are other optimizations for a `readonly struct`. You can\n+use the `in` modifier at every location where a `readonly struct` is an\n+argument. In addition, you can return a `readonly struct` as a `ref return` when\n+you are returning an object whose lifetime extends beyond the scope of the method\n+returning the object.\n+\n+Finally, the compiler generates more efficient code when you call members of a\n+`readonly struct`: The `this` reference is always an `in` parameter, instead\n+of a copy of the receiver, passed by value to the member method. This optimization\n+saves more copying when you use a `readonly struct`. The `Point3D` would be a great\n+candidate for this change. The following code shows an update `ReadonlyPoint3D` structure:\n+\n+[!code-csharp[ReadonlyOnlyPoint3D](../../samples/csharp/reference-semantics/Point3D.cs#ReadonlyOnlyPoint3D \"Defining an immutable structure\")]\n+\n+## `ref struct` type\n+\n+Another related language feature is the ability to declare a value type that\n+must be stack allocated. In other words, these types can never be created on the\n+heap as a member of another class. The primary motivation for this feature\n+was `Span<T>` and related structures, but you can create `ref struct` types\n+when you have similar requirements. In this article, you see examples","path":"docs/csharp/ref-locals-and-returns.md","position":169,"original_position":169,"commit_id":"5b34265a66692bebcee1c44f0338172f8dce5af0","original_commit_id":"5b34265a66692bebcee1c44f0338172f8dce5af0","user":{"login":"rpetrusha","id":10886961,"avatar_url":"https://avatars2.githubusercontent.com/u/10886961?v=4","gravatar_id":"","url":"https://api.github.com/users/rpetrusha","html_url":"https://github.com/rpetrusha","followers_url":"https://api.github.com/users/rpetrusha/followers","following_url":"https://api.github.com/users/rpetrusha/following{/other_user}","gists_url":"https://api.github.com/users/rpetrusha/gists{/gist_id}","starred_url":"https://api.github.com/users/rpetrusha/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rpetrusha/subscriptions","organizations_url":"https://api.github.com/users/rpetrusha/orgs","repos_url":"https://api.github.com/users/rpetrusha/repos","events_url":"https://api.github.com/users/rpetrusha/events{/privacy}","received_events_url":"https://api.github.com/users/rpetrusha/received_events","type":"User","site_admin":false},"body":"The requirements aren't clear. Can you mention a use case here?","created_at":"2017-11-14T20:18:12Z","updated_at":"2017-11-14T20:20:55Z","html_url":"https://github.com/dotnet/docs/pull/3667#discussion_r150951279","pull_request_url":"https://api.github.com/repos/dotnet/docs/pulls/3667","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/dotnet/docs/pulls/comments/150951279"},"html":{"href":"https://github.com/dotnet/docs/pull/3667#discussion_r150951279"},"pull_request":{"href":"https://api.github.com/repos/dotnet/docs/pulls/3667"}}},"pull_request":{"url":"https://api.github.com/repos/dotnet/docs/pulls/3667","id":152315525,"html_url":"https://github.com/dotnet/docs/pull/3667","diff_url":"https://github.com/dotnet/docs/pull/3667.diff","patch_url":"https://github.com/dotnet/docs/pull/3667.patch","issue_url":"https://api.github.com/repos/dotnet/docs/issues/3667","number":3667,"state":"open","locked":false,"title":"Ref updates for 7.2","user":{"login":"BillWagner","id":493969,"avatar_url":"https://avatars2.githubusercontent.com/u/493969?v=4","gravatar_id":"","url":"https://api.github.com/users/BillWagner","html_url":"https://github.com/BillWagner","followers_url":"https://api.github.com/users/BillWagner/followers","following_url":"https://api.github.com/users/BillWagner/following{/other_user}","gists_url":"https://api.github.com/users/BillWagner/gists{/gist_id}","starred_url":"https://api.github.com/users/BillWagner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BillWagner/subscriptions","organizations_url":"https://api.github.com/users/BillWagner/orgs","repos_url":"https://api.github.com/users/BillWagner/repos","events_url":"https://api.github.com/users/BillWagner/events{/privacy}","received_events_url":"https://api.github.com/users/BillWagner/received_events","type":"User","site_admin":false},"body":"Fixes #3241 \r\n\r\nExplain the concepts behind `in` parameters, `ref readonly` returns, `readonly struct` types and `ref struct` types.\r\n\r\n","created_at":"2017-11-13T18:42:34Z","updated_at":"2017-11-14T20:20:56Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3ff7838db493d23d94f6faab38046cedf23a44f3","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/dotnet/docs/pulls/3667/commits","review_comments_url":"https://api.github.com/repos/dotnet/docs/pulls/3667/comments","review_comment_url":"https://api.github.com/repos/dotnet/docs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dotnet/docs/issues/3667/comments","statuses_url":"https://api.github.com/repos/dotnet/docs/statuses/5b34265a66692bebcee1c44f0338172f8dce5af0","head":{"label":"BillWagner:ref-updates-for-7-2","ref":"ref-updates-for-7-2","sha":"5b34265a66692bebcee1c44f0338172f8dce5af0","user":{"login":"BillWagner","id":493969,"avatar_url":"https://avatars2.githubusercontent.com/u/493969?v=4","gravatar_id":"","url":"https://api.github.com/users/BillWagner","html_url":"https://github.com/BillWagner","followers_url":"https://api.github.com/users/BillWagner/followers","following_url":"https://api.github.com/users/BillWagner/following{/other_user}","gists_url":"https://api.github.com/users/BillWagner/gists{/gist_id}","starred_url":"https://api.github.com/users/BillWagner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BillWagner/subscriptions","organizations_url":"https://api.github.com/users/BillWagner/orgs","repos_url":"https://api.github.com/users/BillWagner/repos","events_url":"https://api.github.com/users/BillWagner/events{/privacy}","received_events_url":"https://api.github.com/users/BillWagner/received_events","type":"User","site_admin":false},"repo":{"id":45638874,"name":"docs","full_name":"BillWagner/docs","owner":{"login":"BillWagner","id":493969,"avatar_url":"https://avatars2.githubusercontent.com/u/493969?v=4","gravatar_id":"","url":"https://api.github.com/users/BillWagner","html_url":"https://github.com/BillWagner","followers_url":"https://api.github.com/users/BillWagner/followers","following_url":"https://api.github.com/users/BillWagner/following{/other_user}","gists_url":"https://api.github.com/users/BillWagner/gists{/gist_id}","starred_url":"https://api.github.com/users/BillWagner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BillWagner/subscriptions","organizations_url":"https://api.github.com/users/BillWagner/orgs","repos_url":"https://api.github.com/users/BillWagner/repos","events_url":"https://api.github.com/users/BillWagner/events{/privacy}","received_events_url":"https://api.github.com/users/BillWagner/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/BillWagner/docs","description":".NET Core documentation (work in progress).","fork":true,"url":"https://api.github.com/repos/BillWagner/docs","forks_url":"https://api.github.com/repos/BillWagner/docs/forks","keys_url":"https://api.github.com/repos/BillWagner/docs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/BillWagner/docs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/BillWagner/docs/teams","hooks_url":"https://api.github.com/repos/BillWagner/docs/hooks","issue_events_url":"https://api.github.com/repos/BillWagner/docs/issues/events{/number}","events_url":"https://api.github.com/repos/BillWagner/docs/events","assignees_url":"https://api.github.com/repos/BillWagner/docs/assignees{/user}","branches_url":"https://api.github.com/repos/BillWagner/docs/branches{/branch}","tags_url":"https://api.github.com/repos/BillWagner/docs/tags","blobs_url":"https://api.github.com/repos/BillWagner/docs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/BillWagner/docs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/BillWagner/docs/git/refs{/sha}","trees_url":"https://api.github.com/repos/BillWagner/docs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/BillWagner/docs/statuses/{sha}","languages_url":"https://api.github.com/repos/BillWagner/docs/languages","stargazers_url":"https://api.github.com/repos/BillWagner/docs/stargazers","contributors_url":"https://api.github.com/repos/BillWagner/docs/contributors","subscribers_url":"https://api.github.com/repos/BillWagner/docs/subscribers","subscription_url":"https://api.github.com/repos/BillWagner/docs/subscription","commits_url":"https://api.github.com/repos/BillWagner/docs/commits{/sha}","git_commits_url":"https://api.github.com/repos/BillWagner/docs/git/commits{/sha}","comments_url":"https://api.github.com/repos/BillWagner/docs/comments{/number}","issue_comment_url":"https://api.github.com/repos/BillWagner/docs/issues/comments{/number}","contents_url":"https://api.github.com/repos/BillWagner/docs/contents/{+path}","compare_url":"https://api.github.com/repos/BillWagner/docs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/BillWagner/docs/merges","archive_url":"https://api.github.com/repos/BillWagner/docs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/BillWagner/docs/downloads","issues_url":"https://api.github.com/repos/BillWagner/docs/issues{/number}","pulls_url":"https://api.github.com/repos/BillWagner/docs/pulls{/number}","milestones_url":"https://api.github.com/repos/BillWagner/docs/milestones{/number}","notifications_url":"https://api.github.com/repos/BillWagner/docs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/BillWagner/docs/labels{/name}","releases_url":"https://api.github.com/repos/BillWagner/docs/releases{/id}","deployments_url":"https://api.github.com/repos/BillWagner/docs/deployments","created_at":"2015-11-05T20:57:32Z","updated_at":"2017-04-09T01:27:07Z","pushed_at":"2017-11-14T19:27:40Z","git_url":"git://github.com/BillWagner/docs.git","ssh_url":"git@github.com:BillWagner/docs.git","clone_url":"https://github.com/BillWagner/docs.git","svn_url":"https://github.com/BillWagner/docs","homepage":"http://dotnet.readthedocs.org","size":376860,"stargazers_count":1,"watchers_count":1,"language":null,"has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":4,"mirror_url":null,"archived":false,"open_issues_count":0,"forks":4,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"dotnet:master","ref":"master","sha":"2cbda011da06c7d7295a04477ff8fe0cb78bca28","user":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars0.githubusercontent.com/u/9141961?v=4","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"repo":{"id":35890081,"name":"docs","full_name":"dotnet/docs","owner":{"login":"dotnet","id":9141961,"avatar_url":"https://avatars0.githubusercontent.com/u/9141961?v=4","gravatar_id":"","url":"https://api.github.com/users/dotnet","html_url":"https://github.com/dotnet","followers_url":"https://api.github.com/users/dotnet/followers","following_url":"https://api.github.com/users/dotnet/following{/other_user}","gists_url":"https://api.github.com/users/dotnet/gists{/gist_id}","starred_url":"https://api.github.com/users/dotnet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dotnet/subscriptions","organizations_url":"https://api.github.com/users/dotnet/orgs","repos_url":"https://api.github.com/users/dotnet/repos","events_url":"https://api.github.com/users/dotnet/events{/privacy}","received_events_url":"https://api.github.com/users/dotnet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dotnet/docs","description":"This repository contains .NET Documentation.","fork":false,"url":"https://api.github.com/repos/dotnet/docs","forks_url":"https://api.github.com/repos/dotnet/docs/forks","keys_url":"https://api.github.com/repos/dotnet/docs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dotnet/docs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dotnet/docs/teams","hooks_url":"https://api.github.com/repos/dotnet/docs/hooks","issue_events_url":"https://api.github.com/repos/dotnet/docs/issues/events{/number}","events_url":"https://api.github.com/repos/dotnet/docs/events","assignees_url":"https://api.github.com/repos/dotnet/docs/assignees{/user}","branches_url":"https://api.github.com/repos/dotnet/docs/branches{/branch}","tags_url":"https://api.github.com/repos/dotnet/docs/tags","blobs_url":"https://api.github.com/repos/dotnet/docs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dotnet/docs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dotnet/docs/git/refs{/sha}","trees_url":"https://api.github.com/repos/dotnet/docs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dotnet/docs/statuses/{sha}","languages_url":"https://api.github.com/repos/dotnet/docs/languages","stargazers_url":"https://api.github.com/repos/dotnet/docs/stargazers","contributors_url":"https://api.github.com/repos/dotnet/docs/contributors","subscribers_url":"https://api.github.com/repos/dotnet/docs/subscribers","subscription_url":"https://api.github.com/repos/dotnet/docs/subscription","commits_url":"https://api.github.com/repos/dotnet/docs/commits{/sha}","git_commits_url":"https://api.github.com/repos/dotnet/docs/git/commits{/sha}","comments_url":"https://api.github.com/repos/dotnet/docs/comments{/number}","issue_comment_url":"https://api.github.com/repos/dotnet/docs/issues/comments{/number}","contents_url":"https://api.github.com/repos/dotnet/docs/contents/{+path}","compare_url":"https://api.github.com/repos/dotnet/docs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dotnet/docs/merges","archive_url":"https://api.github.com/repos/dotnet/docs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dotnet/docs/downloads","issues_url":"https://api.github.com/repos/dotnet/docs/issues{/number}","pulls_url":"https://api.github.com/repos/dotnet/docs/pulls{/number}","milestones_url":"https://api.github.com/repos/dotnet/docs/milestones{/number}","notifications_url":"https://api.github.com/repos/dotnet/docs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dotnet/docs/labels{/name}","releases_url":"https://api.github.com/repos/dotnet/docs/releases{/id}","deployments_url":"https://api.github.com/repos/dotnet/docs/deployments","created_at":"2015-05-19T15:13:32Z","updated_at":"2017-11-14T08:07:35Z","pushed_at":"2017-11-14T19:46:29Z","git_url":"git://github.com/dotnet/docs.git","ssh_url":"git@github.com:dotnet/docs.git","clone_url":"https://github.com/dotnet/docs.git","svn_url":"https://github.com/dotnet/docs","homepage":"https://docs.microsoft.com/dotnet","size":476968,"stargazers_count":748,"watchers_count":748,"language":null,"has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1555,"mirror_url":null,"archived":false,"open_issues_count":334,"forks":1555,"open_issues":334,"watchers":748,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dotnet/docs/pulls/3667"},"html":{"href":"https://github.com/dotnet/docs/pull/3667"},"issue":{"href":"https://api.github.com/repos/dotnet/docs/issues/3667"},"comments":{"href":"https://api.github.com/repos/dotnet/docs/issues/3667/comments"},"review_comments":{"href":"https://api.github.com/repos/dotnet/docs/pulls/3667/comments"},"review_comment":{"href":"https://api.github.com/repos/dotnet/docs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dotnet/docs/pulls/3667/commits"},"statuses":{"href":"https://api.github.com/repos/dotnet/docs/statuses/5b34265a66692bebcee1c44f0338172f8dce5af0"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"rpetrusha"}}