.. 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

.. _Documentation home: http://docs.cloudstack.apache.org
.. _Installation Guide: http://docs.cloudstack.apache.org/projects/cloudstack-installation
.. _Administration Guide: http://docs.cloudstack.apache.org/projects/cloudstack-administration
.. _Release Notes: http://docs.cloudstack.apache.org/projects/cloudstack-release-notes
.. _CloudStack Apidocs: http://cloudstack.apache.org/docs/api/


.. Latest version systemvm template URL
.. |sysvm64-url-xen|    replace:: http://cloudstack.apt-get.eu/systemvm/4.6/systemvm64template-4.6.0-xen.vhd.bz2
.. |sysvm64-url-kvm|    replace:: http://cloudstack.apt-get.eu/systemvm/4.6/systemvm64template-4.6.0-kvm.qcow2.bz2
.. |sysvm64-url-vmware| replace:: http://cloudstack.apt-get.eu/systemvm/4.6/systemvm64template-4.6.0-vmware.ova
.. |sysvm64-url-hyperv| replace:: http://cloudstack.apt-get.eu/systemvm/4.6/systemvm64template-4.6.0-hyperv.vhd.zip
.. |sysvm64-url-ovm|    replace:: http://cloudstack.apt-get.eu/systemvm/4.6/systemvm64template-4.6.0-ovm.raw.bz2
