{"id":27,"date":"2024-02-08T21:21:57","date_gmt":"2024-02-08T21:21:57","guid":{"rendered":"https:\/\/blogs.oregonstate.edu\/scriptedwaters\/?p=27"},"modified":"2024-02-08T21:56:24","modified_gmt":"2024-02-08T21:56:24","slug":"object-oriented-blueprinting","status":"publish","type":"post","link":"https:\/\/blogs.oregonstate.edu\/scriptedwaters\/2024\/02\/08\/object-oriented-blueprinting\/","title":{"rendered":"Object Oriented Blueprinting"},"content":{"rendered":"\n<p class=\"has-medium-font-size\">My group&#8217;s \u201cEscape Room Challenge\u201d has provided us an awesome opportunity to showcase some introductory capabilities of the Unreal Game Engine in a fun and interactive way.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/5hNj-BcN1mQq0-_f0-R4UTT9q_8tJ3mBD25CDIlm989LoE92-xNCunw-6SwVbF51mC1o1UNUYCFEWcegYHc12T9DHnjn3F0fOaU7ViMP7HkTFzwabk4xE3UdhSZvpy2XYDx8a_nCKIFtEHxGxDdDaAQ\" alt=\"\" \/><\/figure>\n\n\n\n<p class=\"has-small-font-size\">(Image source: <a href=\"https:\/\/www.unrealengine.com\/en-US\/\">https:\/\/www.unrealengine.com\/en-US\/<\/a>)<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\">One of my favorite features of Unreal is the built-in \u201cBlueprint\u201d visual coding language.&nbsp; While I enjoy writing code, I appreciate that Blueprint allows users that are both new to coding and seasoned professionals to jump into the development process within Unreal.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/hFLEUobq5xEppqnsOA8E7jyeET8Te6WqidJeuxnFv3DUXvJgPdpTNK3xMqEhM3bRqlZE5KpaIymFbTsNoNNz6TMaHk_4sycmHESTyi5PtREiILwNIXb6VHkLrlM6hyS86DYKrXaFKiqrLiqJ-2-59zk\" alt=\"\" \/><\/figure>\n\n\n\n<p class=\"has-small-font-size\">(Image source: <a href=\"https:\/\/docs.unrealengine.com\/5.2\/en-US\/blueprints-visual-scripting-in-unreal-engine\/\">https:\/\/docs.unrealengine.com\/5.2\/en-US\/blueprints-visual-scripting-in-unreal-engine\/<\/a>)&nbsp;<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\">Let\u2019s take a look at a piece of sample code from the content pack we used as the base for our project: Modular Victorian House.&nbsp; A pack that I was lucky enough to get for free during the Epic Games monthly sale.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/5IKCBwGaRUnWiJoxpBtyDZZfcKHQSxcPaDd5htvSy4rRTbjyJeYVQDppYf7-0uic9sa4qjroqfIwVU4NnxPnVw4jNjfODxCTuLNFQ4QifImak-A1mNYqCF0ppSXWhZ9DPmzAbPznVZ7r_xmMFsDkD4Q\" alt=\"\" \/><\/figure>\n\n\n\n<p class=\"has-small-font-size\">(Image source: <a href=\"https:\/\/www.unrealengine.com\/marketplace\/en-US\/product\/victorian-house\">https:\/\/www.unrealengine.com\/marketplace\/en-US\/product\/victorian-house<\/a>)&nbsp;<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\">In the pack, among the provided content, is the \u201cBlueprint\u201d code for an interactive door. &nbsp; Included functionality allows the door to be opened or closed (top) as well as to to alter the cursor to indicate the door can be opened (bottom).&nbsp;&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/GnuGen_vYZG63qhtLpNhPc7tIX91qlAH_SWv8PkNRdxtXkpKG8hYm1LqfhVGQmfBilFkzw2v6vICI26X7PM9iaEjTYRki-l3aRY9uu1Qm6C29T0CG5t5F6ISm_87igryL9TVBCleVdwzowIXQDuMm9E\" alt=\"\" \/><\/figure>\n\n\n\n<p class=\"has-small-font-size\">(Image source: Unreal Editor screenshot of content from <a href=\"https:\/\/www.unrealengine.com\/marketplace\/en-US\/product\/victorian-house\">https:\/\/www.unrealengine.com\/marketplace\/en-US\/product\/victorian-house<\/a>)&nbsp;<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\">For this example, we will focus on just the top section \u2192 the \u201cOpen Door\u201d code segment.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"291\" src=\"https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.30.49-PM-1024x291.png\" alt=\"\" class=\"wp-image-35\" srcset=\"https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.30.49-PM-1024x291.png 1024w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.30.49-PM-300x85.png 300w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.30.49-PM-768x218.png 768w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.30.49-PM-1536x437.png 1536w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.30.49-PM-2048x582.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"has-small-font-size\">(Image source: Unreal Editor screenshot of content from <a href=\"https:\/\/www.unrealengine.com\/marketplace\/en-US\/product\/victorian-house\">https:\/\/www.unrealengine.com\/marketplace\/en-US\/product\/victorian-house<\/a>)&nbsp;<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\">First, on the left in red we see TWO separate event triggers: \u201cEvent On Interact\u201d and \u201cEvent ActorBeginOverlap\u201d. We look at the \u201cEvent On Interact\u201d trigger that performs the open and close functionality.&nbsp; From the trigger, it splits into a option for based on the door\u2019s current status: closed (A) or open (B).&nbsp; While it next feeds into a sequencing function that also triggers the sound effect, we are solely going to focus on the portion that feeds into the function \u201cDoor\u201d.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"507\" src=\"https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.31.04-PM-1024x507.png\" alt=\"\" class=\"wp-image-36\" srcset=\"https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.31.04-PM-1024x507.png 1024w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.31.04-PM-300x149.png 300w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.31.04-PM-768x381.png 768w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.31.04-PM-1536x761.png 1536w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.31.04-PM-2048x1015.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"has-small-font-size\">(Image source: Unreal Editor Screenshot of content from <a href=\"https:\/\/www.unrealengine.com\/marketplace\/en-US\/product\/victorian-house\">https:\/\/www.unrealengine.com\/marketplace\/en-US\/product\/victorian-house<\/a>)&nbsp;<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\">Look familiar? This event trigger resembles the Scratch block coding language that is intended to be a gateway to coding.&nbsp; In the snipped below, we create an event that broadcasts a message called \u201copen_door\u201d that the door object would be listening to.&nbsp; Once that code segment hears the message, it will then trigger the code segment that opens the door (not pictured).<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/tmsF_nI6Xc36zoSw3Jai668kL_vTMlQZsGnsWcVftIX-Hc-WZAETO321CePLCAsdJaD3ZQMFFHWP_89n6GwNtW9bxreaSxvpCtn1bhUFUdOLAHPp1OTpClN2ABOi392Wpg12PMLpAMPzeVoN-JzBSGM\" alt=\"\" \/><\/figure>\n\n\n\n<p class=\"has-small-font-size\">(Image Source: <a href=\"https:\/\/scratch.mit.edu\/projects\/editor\/?tutorial=home\">https:\/\/scratch.mit.edu\/projects\/editor\/?tutorial=home<\/a>)<\/p>\n\n\n\n<p class=\"has-medium-font-size\">Back in Blueprint, once the \u201cDoor\u201d function receives the cue \u201cPlay\u201d (for opening the door) or \u201cReverse\u201d (for closing the door), it completes two tasks: 1) it edits the \u201cYaw\u201d of the door via the \u201cMake Rotator\u201d function, in order to rotate its physical look within the simulated space, and 2) it updates the \u201cRelative Rotation\u201d of the simulated door object by specifically referencing the \u201cMesh Door 02\u201d object as the \u201cTarget\u201d and the updated rotation from the \u201cMake Rotator\u201d function, to supply its final rotation.&nbsp;&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"425\" src=\"https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.31.19-PM-1024x425.png\" alt=\"\" class=\"wp-image-37\" srcset=\"https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.31.19-PM-1024x425.png 1024w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.31.19-PM-300x125.png 300w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.31.19-PM-768x319.png 768w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.31.19-PM-1536x638.png 1536w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.31.19-PM-2048x851.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"has-small-font-size\">(Image source: Unreal Editor screenshot of content from <a href=\"https:\/\/www.unrealengine.com\/marketplace\/en-US\/product\/victorian-house\">https:\/\/www.unrealengine.com\/marketplace\/en-US\/product\/victorian-house<\/a>)&nbsp;<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\">With the Blueprint code above in mind, what might this functionality look like in Python instead? Below I have coded up a VERY BASIC (essentially pseudocode) version of the functionality to see how it might compare. We see that it essentially works off the same principles: 1) it waits for a trigger, 2) it calls a function to check the current status of the door, and 3) it updates the rotation of the object to reflect the desired rotational status.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"471\" src=\"https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.17.51-PM-1024x471.png\" alt=\"\" class=\"wp-image-28\" srcset=\"https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.17.51-PM-1024x471.png 1024w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.17.51-PM-300x138.png 300w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.17.51-PM-768x353.png 768w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.17.51-PM-1536x706.png 1536w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.17.51-PM-2048x942.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\">With these similarities in mind, I choose to think of Blueprint as somewhat of a blend of Scratch (block-style) coding, and more formal Object Oriented coding languages like Python or C++.\u00a0 As it provides deep functionality for creating games (from the OOP languages) but also maintains the ease of use for the user \u2013 especially new users (similar to Scratch).\u00a0 <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"512\" src=\"https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.19.19-PM-1024x512.png\" alt=\"\" class=\"wp-image-30\" srcset=\"https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.19.19-PM-1024x512.png 1024w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.19.19-PM-300x150.png 300w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.19.19-PM-768x384.png 768w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.19.19-PM-1536x767.png 1536w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.19.19-PM-2048x1023.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\">Upon starting with Blueprint, I found the learning curve was a bit steep.  After spending some time working with this visual coding language, I find myself better understanding the connections and workflow.  <\/p>\n\n\n\n<p class=\"has-medium-font-size\">On first look at the functionality for a door alone, it is very intimidating.  All the boxes and white lines connecting different things makes it confusing.  While I cannot completely fault the language for this, I will say that sometimes the links (white lines) that connect the functions can make it hard to follow.  Perhaps it would be improved by color-coding these links based on the data type being transmitted via these links.  <\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-us.googleusercontent.com\/GnuGen_vYZG63qhtLpNhPc7tIX91qlAH_SWv8PkNRdxtXkpKG8hYm1LqfhVGQmfBilFkzw2v6vICI26X7PM9iaEjTYRki-l3aRY9uu1Qm6C29T0CG5t5F6ISm_87igryL9TVBCleVdwzowIXQDuMm9E\" alt=\"\" \/><\/figure>\n\n\n\n<p class=\"has-small-font-size\">(Image source: Unreal Editor screenshot of content from <a href=\"https:\/\/www.unrealengine.com\/marketplace\/en-US\/product\/victorian-house\">https:\/\/www.unrealengine.com\/marketplace\/en-US\/product\/victorian-house<\/a>)<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\">Despite the learning curve of the language, I find that the overall benefits and friendliness of the language outweigh the downsides.  The content packs available in the marketplace (many for free) provide example functionality for many Blueprint functions and the seemingly endless wealth of online tutorials, forms, and courses, make this an amazing tool. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"520\" src=\"https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.39.29-PM-1024x520.png\" alt=\"\" class=\"wp-image-38\" srcset=\"https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.39.29-PM-1024x520.png 1024w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.39.29-PM-300x152.png 300w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.39.29-PM-768x390.png 768w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.39.29-PM-1536x780.png 1536w, https:\/\/osu-wams-blogs-uploads.s3.amazonaws.com\/blogs.dir\/7655\/files\/2024\/02\/Screenshot-2024-02-08-at-3.39.29-PM-2048x1040.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"has-small-font-size\">(Image source: Epic Games in-app Marketplace screenshot from <a href=\"https:\/\/marketplace-website-node-launcher-prod.ol.epicgames.com\/ue\/marketplace\/en-US\/assets?count=20&amp;sortBy=effectiveDate&amp;sortDir=DESC&amp;start=0&amp;tag=4910\">https:\/\/marketplace-website-node-launcher-prod.ol.epicgames.com\/ue\/marketplace\/en-US\/assets?count=20&amp;sortBy=effectiveDate&amp;sortDir=DESC&amp;start=0&amp;tag=4910<\/a>)<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\">Unreal Engine&#8217;s Blueprint coding language is a great opportunity to utilize extensive capabilities in game development while still trying to understand the depth of coding applications, truly making it the \u201cbest of both worlds\u201d (Hannah Montana would be so proud).\u00a0<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-medium-font-size\">Peace out coders!<\/p>\n\n\n\n<p class=\"has-medium-font-size\">-Kristy <\/p>\n","protected":false},"excerpt":{"rendered":"<p>My group&#8217;s \u201cEscape Room Challenge\u201d has provided us an awesome opportunity to showcase some introductory capabilities of the Unreal Game Engine in a fun and interactive way. (Image source: https:\/\/www.unrealengine.com\/en-US\/) One of my favorite features of Unreal is the built-in \u201cBlueprint\u201d visual coding language.&nbsp; While I enjoy writing code, I appreciate that Blueprint allows users [&hellip;]<\/p>\n","protected":false},"author":14105,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-27","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/blogs.oregonstate.edu\/scriptedwaters\/wp-json\/wp\/v2\/posts\/27","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.oregonstate.edu\/scriptedwaters\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.oregonstate.edu\/scriptedwaters\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.oregonstate.edu\/scriptedwaters\/wp-json\/wp\/v2\/users\/14105"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.oregonstate.edu\/scriptedwaters\/wp-json\/wp\/v2\/comments?post=27"}],"version-history":[{"count":10,"href":"https:\/\/blogs.oregonstate.edu\/scriptedwaters\/wp-json\/wp\/v2\/posts\/27\/revisions"}],"predecessor-version":[{"id":45,"href":"https:\/\/blogs.oregonstate.edu\/scriptedwaters\/wp-json\/wp\/v2\/posts\/27\/revisions\/45"}],"wp:attachment":[{"href":"https:\/\/blogs.oregonstate.edu\/scriptedwaters\/wp-json\/wp\/v2\/media?parent=27"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.oregonstate.edu\/scriptedwaters\/wp-json\/wp\/v2\/categories?post=27"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.oregonstate.edu\/scriptedwaters\/wp-json\/wp\/v2\/tags?post=27"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}