{"id":771,"date":"2019-02-22T14:38:11","date_gmt":"2019-02-22T11:38:11","guid":{"rendered":"https:\/\/artem.services\/?p=758"},"modified":"2019-02-22T18:06:44","modified_gmt":"2019-02-22T15:06:44","slug":"virsh-macos-mojave-2","status":"publish","type":"post","link":"https:\/\/artem.services\/?p=771&lang=en","title":{"rendered":"Virsh &#8212; MacOS Mojave"},"content":{"rendered":"<h4>1. Preparation<\/h4>\n<p><span class=\"tlid-translation translation\"><span class=\"\" title=\"\">Install the necessary packages:<\/span><\/span><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\napt install iptables-persistent apparmor-utils ovmf\r\n<\/pre>\n<p><span class=\"tlid-translation translation\"><span class=\"\" title=\"\">Open the <strong>QEMU<\/strong> configuration file:<\/span><\/span><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nvim \/etc\/libvirt\/qemu.conf\r\n<\/pre>\n<p><span class=\"tlid-translation translation\"><span class=\"\" title=\"\">And add\/edit the following line:<\/span><\/span><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nsecurity_driver = &quot;apparmor&quot;\r\n<\/pre>\n<p><span class=\"tlid-translation translation\"><span class=\"\" title=\"\">Restart <strong>libvirt<\/strong> service<\/span><\/span><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nsystemctl restart libvirt-bin\r\nsystemctl restart libvirtd\r\n<\/pre>\n<p><!--more--><\/p>\n<p><span class=\"tlid-translation translation\"><span class=\"\" title=\"\">Next you need to create an <strong>XML<\/strong> file with the description of our virtual machine.<\/span><\/span><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nvim macos-mojave.xml\r\n<\/pre>\n<p><span class=\"tlid-translation translation\"><span class=\"\" title=\"\">With the following content:<\/span><\/span><\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;domain type='kvm' xmlns:qemu='http:\/\/libvirt.org\/schemas\/domain\/qemu\/1.0'&gt;\r\n  &lt;name&gt;macos-mojave&lt;\/name&gt;\r\n  &lt;uuid&gt;2aca0dd6-cec9-4717-9ab2-0b7b13d111c3&lt;\/uuid&gt;\r\n  &lt;title&gt;MacOS-Mojave&lt;\/title&gt;\r\n  &lt;memory unit='KiB'&gt;8192000&lt;\/memory&gt;\r\n  &lt;currentMemory unit='KiB'&gt;8192000&lt;\/currentMemory&gt;\r\n  &lt;vcpu placement='static'&gt;4&lt;\/vcpu&gt;\r\n  &lt;os&gt;\r\n    &lt;type arch='x86_64' machine='pc-q35-2.11'&gt;hvm&lt;\/type&gt;\r\n    &lt;loader readonly='yes' type='pflash'&gt;\/var\/lib\/kvm\/vm_images\/macos-mojave\/OVMF_CODE.fd&lt;\/loader&gt;\r\n    &lt;nvram&gt;\/var\/lib\/kvm\/vm_images\/macos-mojave\/OVMF_VARS-1024x768.fd&lt;\/nvram&gt;\r\n  &lt;\/os&gt;\r\n  &lt;features&gt;\r\n    &lt;acpi\/&gt;\r\n    &lt;kvm&gt;\r\n      &lt;hidden state='on'\/&gt;\r\n    &lt;\/kvm&gt;\r\n  &lt;\/features&gt;\r\n  &lt;clock offset='utc'\/&gt;\r\n  &lt;on_poweroff&gt;destroy&lt;\/on_poweroff&gt;\r\n  &lt;on_reboot&gt;restart&lt;\/on_reboot&gt;\r\n  &lt;on_crash&gt;restart&lt;\/on_crash&gt;\r\n  &lt;devices&gt;\r\n    &lt;emulator&gt;\/usr\/bin\/qemu-system-x86_64&lt;\/emulator&gt;\r\n    &lt;disk type='file' device='disk'&gt;\r\n      &lt;driver name='qemu' type='qcow2' cache='writeback'\/&gt;\r\n      &lt;source file='\/var\/lib\/kvm\/vm_images\/macos-mojave\/mac_hdd.img'\/&gt;\r\n      &lt;target dev='sda' bus='sata'\/&gt;\r\n      &lt;boot order='1'\/&gt;\r\n      \r\n\r\n&lt;address type='drive' controller='0' bus='0' target='0' unit='0'\/&gt;\r\n    &lt;\/disk&gt;\r\n    &lt;controller type='sata' index='0'&gt;\r\n      \r\n\r\n&lt;address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'\/&gt;\r\n    &lt;\/controller&gt;\r\n    &lt;controller type='pci' index='0' model='pcie-root'\/&gt;\r\n    &lt;controller type='pci' index='1' model='dmi-to-pci-bridge'&gt;\r\n      &lt;model name='i82801b11-bridge'\/&gt;\r\n      \r\n\r\n&lt;address type='pci' domain='0x0000' bus='0x00' slot='0x1e' function='0x0'\/&gt;\r\n    &lt;\/controller&gt;\r\n    &lt;controller type='pci' index='2' model='pci-bridge'&gt;\r\n      &lt;model name='pci-bridge'\/&gt;\r\n      &lt;target chassisNr='2'\/&gt;\r\n      \r\n\r\n&lt;address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'\/&gt;\r\n    &lt;\/controller&gt;\r\n    &lt;controller type='usb' index='0' model='ich9-ehci1'&gt;\r\n      \r\n\r\n&lt;address type='pci' domain='0x0000' bus='0x00' slot='0x1d' function='0x7'\/&gt;\r\n    &lt;\/controller&gt;\r\n    &lt;controller type='usb' index='0' model='ich9-uhci1'&gt;\r\n      &lt;master startport='0'\/&gt;\r\n      \r\n\r\n&lt;address type='pci' domain='0x0000' bus='0x00' slot='0x1d' function='0x0' multifunction='on'\/&gt;\r\n    &lt;\/controller&gt;\r\n    &lt;controller type='usb' index='0' model='ich9-uhci2'&gt;\r\n      &lt;master startport='2'\/&gt;\r\n      \r\n\r\n&lt;address type='pci' domain='0x0000' bus='0x00' slot='0x1d' function='0x1'\/&gt;\r\n    &lt;\/controller&gt;\r\n    &lt;controller type='usb' index='0' model='ich9-uhci3'&gt;\r\n      &lt;master startport='4'\/&gt;\r\n      \r\n\r\n&lt;address type='pci' domain='0x0000' bus='0x00' slot='0x1d' function='0x2'\/&gt;\r\n    &lt;\/controller&gt;\r\n    &lt;interface type='bridge'&gt;\r\n      &lt;mac address='52:54:00:AB:DF:0A'\/&gt;\r\n      &lt;source bridge='virbr0'\/&gt;\r\n      &lt;target dev='tap1'\/&gt;\r\n      &lt;model type='e1000-82545em'\/&gt;\r\n      \r\n\r\n&lt;address type='pci' domain='0x0000' bus='0x02' slot='0x02' function='0x0'\/&gt;\r\n    &lt;\/interface&gt;\r\n    &lt;input type='keyboard' bus='usb'&gt;\r\n      \r\n\r\n&lt;address type='usb' bus='0' port='2'\/&gt;\r\n    &lt;\/input&gt;\r\n    &lt;input type='mouse' bus='ps2'\/&gt;\r\n    &lt;input type='tablet' bus='usb'&gt;\r\n      \r\n\r\n&lt;address type='usb' bus='0' port='3'\/&gt;\r\n    &lt;\/input&gt;\r\n    &lt;input type='keyboard' bus='ps2'\/&gt;\r\n    &lt;graphics type='vnc' port='5901' autoport='no' listen='0.0.0.0' keymap='en-us'&gt;\r\n      &lt;listen type='address' address='0.0.0.0'\/&gt;\r\n    &lt;\/graphics&gt;\r\n    &lt;sound model='ich9'&gt;\r\n      \r\n\r\n&lt;address type='pci' domain='0x0000' bus='0x02' slot='0x01' function='0x0'\/&gt;\r\n    &lt;\/sound&gt;\r\n    &lt;video&gt;\r\n      &lt;model type='vga'\/&gt;\r\n    &lt;\/video&gt;\r\n    &lt;redirdev bus='usb' type='spicevmc'&gt;\r\n      \r\n\r\n&lt;address type='usb' bus='0' port='5'\/&gt;\r\n    &lt;\/redirdev&gt;\r\n    &lt;hub type='usb'&gt;\r\n      \r\n\r\n&lt;address type='usb' bus='0' port='1'\/&gt;\r\n    &lt;\/hub&gt;\r\n    &lt;memballoon model='none'\/&gt;\r\n  &lt;\/devices&gt;\r\n  &lt;qemu:commandline&gt;\r\n    &lt;qemu:arg value='-device'\/&gt;\r\n    &lt;qemu:arg value='isa-applesmc,osk=ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc'\/&gt;\r\n    &lt;qemu:arg value='-smbios'\/&gt;\r\n    &lt;qemu:arg value='type=2'\/&gt;\r\n    &lt;qemu:arg value='-cpu'\/&gt;\r\n    &lt;qemu:arg value='Penryn,kvm=on,vendor=GenuineIntel,+invtsc,vmware-cpuid-freq=on,+pcid,+ssse3,+sse4.2,+popcnt,+avx,+aes,+xsave,+xsaveopt,check'\/&gt;\r\n  &lt;\/qemu:commandline&gt;\r\n&lt;\/domain&gt;\r\n<\/pre>\n<p><span class=\"tlid-translation translation\"><span class=\"\" title=\"\">We described a virtual machine named &quot;<strong>macos-mojave<\/strong>&quot;, which has<strong> 4 cores<\/strong> and <strong>8 GB RAM<\/strong>, a network card in <strong>NAT<\/strong> mode (<strong>tap1<\/strong> interface), as well as <strong>VNC<\/strong> access on port <strong>5901<\/strong>.<\/span><\/span><\/p>\n<blockquote><p><span class=\"tlid-translation translation\"><span class=\"\" title=\"\">Check the paths to the storage of the disk image and <strong>OVMF<\/strong> files.<\/span><\/span><\/p><\/blockquote>\n<p><span class=\"tlid-translation translation\"><span title=\"\"><strong>MAC<\/strong> address and <strong>UUID<\/strong> must be unique.<\/span><\/span><\/p>\n<p><span class=\"\" title=\"\"><strong>UUID<\/strong> generation:<\/span><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nuuidgen\r\n<\/pre>\n<p><span class=\"tlid-translation translation\"><span class=\"\" title=\"\"><strong>MAC<\/strong> address generation:<\/span><\/span><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nprintf '52:54:00:AB:%02X:%02X\\n' $((RANDOM%256)) $((RANDOM%256))\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h4>2. Virsh<\/h4>\n<p><span class=\"tlid-translation translation\"><span class=\"\" title=\"\">Connect to <strong>libvirtd<\/strong>:<\/span><\/span><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nvirsh --connect qemu:\/\/\/system\r\n<\/pre>\n<p><span class=\"tlid-translation translation\"><span class=\"\" title=\"\">We check our <strong>XML<\/strong> file for validity:<\/span><\/span><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nvirt-xml-validate macos-mojave.xml\r\n<\/pre>\n<p><span class=\"tlid-translation translation\"><span class=\"\" title=\"\">Create a virtual machine based on the <strong>XML<\/strong> file:<\/span><\/span><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nvirsh define macos-mojave.xml\r\n<\/pre>\n<p><span class=\"tlid-translation translation\"><span class=\"\" title=\"\">We start the virtual machine:<\/span><\/span><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nvirsh start macos-mojave\r\n<\/pre>\n<p><span class=\"tlid-translation translation\"><span title=\"\">Add a virtual machine to autorun.<\/span><\/span><\/p>\n<p><span class=\"\" title=\"\">We look at the list of <strong>VM<\/strong><\/span><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nvirsh list --all\r\n<\/pre>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nroot@KVM:~# virsh list --all\r\n Id    Name                           State\r\n----------------------------------------------------\r\n -     macos-mojave                   shut off\r\n<\/pre>\n<p><span class=\"tlid-translation translation\"><span class=\"\" title=\"\">We look information on the macos virtual machine<\/span><\/span>:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nvirsh dominfo macos-mojave\r\n<\/pre>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nroot@KVM:~# virsh dominfo macos-mojave\r\nId:             -\r\nName:           macos-mojave\r\nUUID:           2aca0dd6-cec9-4717-9ab2-0b7b13d111c3\r\nOS Type:        hvm\r\nState:          shut off\r\nCPU(s):         4\r\nMax memory:     8192000 KiB\r\nUsed memory:    8192000 KiB\r\nPersistent:     yes\r\nAutostart:      disable\r\nManaged save:   no\r\nSecurity model: none\r\nSecurity DOI:   0\r\n<\/pre>\n<p><span class=\"tlid-translation translation\"><span title=\"\">We are interested in the line: &quot;<strong>Autostart: disable<\/strong>&quot;<\/span><\/span><\/p>\n<p><span class=\"\" title=\"\">Add to autostart:<\/span><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nvirsh autostart macos-mojave\r\n<\/pre>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nroot@KVM:~# virsh autostart macos-mojave\r\nDomain macos-mojave marked as autostarted\r\n<\/pre>\n<p><span class=\"tlid-translation translation\"><span class=\"\" title=\"\">Check again:<\/span><\/span><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nroot@KVM:~# virsh dominfo macos-mojave\r\nId:             -\r\nName:           macos-mojave\r\nUUID:           2aca0dd6-cec9-4717-9ab2-0b7b13d111c3\r\nOS Type:        hvm\r\nState:          shut off\r\nCPU(s):         4\r\nMax memory:     8192000 KiB\r\nUsed memory:    8192000 KiB\r\nPersistent:     yes\r\nAutostart:      enable\r\nManaged save:   no\r\nSecurity model: none\r\nSecurity DOI:   0\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h4>3. IPTables<\/h4>\n<div class=\"text-wrap tlid-copy-target\">\n<div class=\"result-shield-container tlid-copy-target\"><span class=\"tlid-translation translation\"><span class=\"\" title=\"\">When <strong>Virsh<\/strong> starts, it wipes its <strong>IPTables<\/strong> rules.<\/span> <span class=\"\" title=\"\">In order to avoid this, for the beginning you need to save the necessary rules.<\/span><br \/>\n<span class=\"\" title=\"\">The current rules can be viewed with the command:<\/span><\/span><\/div>\n<\/div>\n<div class=\"tlid-result-transliteration-container result-transliteration-container transliteration-container\">\n<div class=\"tlid-transliteration-content transliteration-content full\"><\/div>\n<\/div>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\niptables -S\r\n<\/pre>\n<p><span class=\"tlid-translation translation\"><span class=\"\" title=\"\">An example <strong>IPTables<\/strong> initial configuration script:<\/span><\/span><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n#!\/bin\/bash\r\n \r\niptables -F\r\niptables -X\r\n \r\niptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT\r\niptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP\r\niptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP\r\niptables -A INPUT -m state --state INVALID -j DROP\r\niptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP\r\niptables -A INPUT -i lo -j ACCEPT\r\n \r\n########################## ALLOWED PORTS ###########################\r\n\r\niptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT\r\niptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT\r\niptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT\r\n\r\n#################### FOR SSH CONNECTIONS TO VM's ###################\r\n\r\niptables -A INPUT -p tcp -m tcp --dport 2222 -j ACCEPT\r\n \r\n####################### ALLOWED IP ADDRESSES #######################\r\n\r\n# FOR VNC ACCESS WITHOUT PASSWORD\r\niptables -A INPUT -s 1.1.1.1 -j ACCEPT\r\niptables -A INPUT -s 2.2.2.2 -j ACCEPT\r\n\r\n######################## FOR NAT FROM VM's #########################\r\n\r\niptables -A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT\r\niptables -A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT\r\niptables -A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT\r\niptables -A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT\r\n\r\n################### FOR FORWARDING PORTS TO VM's ###################\r\n\r\niptables -t nat -A PREROUTING -p tcp -d MY_EXTERNAL_IP --dport 2222 -j DNAT --to-destination 192.168.122.100:22\r\n\r\niptables -A FORWARD -i eno1 -d 192.168.122.100 -p tcp --dport 22 -j ACCEPT\r\n\r\n######################## FOR NAT FROM VM's #########################\r\n\r\niptables -A FORWARD -d 192.168.122.0\/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT\r\niptables -A FORWARD -s 192.168.122.0\/24 -i virbr0 -j ACCEPT\r\niptables -A FORWARD -i virbr0 -o virbr0 -j ACCEPT\r\niptables -A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable\r\niptables -A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable\r\n\r\niptables -A OUTPUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT\r\n\r\niptables -P OUTPUT ACCEPT\r\niptables -P INPUT DROP\r\niptables -P FORWARD ACCEPT\r\n\r\n<\/pre>\n<p><span class=\"tlid-translation translation\"><span title=\"\">Do not forget to substitute your external <strong>IP<\/strong> address, and replace the external interface &quot;<strong>eno1<\/strong>&quot; with your own.<\/span><\/span><\/p>\n<p><span class=\"\" title=\"\">The script allows access to the ports: <strong>22<\/strong>, <strong>80<\/strong> and <strong>443<\/strong>. As well as full access to the <strong>IP<\/strong> addresses &quot;<strong>1.1.1.1<\/strong>&quot; and &quot;<strong>2.2.2.2<\/strong>&quot;, it also forwards the port &quot;<strong>2222<\/strong>&quot; from the host to the port &quot;<strong>22<\/strong>&quot; of the virtual machine (<strong>IP<\/strong> address<\/span> <span class=\"\" title=\"\">virtual machine &#8212; <strong>192.168.122.100<\/strong>)<\/span><\/p>\n<p><span class=\"\" title=\"\">Save the rules:<\/span><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\niptables-save &gt; \/etc\/iptables\/rules.v4\r\n<\/pre>\n<p><span class=\"tlid-translation translation\"><span class=\"\" title=\"\">If this folder does not exist, you need to create it:<\/span><\/span><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nmkdir \/etc\/libvirt\/hooks\r\n<\/pre>\n<p><span class=\"tlid-translation translation\"><span class=\"\" title=\"\">Create a script:<\/span><\/span><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nvim \/etc\/libvirt\/hooks\/network\r\n<\/pre>\n<p><span class=\"tlid-translation translation\"><span class=\"\" title=\"\">With the following content:<\/span><\/span><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\n#!\/bin\/bash\r\n\r\n# Libvirt hook, see: https:\/\/www.libvirt.org\/hooks.html\r\n# for iptables reloading after host booted\r\n\r\nif [ &quot;$2&quot; = &quot;started&quot; ]; then\r\n\r\n\/bin\/systemctl restart netfilter-persistent\r\n\r\nfi;\r\n\r\nexit 0;\r\n<\/pre>\n<p><span class=\"tlid-translation translation\"><span class=\"\" title=\"\">Add the execute bit:<\/span><\/span><\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nchmod +x \/etc\/libvirt\/hooks\/network\r\n<\/pre>\n<p><span class=\"tlid-translation translation\"><span class=\"\" title=\"\">Now, after starting Virsh, IPTables will be restarted, thereby resetting the rules to the saved ones.<\/span><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>1. Preparation Install the necessary packages: Open the QEMU configuration file: And add\/edit the following line: Restart libvirt service<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[535],"tags":[525,527,529,381,533],"_links":{"self":[{"href":"https:\/\/artem.services\/index.php?rest_route=\/wp\/v2\/posts\/771"}],"collection":[{"href":"https:\/\/artem.services\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/artem.services\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/artem.services\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/artem.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=771"}],"version-history":[{"count":5,"href":"https:\/\/artem.services\/index.php?rest_route=\/wp\/v2\/posts\/771\/revisions"}],"predecessor-version":[{"id":777,"href":"https:\/\/artem.services\/index.php?rest_route=\/wp\/v2\/posts\/771\/revisions\/777"}],"wp:attachment":[{"href":"https:\/\/artem.services\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=771"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/artem.services\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=771"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/artem.services\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=771"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}