{"id":15,"date":"2015-11-29T12:54:20","date_gmt":"2015-11-29T17:54:20","guid":{"rendered":"http:\/\/robodk.com\/blog\/?page_id=15"},"modified":"2024-11-18T12:40:33","modified_gmt":"2024-11-18T17:40:33","slug":"off-line-programming","status":"publish","type":"page","link":"https:\/\/robodk.com\/blog\/off-line-programming\/","title":{"rendered":"Off-line Programming"},"content":{"rendered":"\n<p>If you drive a car, it makes little difference what brand it is: all cars are driven the same way. The same applies to computers. If you have a Windows PC, the user interface won\u2019t be affected by your computer hardware. This is definitely not the case for industrial robots.<\/p>\n\n\n\n<p>The way you program an industrial robot strongly depends on the robot brand. You might think that a robot program looks like C++ or Visual Basic. The truth is that some robots are still programmed in assembler-like languages.<\/p>\n\n\n\n<figure class=\"wp-block-image alignright size-large\"><a href=\"https:\/\/robodk.com\/blog\/wp-content\/uploads\/2015\/11\/simulation-e1453802282591.png\"><img decoding=\"async\" src=\"https:\/\/robodk.com\/blog\/wp-content\/uploads\/2015\/11\/simulation-e1453802282591-300x177.png\" alt=\"robot simulation\" title=\"RoboDK simulation\"\/><\/a><\/figure>\n\n\n\n<p>Because of the complexity of using an industrial robot, robot integrators and most manufacturers try to limit themselves to a single robot brand. Unfortunately, industrial robot manufacturers don\u2019t offer completely equivalent product ranges, and their offers evolve constantly. St\u00e4ubli, for example, is one of the few manufacturers that offer robots suitable for humid environments, while FANUC is the only one to offer a medium-payload collaborative robot. Furthermore, a number of businesses work with calls for tenders. As a result, sometimes manufacturers end up with robots of different brands.<\/p>\n\n\n\n<p>The reason why robot-programming languages evolve slowly is probably due to the fact that industrial robots are extremely reliable and durable. Thus, robot manufacturers have to offer backward compatibility. Selling spare parts and additional options is probably as lucrative as selling new robots. For this reason, robot manufacturers probably won\u2019t change the fundamentals of their programming languages. For example, ABB is stuck with using quaternions on the user level to represent orientation, even though a quaternion is as intuitive as using binary code instead of ASCII. Rather than changing quaternions to Euler angles, like every other robot manufacturer, ABB simply added functions that convert from one orientation representation to the other. Most robot programming languages probably looked great a decade or two ago, but nowadays, engineers are used to modern programming languages like Java, C#, and Python.<\/p>\n\n\n\n<p>FANUC, one of the leading four robot manufacturers, provides not one but two different programming languages: Teach Pendant (or TP) and KAREL. TP programs are binary files that can be edited through the robot\u2019s teach pendant buttons (or touch screen for newer robots). TP files can also be compiled\/decompiled from an LS file (human-readable ASCII file). TP programs offer a limited assembler-like functionality. Alternatively, with FANUC, you can program your own algorithms using a PC and KAREL (programming language based on Pascal), but KAREL does not allow you to do robot movements nor edit the program from the controller\u2019s teach pendant.<\/p>\n\n\n\n<p>You can purchase ROBOGUIDE off-line programming and simulation software to off-line program FANUC robots. However, if you don\u2019t have ROBOGUIDE\u2019s WinOLPC, you won\u2019t be able to use LS programs unless you also have the option \u201cASCII Upload\u201d in your FANUC robot controller, a paid software upgrade required for each robot. You also need ROBOGUIDE to edit and create KAREL programs.<\/p>\n\n\n\n<p>Motoman robots are programmed using the INFORM programming language (JBI files). INFORM looks similar to FANUC\u2019s TP. The program variables are registers shared among all programs. However, Motoman also offers MotoCom for all their robots: a well-documented library that allows you to program the robot using C++, C# or Visual Basic (on Windows).<\/p>\n\n\n\n<p>Programming of ABB robots is simpler, and based on the RAPID programming language, which is somewhat similar to Visual Basic. Furthermore, ABB provides RobotStudio, offering on-line programming and an excellent RAPID program editor for free, as well as an easy file transfer through a network connection between a PC and the robot. Optionally, you can purchase the 3D simulator and off-line programming tools.<\/p>\n\n\n\n<p>KUKA robots require SRC programs written in the KRL programming language, usually edited using the free OrangeEdit editor unless you have the KUKA simulator Sim Pro. It is interesting to note that Kuka\u2019s KRC4 controller is a Windows based computer and the teach pendant is a remote desktop of that computer. It is unpractical to modify programs from the teach pendant as the touch screen feels slow. One notable exception, however, is KUKA\u2019s collaborative robot, LBR iiwa, which uses KUKA\u2019s Sunrise controller and is programmed in Java.<\/p>\n\n\n\n<p>We\u2019ll stop here, because there are dozens of other robot manufacturers from all over the world. Some brands do not have offline programming software, such as Universal Robots: the user must program UR robots through the robot\u2019s touch pendant interface (which is highly intuitive, but also very limited) or using an ASCII editor and their UR Script language (based on Python). Other robot manufacturers focus their efforts on having plugins for CAD software, like Mitsubishi who offers MelfaWorks for SolidWorks.<\/p>\n\n\n\n<p>The fact that nobody has taken a step towards unifying the way robots are programmed is very disappointing. G-code was introduced in the 50s, shortly after Numerical Control, and most CNC controllers currently use it. No such common programming language exists for industrial robots.<\/p>\n\n\n\n<p>Several companies offer powerful robot off-line programming (OLP) tools that support multiple robot brands, and each software tool has its advantages and disadvantages. However, most of these tools are also relatively expensive. There are also free tools like Gazebo (generally used with ROS), but they require expert programming skills and are targeted to robotics in general, making them less practical for simulation and off-line programming of industrial robots.<\/p>\n\n\n\n<p>This is why we created RoboDK: an affordable simulator for industrial robots that provides an intuitive way to program industrial robots. The simulator supports a wide variety of applications, such as pick and place, painting or robot milling. Optimization tools are provided to automatically convert CAM programs to robot programs. RoboDK is a spin-off from the CoRo laboratory, one of the largest robotics labs in Canada, where it was tested on all major industrial robot brands.<\/p>\n\n\n\n<p>RoboDK\u2019s library has more than 300 robots from 30 different robot manufacturers and we look forward to continue adding support for new robot brands. Any robot manufacturer is welcome to include their robots in RoboDK\u2019s library, providing an open interface to be able to do off-line programming and online programming as well. Off-line programming is achieved by defining the robot\u2019s brand post processor. The online programming is achieved by developing a robot driver that works as a bridge between the simulator and the robot. Then, it is possible to easily run robot programs step by step, retrieve the robot position or move to a specific position with a robot. This video shows an example of online programming with an UR10:<\/p>\n\n\n<p><iframe loading=\"lazy\" title=\"UR10 online programming step by step - RoboDK\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/pCD--kokh4s?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n\n\n\n<p>What makes RoboDK unique is that you can program any robot using Python and the <a href=\"https:\/\/robodk.com\/offline-programming\" target=\"_blank\" rel=\"noreferrer noopener\">RoboDK API<\/a>. Python offers an immense library of tools for programming (for example, to convert SVG images to XY coordinates that can be followed by robots). You can then use object oriented programming with Python and RoboDK\u2019s API and have code snippets like this one:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><span style=\"font-family: consolas; font-size: x-small;\"># robot is an object<br># target is a pose (4x4 matrix), defining position and orientation of the TCP<br>robot.MoveJ(target*transl(0,0,-100))    # Move (joint) to the approach position<br>robot.MoveL(target)                     # Move (linear) to the target<br>CloseGripper()                          # Custom-defined action, such as grabbing a part<br>robot.MoveL(target*transl(0,0,-100))    # Move back to the approach position<\/span><\/pre>\n\n\n\n<p>There is no doubt that one day, a robot programmer will have the choice to program any robot brand using a universal programming language such as Python. Robot programmers as well as companies prefer this option as they do not depend on brand-specific tools. Kudos to\u00a0<a href=\"https:\/\/mecademic.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Mecademic<\/a>, another spin-off of CoRo, who offers the first industrial robot arm that can be controlled with any modern programming language, but this robot too requires the use of a few proprietary commands.<\/p>\n\n\n\n<figure class=\"wp-block-image alignleft size-large\"><img decoding=\"async\" src=\"https:\/\/robodk.com\/blog\/wp-content\/uploads\/2015\/11\/workspace-300x249.jpg\" alt=\"Robot Workspace for multiple robots\"\/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>RoboDK has been downloaded more than 30,000 times since we launched it in January 2015. RoboDK has also attracted universities as a tool for learning industrial robotics (you can display DH frames, for example) as well as new robot manufacturers all over the world. We also welcome integrators to develop their technology using RoboDK\u2019s API. The advantage is that they can develop their technology with one robot brand and deploy it with any other robot brand.<\/p>\n\n\n\n<p>RoboDK can be tried for free and will remain free for educational purposes. We also believe that RoboDK is the most affordable off-line robot programming solution currently available.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you drive a car, it makes little difference what brand it is: all cars are driven the same way. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"open","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-15","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Off-line Programming - RoboDK blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/robodk.com\/blog\/off-line-programming\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Off-line Programming - RoboDK blog\" \/>\n<meta property=\"og:description\" content=\"If you drive a car, it makes little difference what brand it is: all cars are driven the same way. [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/robodk.com\/blog\/off-line-programming\/\" \/>\n<meta property=\"og:site_name\" content=\"RoboDK blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/robodkinc\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-18T17:40:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/robodk.com\/blog\/wp-content\/uploads\/2015\/11\/simulation-e1453802282591-300x177.png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@robodkinc\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/robodk.com\/blog\/off-line-programming\/\",\"url\":\"https:\/\/robodk.com\/blog\/off-line-programming\/\",\"name\":\"Off-line Programming - RoboDK blog\",\"isPartOf\":{\"@id\":\"https:\/\/robodk.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/robodk.com\/blog\/off-line-programming\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/robodk.com\/blog\/off-line-programming\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/robodk.com\/blog\/wp-content\/uploads\/2015\/11\/simulation-e1453802282591-300x177.png\",\"datePublished\":\"2015-11-29T17:54:20+00:00\",\"dateModified\":\"2024-11-18T17:40:33+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/robodk.com\/blog\/off-line-programming\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/robodk.com\/blog\/off-line-programming\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/robodk.com\/blog\/off-line-programming\/#primaryimage\",\"url\":\"https:\/\/robodk.com\/blog\/wp-content\/uploads\/2015\/11\/simulation-e1453802282591.png\",\"contentUrl\":\"https:\/\/robodk.com\/blog\/wp-content\/uploads\/2015\/11\/simulation-e1453802282591.png\",\"width\":1440,\"height\":850,\"caption\":\"robot simulation\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/robodk.com\/blog\/off-line-programming\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/robodk.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Off-line Programming\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/robodk.com\/blog\/#website\",\"url\":\"https:\/\/robodk.com\/blog\/\",\"name\":\"RoboDK blog\",\"description\":\"News about RoboDK, Industrial Robots, Simulation and Robot Programming\",\"publisher\":{\"@id\":\"https:\/\/robodk.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/robodk.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/robodk.com\/blog\/#organization\",\"name\":\"RoboDK\",\"url\":\"https:\/\/robodk.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/robodk.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/mlhiwltxy5pk.i.optimole.com\/w:1920\/h:613\/q:mauto\/f:best\/https:\/\/robodk.com\/blog\/wp-content\/uploads\/2017\/12\/RoboDK-PNG.png\",\"contentUrl\":\"https:\/\/mlhiwltxy5pk.i.optimole.com\/w:1920\/h:613\/q:mauto\/f:best\/https:\/\/robodk.com\/blog\/wp-content\/uploads\/2017\/12\/RoboDK-PNG.png\",\"width\":2128,\"height\":680,\"caption\":\"RoboDK\"},\"image\":{\"@id\":\"https:\/\/robodk.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/robodkinc\",\"https:\/\/x.com\/robodkinc\",\"https:\/\/www.instagram.com\/robodk\/\",\"https:\/\/www.linkedin.com\/company\/robodk\",\"https:\/\/www.youtube.com\/c\/RoboDK3D\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Off-line Programming - RoboDK blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/robodk.com\/blog\/off-line-programming\/","og_locale":"en_US","og_type":"article","og_title":"Off-line Programming - RoboDK blog","og_description":"If you drive a car, it makes little difference what brand it is: all cars are driven the same way. [&hellip;]","og_url":"https:\/\/robodk.com\/blog\/off-line-programming\/","og_site_name":"RoboDK blog","article_publisher":"https:\/\/www.facebook.com\/robodkinc","article_modified_time":"2024-11-18T17:40:33+00:00","og_image":[{"url":"https:\/\/robodk.com\/blog\/wp-content\/uploads\/2015\/11\/simulation-e1453802282591-300x177.png","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_site":"@robodkinc","twitter_misc":{"Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/robodk.com\/blog\/off-line-programming\/","url":"https:\/\/robodk.com\/blog\/off-line-programming\/","name":"Off-line Programming - RoboDK blog","isPartOf":{"@id":"https:\/\/robodk.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/robodk.com\/blog\/off-line-programming\/#primaryimage"},"image":{"@id":"https:\/\/robodk.com\/blog\/off-line-programming\/#primaryimage"},"thumbnailUrl":"https:\/\/robodk.com\/blog\/wp-content\/uploads\/2015\/11\/simulation-e1453802282591-300x177.png","datePublished":"2015-11-29T17:54:20+00:00","dateModified":"2024-11-18T17:40:33+00:00","breadcrumb":{"@id":"https:\/\/robodk.com\/blog\/off-line-programming\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/robodk.com\/blog\/off-line-programming\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/robodk.com\/blog\/off-line-programming\/#primaryimage","url":"https:\/\/robodk.com\/blog\/wp-content\/uploads\/2015\/11\/simulation-e1453802282591.png","contentUrl":"https:\/\/robodk.com\/blog\/wp-content\/uploads\/2015\/11\/simulation-e1453802282591.png","width":1440,"height":850,"caption":"robot simulation"},{"@type":"BreadcrumbList","@id":"https:\/\/robodk.com\/blog\/off-line-programming\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/robodk.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Off-line Programming"}]},{"@type":"WebSite","@id":"https:\/\/robodk.com\/blog\/#website","url":"https:\/\/robodk.com\/blog\/","name":"RoboDK blog","description":"News about RoboDK, Industrial Robots, Simulation and Robot Programming","publisher":{"@id":"https:\/\/robodk.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/robodk.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/robodk.com\/blog\/#organization","name":"RoboDK","url":"https:\/\/robodk.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/robodk.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/mlhiwltxy5pk.i.optimole.com\/w:1920\/h:613\/q:mauto\/f:best\/https:\/\/robodk.com\/blog\/wp-content\/uploads\/2017\/12\/RoboDK-PNG.png","contentUrl":"https:\/\/mlhiwltxy5pk.i.optimole.com\/w:1920\/h:613\/q:mauto\/f:best\/https:\/\/robodk.com\/blog\/wp-content\/uploads\/2017\/12\/RoboDK-PNG.png","width":2128,"height":680,"caption":"RoboDK"},"image":{"@id":"https:\/\/robodk.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/robodkinc","https:\/\/x.com\/robodkinc","https:\/\/www.instagram.com\/robodk\/","https:\/\/www.linkedin.com\/company\/robodk","https:\/\/www.youtube.com\/c\/RoboDK3D"]}]}},"_links":{"self":[{"href":"https:\/\/robodk.com\/blog\/wp-json\/wp\/v2\/pages\/15","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/robodk.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/robodk.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/robodk.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/robodk.com\/blog\/wp-json\/wp\/v2\/comments?post=15"}],"version-history":[{"count":21,"href":"https:\/\/robodk.com\/blog\/wp-json\/wp\/v2\/pages\/15\/revisions"}],"predecessor-version":[{"id":8069,"href":"https:\/\/robodk.com\/blog\/wp-json\/wp\/v2\/pages\/15\/revisions\/8069"}],"wp:attachment":[{"href":"https:\/\/robodk.com\/blog\/wp-json\/wp\/v2\/media?parent=15"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}