.. Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information#
   regarding copyright ownership.  The ASF licenses this file
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at
   http://www.apache.org/licenses/LICENSE-2.0
   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.


.. This file contain Variables shared across .rst files in this project

.. _CloudStack Installation Guide: http://docs.cloudstack.apache.org/projects/cloudstack-installation
.. _CloudStack Administrator's Guide: http://docs.cloudstack.apache.org/projects/cloudstack-administration
.. _CloudStack Apidocs: http://cloudstack.apache.org/docs/api/

.. Latest version systemvm template URL
.. |sysvm64-url-xen|    replace:: http://download.cloudstack.org/systemvm/4.11/systemvmtemplate-4.11.1-xen.vhd.bz2
.. |sysvm64-url-kvm|    replace:: http://download.cloudstack.org/systemvm/4.11/systemvmtemplate-4.11.1-kvm.qcow2.bz2
.. |sysvm64-url-vmware| replace:: http://download.cloudstack.org/systemvm/4.11/systemvmtemplate-4.11.1-vmware.ova
.. |sysvm64-url-hyperv| replace:: http://download.cloudstack.org/systemvm/4.11/systemvmtemplate-4.11.1-hyperv.vhd.zip
.. |sysvm64-url-ovm|    replace:: http://download.cloudstack.org/systemvm/4.11/systemvmtemplate-4.11.1-ovm.raw.bz2

.. Version specific: 4.5 systemvm template URL
.. |acs45-sysvm64-url-xen|    replace:: http://cloudstack.apt-get.eu/systemvm/4.5/systemvm64template-4.5-xen.vhd.bz2
.. |acs45-sysvm64-url-kvm|    replace:: http://cloudstack.apt-get.eu/systemvm/4.5/systemvm64template-4.5-kvm.qcow2.bz2
.. |acs45-sysvm64-url-vmware| replace:: http://cloudstack.apt-get.eu/systemvm/4.5/systemvm64template-4.5-vmware.ova
.. |acs45-sysvm64-url-hyperv| replace:: http://cloudstack.apt-get.eu/systemvm/4.5/systemvm64template-4.5-hyperv.vhd.zip
