PSARC/2013/350 OpenStack for Solaris (Umbrella) s11-update
authorDrew Fisher <drew.fisher@oracle.com>
Mon, 31 Mar 2014 16:44:02 -0700
branchs11-update
changeset 3028 5e73a3a3f66a
parent 3027 3bcf7d43558b
child 3033 c90fa3307f21
PSARC/2013/350 OpenStack for Solaris (Umbrella) PSARC/2014/007 OpenStack client API components for Grizzly PSARC/2014/048 OpenStack Keystone (OpenStack Identity Service) PSARC/2014/049 OpenStack Nova (OpenStack Compute Service) PSARC/2014/054 OpenStack Cinder (OpenStack Block Storage Service) PSARC/2014/055 OpenStack Glance (OpenStack Image Service) PSARC/2014/058 OpenStack Horizon (OpenStack Dashboard) PSARC/2014/059 OpenStack Neutron (OpenStack Networking Service) 17531161 greenlet doesn't build with gcc 4.7.X 18143276 greenlet can crash with register window corruption on MP SPARC 18290089 integrate cinderclient 18290097 integrate glanceclient 18290102 integrate keystoneclient 18290109 integrate neutronclient 18290113 integrate novaclient 18290119 integrate swiftclient 18290125 integrate quantumclient 18307582 Request to integrate Cinder into userland 18307595 Request to integrate Glance into userland 18307626 Request to integrate Horizon into userland 18307641 Request to integrate Keystone into userland 18307650 Request to integrate Neutron into userland 18307659 Request to integrate Nova into userland 18321909 a few Python packages deliver both po and mo files 18362900 Dnsmasq's SMF method_credential is missing a privilege 18363793 Dnsmasq should use SIOCSXARP ioctl
components/dnsmasq/files/dnsmasq.xml
components/dnsmasq/patches/01_use_siocsxarp.patch
components/openstack/cinder/Makefile
components/openstack/cinder/cinder.license
components/openstack/cinder/cinder.p5m
components/openstack/cinder/files/cinder-api
components/openstack/cinder/files/cinder-api.xml
components/openstack/cinder/files/cinder-backup
components/openstack/cinder/files/cinder-backup.xml
components/openstack/cinder/files/cinder-db.xml
components/openstack/cinder/files/cinder-scheduler
components/openstack/cinder/files/cinder-scheduler.xml
components/openstack/cinder/files/cinder-volume
components/openstack/cinder/files/cinder-volume-setup
components/openstack/cinder/files/cinder-volume.xml
components/openstack/cinder/files/cinder.auth_attr
components/openstack/cinder/files/cinder.conf
components/openstack/cinder/files/cinder.exec_attr
components/openstack/cinder/files/cinder.prof_attr
components/openstack/cinder/files/cinder.user_attr
components/openstack/cinder/files/solaris/zfs.py
components/openstack/cinder/patches/01-noamqplib.patch
components/openstack/cinder/patches/02-noparamiko.patch
components/openstack/cinder/patches/03-emc_smis_iscsi.patch
components/openstack/cinder/resolve.deps
components/openstack/common/Makefile
components/openstack/common/openstack.p5m
components/openstack/common/resolve.deps
components/openstack/glance/Makefile
components/openstack/glance/files/glance-api
components/openstack/glance/files/glance-api.conf
components/openstack/glance/files/glance-api.xml
components/openstack/glance/files/glance-db.xml
components/openstack/glance/files/glance-registry
components/openstack/glance/files/glance-registry.xml
components/openstack/glance/files/glance-scrubber
components/openstack/glance/files/glance-scrubber.conf
components/openstack/glance/files/glance-scrubber.xml
components/openstack/glance/files/glance.auth_attr
components/openstack/glance/files/glance.exec_attr
components/openstack/glance/files/glance.prof_attr
components/openstack/glance/glance.license
components/openstack/glance/glance.p5m
components/openstack/glance/patches/01-nopycrypto.patch
components/openstack/glance/patches/02-zfs-uar-formats.patch
components/openstack/glance/resolve.deps
components/openstack/horizon/Makefile
components/openstack/horizon/files/branding/css/solaris.css
components/openstack/horizon/files/branding/img/OpenStack_Dashboard_txt.png
components/openstack/horizon/files/branding/img/Openstack_banner.png
components/openstack/horizon/files/branding/img/OracleSolaris_Logo.png
components/openstack/horizon/files/branding/img/OracleSolaris_login_banner.png
components/openstack/horizon/files/branding/img/Oracle_Logo.png
components/openstack/horizon/files/branding/img/content_tab_bkgd_selected.png
components/openstack/horizon/files/branding/img/dots.png
components/openstack/horizon/files/branding/img/favicon-solaris.ico
components/openstack/horizon/files/branding/img/header_shadow.png
components/openstack/horizon/files/branding/img/tab_bkgd_deselected.png
components/openstack/horizon/files/branding/img/tab_bkgd_selected.png
components/openstack/horizon/files/branding/theme/_stylesheets.html
components/openstack/horizon/files/local_settings.py
components/openstack/horizon/files/openstack-dashboard-http.conf
components/openstack/horizon/files/openstack-dashboard-tls.conf
components/openstack/horizon/horizon.license
components/openstack/horizon/horizon.p5m
components/openstack/horizon/patches/01-remove-nodejs.patch
components/openstack/horizon/patches/02-update-flavor-form-length.patch
components/openstack/horizon/patches/03-CVE-2013-6858.patch
components/openstack/horizon/resolve.deps
components/openstack/horizon/solaris.css.license
components/openstack/keystone/Makefile
components/openstack/keystone/files/keystone
components/openstack/keystone/files/keystone.auth_attr
components/openstack/keystone/files/keystone.conf
components/openstack/keystone/files/keystone.exec_attr
components/openstack/keystone/files/keystone.prof_attr
components/openstack/keystone/files/keystone.xml
components/openstack/keystone/keystone.license
components/openstack/keystone/keystone.p5m
components/openstack/keystone/patches/01-ec2_token-import-only.patch
components/openstack/keystone/patches/02-remove-nova-depend.patch
components/openstack/keystone/patches/03-CVE-2013-6391.patch
components/openstack/keystone/patches/04-CVE-2013-4477.patch
components/openstack/keystone/patches/05-CVE-2014-2237.patch
components/openstack/keystone/patches/06-sample-data-sh.patch
components/openstack/keystone/resolve.deps
components/openstack/neutron/Makefile
components/openstack/neutron/files/agent/evs_l3_agent.py
components/openstack/neutron/files/agent/linux/device.py
components/openstack/neutron/files/agent/solaris/__init__.py
components/openstack/neutron/files/agent/solaris/device.py
components/openstack/neutron/files/agent/solaris/dhcp.py
components/openstack/neutron/files/agent/solaris/interface.py
components/openstack/neutron/files/agent/solaris/ipfilters_manager.py
components/openstack/neutron/files/agent/solaris/net_lib.py
components/openstack/neutron/files/dhcp_agent.ini
components/openstack/neutron/files/evs/db/api.py
components/openstack/neutron/files/evs/db/l3nat.py
components/openstack/neutron/files/evs/db/quotas_db.py
components/openstack/neutron/files/evs/plugin.py
components/openstack/neutron/files/evs_plugin.ini
components/openstack/neutron/files/l3_agent.ini
components/openstack/neutron/files/neutron-dhcp-agent
components/openstack/neutron/files/neutron-dhcp-agent.xml
components/openstack/neutron/files/neutron-l3-agent
components/openstack/neutron/files/neutron-l3-agent.xml
components/openstack/neutron/files/neutron-server
components/openstack/neutron/files/neutron-server.xml
components/openstack/neutron/files/neutron.auth_attr
components/openstack/neutron/files/neutron.exec_attr
components/openstack/neutron/files/neutron.prof_attr
components/openstack/neutron/files/neutron.user_attr
components/openstack/neutron/files/quantum.conf
components/openstack/neutron/neutron.license
components/openstack/neutron/neutron.p5m
components/openstack/neutron/patches/01-neutron-no-pyudev.patch
components/openstack/neutron/patches/02-dhcp-agent-add-solaris.patch
components/openstack/neutron/patches/03-l3-agent-add-solaris.patch
components/openstack/neutron/patches/04-CVE-2013-6419.patch
components/openstack/neutron/resolve.deps
components/openstack/nova/Makefile
components/openstack/nova/files/nova-api
components/openstack/nova/files/nova-api-ec2.xml
components/openstack/nova/files/nova-api-metadata.xml
components/openstack/nova/files/nova-api-osapi-compute.xml
components/openstack/nova/files/nova-cert
components/openstack/nova/files/nova-cert.xml
components/openstack/nova/files/nova-compute
components/openstack/nova/files/nova-compute.xml
components/openstack/nova/files/nova-conductor
components/openstack/nova/files/nova-conductor.xml
components/openstack/nova/files/nova-consoleauth
components/openstack/nova/files/nova-consoleauth.xml
components/openstack/nova/files/nova-novncproxy
components/openstack/nova/files/nova-novncproxy.xml
components/openstack/nova/files/nova-objectstore
components/openstack/nova/files/nova-objectstore.xml
components/openstack/nova/files/nova-scheduler
components/openstack/nova/files/nova-scheduler.xml
components/openstack/nova/files/nova.auth_attr
components/openstack/nova/files/nova.conf
components/openstack/nova/files/nova.exec_attr
components/openstack/nova/files/nova.prof_attr
components/openstack/nova/files/nova.user_attr
components/openstack/nova/files/release
components/openstack/nova/files/solariszones/__init__.py
components/openstack/nova/files/solariszones/driver.py
components/openstack/nova/files/solariszones/sysconfig.py
components/openstack/nova/nova.license
components/openstack/nova/nova.p5m
components/openstack/nova/patches/01-Solaris-vm_mode.patch
components/openstack/nova/patches/02-noamqplib.patch
components/openstack/nova/patches/03-Solaris-flavors.patch
components/openstack/nova/patches/04-CVE-2013-4497.patch
components/openstack/nova/patches/05-CVE-2013-4463.patch
components/openstack/nova/patches/06-CVE-2013-6419.patch
components/openstack/nova/patches/07-CVE-2013-7048.patch
components/openstack/nova/patches/08-CVE-2013-7130.patch
components/openstack/nova/resolve.deps
components/python/cinderclient/Makefile
components/python/cinderclient/cinderclient-PYVER.p5m
components/python/cinderclient/cinderclient.license
components/python/cinderclient/resolve.deps
components/python/django/django-PYVER.p5m
components/python/formencode/formencode-PYVER.p5m
components/python/glanceclient/Makefile
components/python/glanceclient/glanceclient-PYVER.p5m
components/python/glanceclient/glanceclient.license
components/python/glanceclient/resolve.deps
components/python/greenlet/Makefile
components/python/greenlet/greenlet-PYVER.p5m
components/python/greenlet/patches/01-slp_switch-sparc-multi-thread.patch
components/python/greenlet/resolve.deps
components/python/keystoneclient/Makefile
components/python/keystoneclient/keystoneclient-PYVER.p5m
components/python/keystoneclient/keystoneclient.license
components/python/keystoneclient/resolve.deps
components/python/neutronclient/Makefile
components/python/neutronclient/neutronclient-PYVER.p5m
components/python/neutronclient/neutronclient.license
components/python/neutronclient/resolve.deps
components/python/novaclient/Makefile
components/python/novaclient/novaclient-PYVER.p5m
components/python/novaclient/novaclient.license
components/python/novaclient/resolve.deps
components/python/pycountry/pycountry-PYVER.p5m
components/python/quantumclient/Makefile
components/python/quantumclient/quantumclient-PYVER.p5m
components/python/quantumclient/quantumclient.license
components/python/quantumclient/resolve.deps
components/python/swiftclient/Makefile
components/python/swiftclient/resolve.deps
components/python/swiftclient/swiftclient-GENFRAG.p5m
components/python/swiftclient/swiftclient-PYVER.p5m
components/python/swiftclient/swiftclient.license
--- a/components/dnsmasq/files/dnsmasq.xml	Wed Mar 26 06:19:12 2014 -0700
+++ b/components/dnsmasq/files/dnsmasq.xml	Mon Mar 31 16:44:02 2014 -0700
@@ -68,7 +68,7 @@
                  timeout_seconds='60' >
       <method_context>
         <method_credential user='daemon' group='daemon'
-          privileges='basic,{net_privaddr}:53/udp,{net_privaddr}:53/tcp,{net_privaddr}:67/udp,{net_privaddr}:69/udp,{net_privaddr}:547/udp,net_icmpaccess' />
+          privileges='basic,{net_privaddr}:53/udp,{net_privaddr}:53/tcp,{net_privaddr}:67/udp,{net_privaddr}:69/udp,{net_privaddr}:547/udp,net_icmpaccess,sys_ip_config' />
       </method_context>
     </exec_method> 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/dnsmasq/patches/01_use_siocsxarp.patch	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,46 @@
+If there are multiple datalinks configured with IP addresses from the same
+subnet, then the datalink to which an on-link device's ARP entry will be
+associated depends on the order in which these datalinks were plumbed with
+IP addresses. In that, the datalink that was plumbed for IP last will have
+the ARP entry associated against it. To avoid, this we need to use
+SIOCSXARP ioctl to specify the exact datalink.
+
+This patch was developed in-house. Since it is Solaris-specific it is not
+suitable for upstream.
+
+--- dnsmasq-2.68/src/dhcp.c	2013-12-08 07:58:29.000000000 -0800
++++ ORIGINAL/src/dhcp.c	2014-03-07 10:14:16.639192664 -0800
[email protected]@ -418,17 +418,24 @@
+   else
+     {
+       /* unicast to unconfigured client. Inject mac address direct into ARP cache. 
+-	 Note that this only works for ethernet on solaris, because we use SIOCSARP
+-	 and not SIOCSXARP, which would be perfect, except that it returns ENXIO 
+-	 mysteriously. Bah. Fall back to broadcast for other net types. */
+-      struct arpreq req;
++	 Fall back to broadcast for other net types. */
++      struct xarpreq xreq;
++      int ifnamsz = strlen(ifr.ifr_name);
++
++      dest.sin_family = AF_INET;
+       dest.sin_addr = mess->yiaddr;
+       dest.sin_port = htons(daemon->dhcp_client_port);
+-      *((struct sockaddr_in *)&req.arp_pa) = dest;
+-      req.arp_ha.sa_family = AF_UNSPEC;
+-      memcpy(req.arp_ha.sa_data, mess->chaddr, mess->hlen);
+-      req.arp_flags = ATF_COM;
+-      ioctl(daemon->dhcpfd, SIOCSARP, &req);
++      *((struct sockaddr_in *)&xreq.xarp_pa) = dest;
++      xreq.xarp_ha.sdl_nlen = ifnamsz;
++      memcpy(xreq.xarp_ha.sdl_data, ifr.ifr_name, ifnamsz);
++      xreq.xarp_ha.sdl_family = AF_LINK;
++      xreq.xarp_ha.sdl_index = iface_index;
++      /* 6 corresponds to IFT_ETHER */
++      xreq.xarp_ha.sdl_type = 6;
++      xreq.xarp_ha.sdl_alen = ETHER_ADDR_LEN;
++      memcpy(xreq.xarp_ha.sdl_data + ifnamsz, mess->chaddr, mess->hlen);
++      xreq.xarp_flags = ATF_COM;
++      ioctl(daemon->dhcpfd, SIOCSXARP, &xreq);
+     }
+ #elif defined(HAVE_BSD_NETWORK)
+   else 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/Makefile	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,75 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+#
+include ../../../make-rules/shared-macros.mk
+
+COMPONENT_NAME=		cinder
+COMPONENT_CODENAME=	grizzly
+COMPONENT_VERSION=	2013.1.4
+COMPONENT_SRC=		$(COMPONENT_NAME)-$(COMPONENT_VERSION)
+COMPONENT_ARCHIVE=	$(COMPONENT_SRC).tar.gz
+COMPONENT_ARCHIVE_HASH=	\
+    sha256:b3466dbc2ea88eef67f73db2b12ec2e8b66047b2bfa0eea31392e155657bee00
+COMPONENT_ARCHIVE_URL=	http://launchpad.net/$(COMPONENT_NAME)/$(COMPONENT_CODENAME)/$(COMPONENT_VERSION)/+download/$(COMPONENT_ARCHIVE)
+COMPONENT_PROJECT_URL=	http://www.openstack.org/
+COMPONENT_BUGDB=	service/cinder
+IPS_COMPONENT_VERSION=	0.$(COMPONENT_VERSION) 
+
+include $(WS_TOP)/make-rules/prep.mk
+include $(WS_TOP)/make-rules/setup.py.mk
+include $(WS_TOP)/make-rules/ips.mk
+
+ASLR_MODE = $(ASLR_NOT_APPLICABLE)
+
+# Since this is an app, and doesn't provide any public library interfaces, we
+# only need to deliver one version.  The manifest is parameterized, though.
+PYTHON_VERSIONS=	2.6
+
+PKG_MACROS +=		PYVER=$(PYTHON_VERSIONS)
+
+# cinder-api, cinder-backup, cinder-scheduler, and cinder-volume
+# depend on the cinder-db svc so copy the manifest into the proto
+# directory for pkgdepend to find
+COMPONENT_POST_INSTALL_ACTION += \
+        ($(MKDIR) $(PROTO_DIR)/lib/svc/manifest/application/openstack; \
+         $(CP) files/cinder-api.xml $(PROTO_DIR)/lib/svc/manifest/application/openstack/; \
+         $(CP) files/cinder-backup.xml $(PROTO_DIR)/lib/svc/manifest/application/openstack/; \
+         $(CP) files/cinder-db.xml $(PROTO_DIR)/lib/svc/manifest/application/openstack/; \
+         $(CP) files/cinder-scheduler.xml $(PROTO_DIR)/lib/svc/manifest/application/openstack/; \
+         $(CP) files/cinder-volume.xml $(PROTO_DIR)/lib/svc/manifest/application/openstack/; \
+         $(MKDIR) $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/cinder/volume/drivers/solaris; \
+	 $(TOUCH) $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/cinder/volume/drivers/solaris/__init__.py; \
+	 $(CP) files/solaris/zfs.py $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/cinder/volume/drivers/solaris); \
+	 $(PYTHON) -m compileall $(PROTO_DIR)/$(PYTHON_VENDOR_PACKAGES)
+
+# common targets
+build:		$(BUILD_NO_ARCH)
+
+install:	$(INSTALL_NO_ARCH)
+
+test:		$(NO_TESTS)
+
+BUILD_PKG_DEPENDENCIES =	$(BUILD_TOOLS)
+
+include $(WS_TOP)/make-rules/depend.mk
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/cinder.license	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,242 @@
+The following applies to all products licensed under the Apache 2.0 License:
+
+You may not use the identified files except in compliance with the Apache License, Version 2.0 (the "License.")
+ 
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.  A copy of the license is also reproduced below.
+
+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.
+
+		                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.
+
+# Interactive shell based on Django:
+#
+# Copyright (c) 2005, the Lawrence Journal-World
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+#     1. Redistributions of source code must retain the above copyright notice,
+#        this list of conditions and the following disclaimer.
+#
+#     2. Redistributions in binary form must reproduce the above copyright
+#        notice, this list of conditions and the following disclaimer in the
+#        documentation and/or other materials provided with the distribution.
+#
+#     3. Neither the name of Django nor the names of its contributors may be
+#        used to endorse or promote products derived from this software without
+#        specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/cinder.p5m	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,371 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+#
+
+set name=pkg.fmri \
+    value=pkg:/cloud/openstack/[email protected]$(IPS_COMPONENT_VERSION),$(BUILD_VERSION)
+set name=pkg.summary value="OpenStack Cinder"
+set name=pkg.description \
+    value="OpenStack Cinder provides an infrastructure for managing block storage volumes in OpenStack. It allows block devices to be exposed and connected to compute instances for expanded storage, better performance and integration with enterprise storage platforms."
+set name=pkg.human-version value="Grizzly $(COMPONENT_VERSION)"
+set name=com.oracle.info.description \
+    value="Cinder, the OpenStack block storage service"
+set name=com.oracle.info.tpno value=16268
+set name=info.classification \
+    value="org.opensolaris.category.2008:System/Administration and Configuration" \
+    value="org.opensolaris.category.2008:System/Enterprise Management" \
+    value=org.opensolaris.category.2008:System/Virtualization \
+    value="org.opensolaris.category.2008:Web Services/Application and Web Servers"
+set name=info.source-url value=$(COMPONENT_ARCHIVE_URL)
+set name=info.upstream value="OpenStack <[email protected]>"
+set name=info.upstream-url value=$(COMPONENT_PROJECT_URL)
+set name=org.opensolaris.arc-caseid value=PSARC/2013/350 value=PSARC/2014/054
+set name=org.opensolaris.consolidation value=$(CONSOLIDATION)
+dir  path=etc/cinder owner=cinder group=cinder mode=0700
+file path=etc/cinder/api-paste.ini owner=cinder group=cinder mode=0644 \
+    overlay=allow preserve=true
+file files/cinder.conf path=etc/cinder/cinder.conf owner=cinder group=cinder \
+    mode=0644 overlay=allow preserve=true
+file cinder/volume/drivers/emc/cinder_emc_config.xml.sample \
+    path=etc/cinder/cinder_emc_config.xml owner=cinder group=cinder mode=0644 \
+    overlay=allow preserve=true
+file etc/cinder/logging_sample.conf path=etc/cinder/logging.conf owner=cinder \
+    group=cinder mode=0644 overlay=allow preserve=true
+file path=etc/cinder/policy.json owner=cinder group=cinder mode=0644 \
+    overlay=allow preserve=true
+file files/cinder.auth_attr \
+    path=etc/security/auth_attr.d/cloud:openstack:cinder group=sys
+file files/cinder.exec_attr \
+    path=etc/security/exec_attr.d/cloud:openstack:cinder group=sys
+file files/cinder.prof_attr \
+    path=etc/security/prof_attr.d/cloud:openstack:cinder group=sys
+file files/cinder.user_attr path=etc/user_attr.d/cloud:openstack:cinder \
+    group=sys
+file path=lib/svc/manifest/application/openstack/cinder-api.xml
+file path=lib/svc/manifest/application/openstack/cinder-backup.xml
+file path=lib/svc/manifest/application/openstack/cinder-db.xml
+file path=lib/svc/manifest/application/openstack/cinder-scheduler.xml
+file path=lib/svc/manifest/application/openstack/cinder-volume.xml
+file files/cinder-api path=lib/svc/method/cinder-api
+file files/cinder-backup path=lib/svc/method/cinder-backup
+file files/cinder-scheduler path=lib/svc/method/cinder-scheduler
+file files/cinder-volume path=lib/svc/method/cinder-volume
+file files/cinder-volume-setup path=lib/svc/method/cinder-volume-setup
+file path=usr/bin/cinder-clear-rabbit-queues
+file path=usr/bin/cinder-manage pkg.depend.bypass-generate=.*/bpython.*
+file usr/bin/cinder-api path=usr/lib/cinder/cinder-api mode=0555
+file usr/bin/cinder-backup path=usr/lib/cinder/cinder-backup mode=0555
+file usr/bin/cinder-scheduler path=usr/lib/cinder/cinder-scheduler mode=0555
+file usr/bin/cinder-volume path=usr/lib/cinder/cinder-volume mode=0555
+file usr/bin/cinder-volume-usage-audit \
+    path=usr/lib/cinder/cinder-volume-usage-audit mode=0555
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder-$(COMPONENT_VERSION)-py$(PYVER).egg-info/PKG-INFO
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder-$(COMPONENT_VERSION)-py$(PYVER).egg-info/SOURCES.txt
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder-$(COMPONENT_VERSION)-py$(PYVER).egg-info/dependency_links.txt
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder-$(COMPONENT_VERSION)-py$(PYVER).egg-info/entry_points.txt
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder-$(COMPONENT_VERSION)-py$(PYVER).egg-info/requires.txt
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder-$(COMPONENT_VERSION)-py$(PYVER).egg-info/top_level.txt
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/auth.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/common.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/admin_actions.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/backups.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/extended_snapshot_attributes.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/hosts.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/image_create.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/quota_classes.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/quotas.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/services.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/types_extra_specs.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/types_manage.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/volume_actions.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/volume_host_attribute.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/volume_image_metadata.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/contrib/volume_tenant_attribute.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/extensions.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/middleware/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/middleware/auth.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/middleware/fault.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/middleware/sizelimit.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/openstack/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/openstack/urlmap.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/openstack/volume/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/openstack/volume/versions.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/openstack/wsgi.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/schemas/atom-link.rng
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/schemas/v1.1/extension.rng
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/schemas/v1.1/extensions.rng
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/schemas/v1.1/limits.rng
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/schemas/v1.1/metadata.rng
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/sizelimit.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/urlmap.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/v1/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/v1/limits.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/v1/router.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/v1/snapshot_metadata.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/v1/snapshots.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/v1/types.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/v1/volume_metadata.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/v1/volumes.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/v2/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/v2/limits.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/v2/router.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/v2/snapshot_metadata.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/v2/snapshots.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/v2/types.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/v2/views/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/v2/views/volumes.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/v2/volumes.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/versions.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/views/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/views/backups.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/views/limits.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/views/types.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/views/versions.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/api/xmlutil.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/backup/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/backup/api.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/backup/manager.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/backup/rpcapi.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/backup/services/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/backup/services/swift.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/common/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/common/sqlalchemyutils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/compute/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/compute/aggregate_states.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/context.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/api.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/base.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/migration.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/api.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/README
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/manage.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/migrate.cfg
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/versions/001_cinder_init.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/versions/002_quota_class.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/versions/003_glance_metadata.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/versions/004_volume_type_to_uuid.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/versions/005_add_source_volume_column.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/versions/005_sqlite_downgrade.sql
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/versions/006_snapshots_add_provider_location.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/versions/007_add_volume_snapshot_fk.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/versions/007_sqlite_downgrade.sql
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/versions/008_add_backup.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/versions/009_add_snapshot_metadata_table.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migrate_repo/versions/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/migration.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/models.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/db/sqlalchemy/session.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/exception.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/flags.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/image/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/image/glance.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/image/image_utils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/bs/LC_MESSAGES/cinder.po
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/cinder.pot
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/cs/LC_MESSAGES/cinder.po
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/da/LC_MESSAGES/cinder.po
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/de/LC_MESSAGES/cinder.po
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/en_AU/LC_MESSAGES/cinder.po
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/en_GB/LC_MESSAGES/cinder.po
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/es/LC_MESSAGES/cinder.po
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/fr/LC_MESSAGES/cinder.po
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/it/LC_MESSAGES/cinder.po
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/ja/LC_MESSAGES/cinder.po
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/ko/LC_MESSAGES/cinder.po
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/pt_BR/LC_MESSAGES/cinder.po
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/ru/LC_MESSAGES/cinder.po
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/tl/LC_MESSAGES/cinder.po
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/tr/LC_MESSAGES/cinder.po
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/uk/LC_MESSAGES/cinder.po
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/zh_CN/LC_MESSAGES/cinder.po
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/locale/zh_TW/LC_MESSAGES/cinder.po
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/manager.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/README
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/context.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/exception.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/excutils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/fileutils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/gettextutils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/importutils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/jsonutils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/local.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/lockutils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/log.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/network_utils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/notifier/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/notifier/api.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/notifier/log_notifier.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/notifier/no_op_notifier.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/notifier/rabbit_notifier.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/notifier/rpc_notifier.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/notifier/rpc_notifier2.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/notifier/test_notifier.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/policy.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rootwrap/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rootwrap/filters.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rootwrap/wrapper.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/amqp.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/common.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/dispatcher.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/impl_fake.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/impl_kombu.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/impl_qpid.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/impl_zmq.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/matchmaker.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/matchmaker_redis.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/proxy.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/rpc/service.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/filter.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/filters/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/filters/availability_zone_filter.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/filters/capabilities_filter.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/filters/extra_specs_ops.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/filters/json_filter.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/weight.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/scheduler/weights/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/setup.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/strutils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/timeutils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/uuidutils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/openstack/common/version.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/policy.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/quota.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/chance.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/driver.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/filter_scheduler.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/filters/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/filters/capacity_filter.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/filters/retry_filter.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/host_manager.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/manager.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/rpcapi.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/scheduler_options.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/simple.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/weights/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/scheduler/weights/capacity.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/service.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/test.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/utils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/version.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/api.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/configuration.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/driver.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/emc/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/emc/emc_smis_common.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/emc/emc_smis_iscsi.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/netapp/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/netapp/api.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/netapp/iscsi.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/nexenta/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/nexenta/jsonrpc.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/nexenta/volume.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/solaris/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/solaris/zfs.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/drivers/zadara.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/iscsi.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/manager.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/rpcapi.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/utils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/volume/volume_types.py
+file path=usr/lib/python$(PYVER)/vendor-packages/cinder/wsgi.py
+dir  path=var/lib/cinder owner=cinder group=cinder mode=0700
+group groupname=cinder gid=81
+user username=cinder ftpuser=false gcos-field="OpenStack Cinder" group=cinder \
+    home-dir=/var/lib/cinder uid=81
+license cinder.license license="Apache v2.0"
+
+# force a group dependency on the optional anyjson; pkgdepend work is needed to
+# flush this out.
+depend type=group fmri=library/python-2/anyjson-26
+
+# force a dependency on package delivering itadm(1M)
+depend type=require fmri=__TBD pkg.debug.depend.file=usr/sbin/itadm
+
+# force a dependency on package delivering stmfadm(1M)
+depend type=require fmri=__TBD pkg.debug.depend.file=usr/sbin/stmfadm
+
+# force a dependency on package delivering zfs(1M)
+depend type=require fmri=__TBD pkg.debug.depend.file=usr/sbin/zfs
+
+# force a dependency on package delivering zpool(1M)
+depend type=require fmri=__TBD pkg.debug.depend.file=usr/sbin/zpool
+
+# force a dependency on greenlet; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python-2/greenlet-26
+
+# force a dependency on iso8601; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python-2/iso8601-26
+
+# force a dependency on kombu; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python-2/kombu-26
+
+# force a dependency on lxml; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python-2/lxml-26
+
+# force a dependency on paste; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python-2/paste-26
+
+# force a dependency on paste.deploy; pkgdepend work is needed to flush this
+# out.
+depend type=require fmri=library/python-2/paste.deploy-26
+
+# force a dependency on pywbem; pkgdepend work is needed to flush this out.
+# (dependency is for EMC volume driver)
+depend type=require fmri=library/python-2/pywbem
+
+# force a dependency on routes; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python-2/routes-26
+
+# force a dependency on setuptools; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python-2/setuptools-26
+
+# force a dependency on stevedore; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python-2/stevedore-26
+
+# force a dependency on suds; pkgdepend work is needed to flush this out.
+# (dependency is for NetApp volume driver)
+depend type=require fmri=library/python-2/suds-26
+
+# force a dependency on webob; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python-2/webob-26
+
+# force a dependency on glanceclient; pkgdepend work is needed to flush this
+# out.
+depend type=require fmri=library/python/glanceclient-26
+
+# force a dependency on swiftclient; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python/swiftclient-26
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/files/cinder-api	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,27 @@
+#!/usr/bin/python2.6
+
+# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+#
+#    Licensed 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.
+
+import os
+
+import smf_include
+
+
+def start():
+    smf_include.smf_subprocess("/usr/lib/cinder/cinder-api")
+
+if __name__ == "__main__":
+    os.putenv("LC_ALL", "C")
+    smf_include.smf_main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/files/cinder-api.xml	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,73 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed 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.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="cinder-api">
+
+  <service version="1" type="service"
+    name="application/openstack/cinder/cinder-api">
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <!-- create a dependency on the cinder_db service so the cinder
+         services do not collide when creating the database -->
+    <dependency name='cinder_db' grouping='optional_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/application/openstack/cinder/cinder-db'/>
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/cinder-api %m">
+      <method_context>
+        <method_credential user='cinder' group='cinder' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.cinder' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.cinder' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Cinder API Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          cinder-api is a server daemon that provides the Cinder API service in
+          order to provide volume management for the OpenStack Compute service. 
+        </loctext>
+      </description>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/files/cinder-backup	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,27 @@
+#!/usr/bin/python2.6
+
+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+#
+#    Licensed 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.
+
+import os
+
+import smf_include
+
+
+def start():
+    smf_include.smf_subprocess("/usr/lib/cinder/cinder-backup")
+
+if __name__ == "__main__":
+    os.putenv("LC_ALL", "C")
+    smf_include.smf_main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/files/cinder-backup.xml	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,73 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed 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.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="cinder-backup">
+
+  <service version="1" type="service"
+    name="application/openstack/cinder/cinder-backup">
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <!-- create a dependency on the cinder_db service so the cinder
+         services do not collide when creating the database -->
+    <dependency name='cinder_db' grouping='optional_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/application/openstack/cinder/cinder-db'/>
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/cinder-backup %m">
+      <method_context>
+        <method_credential user='cinder' group='cinder' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.cinder' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.cinder' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Cinder Backup Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          cinder-backup is a server daemon that provides a means to back up a
+          Cinder volume to the OpenStack Object Store Service (Swift).
+        </loctext>
+      </description>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/files/cinder-db.xml	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,70 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed 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.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="cinder-db">
+
+  <service version="1" type="service"
+    name="application/openstack/cinder/cinder-db">
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/usr/bin/cinder-manage db sync">
+      <method_context>
+        <method_credential user='cinder' group='cinder' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":true"/>
+
+    <property_group type="framework" name="startd">
+      <propval type="astring" name="duration" value="transient"/>
+    </property_group>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.cinder' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.cinder' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Cinder Database Creation Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          cinder-db is a transient service to create the Cinder database if
+          required.
+        </loctext>
+      </description>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/files/cinder-scheduler	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,27 @@
+#!/usr/bin/python2.6
+
+# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+#
+#    Licensed 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.
+
+import os
+
+import smf_include
+
+
+def start():
+    smf_include.smf_subprocess("/usr/lib/cinder/cinder-scheduler")
+
+if __name__ == "__main__":
+    os.putenv("LC_ALL", "C")
+    smf_include.smf_main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/files/cinder-scheduler.xml	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,73 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed 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.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="cinder-scheduler">
+
+  <service version="1" type="service"
+    name="application/openstack/cinder/cinder-scheduler">
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <!-- create a dependency on the cinder_db service so the cinder
+         services do not collide when creating the database -->
+    <dependency name='cinder_db' grouping='optional_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/application/openstack/cinder/cinder-db'/>
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/cinder-scheduler %m">
+      <method_context>
+        <method_credential user='cinder' group='cinder' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.cinder' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.cinder' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Cinder Scheduler Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          cinder-scheduler picks a cinder-volume node to host the block storage
+          requested by the OpenStack Compute service. 
+        </loctext>
+      </description>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/files/cinder-volume	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,55 @@
+#!/usr/bin/python2.6
+
+# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+#
+#    Licensed 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.
+
+import ConfigParser
+import os
+
+import smf_include
+
+from subprocess import CalledProcessError, Popen, PIPE, check_call
+
+
+def start():
+    """ checks cinder's conf file for the ZFSISCSIDriver.  If it's found, make
+    sure svc:/network/iscsi/target:default is online.
+
+    """
+    parser = ConfigParser.ConfigParser()
+    parser.read("/etc/cinder/cinder.conf")
+    driver = parser.get("DEFAULT", "volume_driver")
+    if driver == "cinder.volume.drivers.solaris.zfs.ZFSISCSIDriver":
+        iscsi_svc = "svc:/network/iscsi/target:default"
+        cmd = ["/usr/bin/svcs", "-H", "-o", "state", iscsi_svc]
+        try:
+            p = Popen(cmd, stdout=PIPE, stderr=PIPE)
+            output, error = p.communicate()
+        except CalledProcessError:
+            print "%s not found.  Is it installed?" % iscsi_svc
+            return smf_include.SMF_EXIT_ERR_CONFIG
+
+        if output.strip() != "online":
+            cmd = ["/usr/sbin/svcadm", "enable", "-rs", iscsi_svc]
+            try:
+                check_call(cmd)
+            except CalledProcessError as err:
+                print "enabling %s failed:  %s" % (iscsi_svc, err)
+                return smf_include.SMF_EXIT_ERR_CONFIG
+
+    smf_include.smf_subprocess("/usr/bin/pfexec /usr/lib/cinder/cinder-volume")
+
+if __name__ == "__main__":
+    os.putenv("LC_ALL", "C")
+    smf_include.smf_main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/files/cinder-volume-setup	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,84 @@
+#!/usr/bin/python2.6
+
+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+#
+#    Licensed 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.
+
+import ConfigParser
+import os
+import sys
+
+import smf_include
+
+from subprocess import CalledProcessError, Popen, PIPE, check_call
+
+
+def start():
+    """ retrieves the setting for 'zfs_volume_base' from Cinder's conf file in
+    order to set it up properly for Cinder to use.
+
+    """
+    parser = ConfigParser.ConfigParser()
+    parser.read("/etc/cinder/cinder.conf")
+
+    # set up the top-level dataset with the proper permissions for cinder
+    top_ds = parser.get("DEFAULT", "zfs_volume_base")
+
+    # look to see if the dataset exists
+    cmd = ["/usr/sbin/zfs", "list", top_ds]
+    try:
+        check_call(cmd, stdout=PIPE, stderr=PIPE)
+    except CalledProcessError as err:
+        # the dataset doesn't exist, so go create it
+        try:
+            check_call(["/usr/sbin/zfs", "create", "-p", top_ds])
+        except CalledProcessError as err:
+            print "unable to create %s:  %s" % (top_ds, err)
+            return smf_include.SMF_EXIT_ERR_CONFIG
+
+    # get the mountpoint
+    cmd = ["/usr/sbin/zfs", "get", "-H", "-o", "value", "mountpoint", top_ds]
+    p = Popen(cmd, stdout=PIPE, stderr=PIPE)
+    mountpoint, error = p.communicate()
+    if p.returncode != 0:
+        print "unable to determine mountpoint of %s:  %s" % (top_ds, error)
+        return smf_include.SMF_EXIT_ERR_CONFIG
+
+    p = Popen(["/usr/bin/ls", "-dv", mountpoint], stdout=PIPE, stderr=PIPE)
+    output, error = p.communicate()
+
+    if "user:cinder:add_subdirectory/append_data:allow" not in output:
+        # set an ACL to all mountpoint access
+        try:
+            check_call(["/usr/bin/chmod",
+                        "A+user:cinder:add_subdirectory:allow",
+                        mountpoint.strip()])
+        except CalledProcessError as err:
+            print "ACL creation for mountpoint access of "
+            print "%s to 'cinder' failed:  %s" % (top_ds, err)
+            return smf_include.SMF_EXIT_ERR_CONFIG
+
+    # set delegation
+    cmd = ["/usr/sbin/zfs", "allow", "cinder",
+           "clone,create,destroy,mount,snapshot", top_ds]
+    try:
+        check_call(cmd)
+    except CalledProcessError as err:
+        print "delegation of %s to 'cinder' failed:  %s" % (top_ds, err)
+        return smf_include.SMF_EXIT_ERR_CONFIG
+
+    return smf_include.SMF_EXIT_OK
+
+if __name__ == "__main__":
+    os.putenv("LC_ALL", "C")
+    smf_include.smf_main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/files/cinder-volume.xml	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,97 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed 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.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="cinder-volume">
+
+  <service version="1" type="service"
+    name="application/openstack/cinder/cinder-volume">
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <dependency name='iscsi_target' grouping='optional_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/network/iscsi/target:default' />
+    </dependency>
+
+    <!-- create a dependency on the cinder_db service so the cinder
+         services do not collide when creating the database -->
+    <dependency name='cinder_db' grouping='optional_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/application/openstack/cinder/cinder-db'/>
+    </dependency>
+
+    <instance name='setup' enabled='false'>
+
+      <exec_method timeout_seconds="60" type="method" name="start"
+        exec="/lib/svc/method/cinder-volume-setup %m">
+      </exec_method>
+      <exec_method timeout_seconds="60" type="method" name="stop"
+        exec=":true"/>
+
+      <property_group type='framework' name='startd'>
+        <propval type='astring' name='duration' value='transient' />
+      </property_group>
+    </instance>
+
+    <instance name='default' enabled='false'>
+
+      <dependency name='cinder_volume_setup' grouping='require_all'
+        restart_on='error' type='service'>
+        <service_fmri value='svc:/application/openstack/cinder/cinder-volume:setup' />
+      </dependency>
+
+      <exec_method timeout_seconds="60" type="method" name="start"
+        exec="/lib/svc/method/cinder-volume %m">
+        <method_context>
+          <method_credential user='cinder' group='cinder' />
+        </method_context>
+      </exec_method>
+      <exec_method timeout_seconds="60" type="method" name="stop"
+        exec=":kill"/>
+
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.cinder' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.cinder' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Cinder Volume Management Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          cinder-volume is a server daemon for managing volumes requested by
+          the OpenStack Compute service.
+        </loctext>
+      </description>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/files/cinder.auth_attr	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,2 @@
+solaris.smf.manage.cinder:RO::Manage OpenStack Cinder Service States::
+solaris.smf.value.cinder:RO::Change Values of OpenStack Cinder Properties::
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/files/cinder.conf	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,1186 @@
+####################
+# cinder.conf sample #
+####################
+
+[DEFAULT]
+
+#
+# Options defined in cinder.openstack.common.cfg:CommonConfigOpts
+#
+
+# Print debugging output (boolean value)
+#debug=false
+
+# Print more verbose output (boolean value)
+#verbose=false
+
+# If this option is specified, the logging configuration file
+# specified is used and overrides any other logging options
+# specified. Please see the Python logging module
+# documentation for details on logging configuration files.
+# (string value)
+#log_config=<None>
+
+# A logging.Formatter log message format string which may use
+# any of the available logging.LogRecord attributes. Default:
+# %(default)s (string value)
+#log_format=%(asctime)s %(levelname)8s [%(name)s] %(message)s
+
+# Format string for %%(asctime)s in log records. Default:
+# %(default)s (string value)
+#log_date_format=%Y-%m-%d %H:%M:%S
+
+# (Optional) Name of log file to output to. If not set,
+# logging will go to stdout. (string value)
+#log_file=<None>
+
+# (Optional) The directory to keep log files in (will be
+# prepended to --log-file) (string value)
+#log_dir=<None>
+
+# Use syslog for logging. (boolean value)
+#use_syslog=false
+
+# syslog facility to receive log lines (string value)
+#syslog_log_facility=LOG_USER
+
+# Do not count snapshots against gigabytes quota (bool value)
+#no_snapshot_gb_quota=False
+
+#
+# Options defined in cinder.exception
+#
+
+# make exception message format errors fatal (boolean value)
+#fatal_exception_format_errors=false
+
+
+#
+# Options defined in cinder.flags
+#
+
+# Virtualization api connection type : libvirt, xenapi, or
+# fake (string value)
+#connection_type=<None>
+
+# The SQLAlchemy connection string used to connect to the
+# database (string value)
+#sql_connection=sqlite:///$state_path/$sqlite_db
+
+# Verbosity of SQL debugging information. 0=None,
+# 100=Everything (integer value)
+#sql_connection_debug=0
+
+# File name for the paste.deploy config for cinder-api (string
+# value)
+#api_paste_config=api-paste.ini
+
+# Directory where the cinder python module is installed
+# (string value)
+#pybasedir=/usr/lib/python2.6/vendor-packages
+
+# Directory where cinder binaries are installed (string value)
+bindir=/usr/bin
+
+# Top-level directory for maintaining cinder's state (string
+# value)
+#state_path=$pybasedir
+
+# ip address of this host (string value)
+#my_ip=10.0.0.1
+
+# default glance hostname or ip (string value)
+#glance_host=$my_ip
+
+# default glance port (integer value)
+#glance_port=9292
+
+# A list of the glance api servers available to cinder
+# ([hostname|ip]:port) (list value)
+#glance_api_servers=$glance_host:$glance_port
+
+# default version of the glance api to use
+#glance_api_version=1
+
+# Number retries when downloading an image from glance
+# (integer value)
+#glance_num_retries=0
+
+# Allow to perform insecure SSL (https) requests to glance
+# (boolean value)
+#glance_api_insecure=false
+
+# the topic scheduler nodes listen on (string value)
+#scheduler_topic=cinder-scheduler
+
+# the topic volume nodes listen on (string value)
+#volume_topic=cinder-volume
+
+# Deploy v1 of the Cinder API.  (boolean value)
+#enable_v1_api=true
+
+# Deploy v2 of the Cinder API.  (boolean value)
+#enable_v2_api=true
+
+# whether to rate limit the api (boolean value)
+#api_rate_limit=true
+
+# Specify list of extensions to load when using
+# osapi_volume_extension option with
+# cinder.api.contrib.select_extensions (list value)
+#osapi_volume_ext_list=
+
+# osapi volume extension to load (multi valued)
+#osapi_volume_extension=cinder.api.contrib.standard_extensions
+
+# Base URL that will be presented to users in links to the
+# OpenStack Volume API (string value)
+#osapi_volume_base_URL=<None>
+
+# the maximum number of items returned in a single response
+# from a collection resource (integer value)
+#osapi_max_limit=1000
+
+# the filename to use with sqlite (string value)
+#sqlite_db=cinder.sqlite
+
+# If passed, use synchronous mode for sqlite (boolean value)
+#sqlite_synchronous=true
+
+# timeout before idle sql connections are reaped (integer
+# value)
+#sql_idle_timeout=3600
+
+# maximum db connection retries during startup. (setting -1
+# implies an infinite retry count) (integer value)
+#sql_max_retries=10
+
+# interval between retries of opening a sql connection
+# (integer value)
+#sql_retry_interval=10
+
+# full class name for the Manager for volume (string value)
+#volume_manager=cinder.volume.manager.VolumeManager
+
+# full class name for the Manager for scheduler (string value)
+#scheduler_manager=cinder.scheduler.manager.SchedulerManager
+
+# Name of this node.  This can be an opaque identifier.  It is
+# not necessarily a hostname, FQDN, or IP address. (string
+# value)
+#host=cinder
+
+# availability zone of this node (string value)
+#storage_availability_zone=nova
+
+# Memcached servers or None for in process cache. (list value)
+#memcached_servers=<None>
+
+# default volume type to use (string value)
+#default_volume_type=<None>
+
+# time period to generate volume usages for.  Time period must
+# be hour, day, month or year (string value)
+#volume_usage_audit_period=month
+
+# Path to the rootwrap configuration file to use for running
+# commands as root (string value)
+#rootwrap_config=/etc/cinder/rootwrap.conf
+
+# Whether to log monkey patching (boolean value)
+#monkey_patch=false
+
+# List of modules/decorators to monkey patch (list value)
+#monkey_patch_modules=
+
+# maximum time since last check-in for up service (integer
+# value)
+#service_down_time=60
+
+# The full class name of the volume API class to use (string
+# value)
+#volume_api_class=cinder.volume.api.API
+
+# The strategy to use for auth. Supports noauth, keystone, and
+# deprecated. (string value)
+#auth_strategy=noauth
+
+# AMQP exchange to connect to if using RabbitMQ or Qpid
+# (string value)
+#control_exchange=cinder
+
+
+#
+# Options defined in cinder.policy
+#
+
+# JSON file representing policy (string value)
+#policy_file=policy.json
+
+# Rule checked when requested rule is not found (string value)
+#policy_default_rule=default
+
+
+#
+# Options defined in cinder.quota
+#
+
+# number of volumes allowed per project (integer value)
+#quota_volumes=10
+
+# number of volume snapshots allowed per project (integer value)
+#quota_snapshots=10
+
+# number of volume and snapshot gigabytes allowed per project (integer
+# value)
+#quota_gigabytes=1000
+
+# number of seconds until a reservation expires (integer
+# value)
+#reservation_expire=86400
+
+# count of reservations until usage is refreshed (integer
+# value)
+#until_refresh=0
+
+# number of seconds between subsequent usage refreshes
+# (integer value)
+#max_age=0
+
+# default driver to use for quota checks (string value)
+#quota_driver=cinder.quota.DbQuotaDriver
+
+
+#
+# Options defined in cinder.service
+#
+
+# seconds between nodes reporting state to datastore (integer
+# value)
+#report_interval=10
+
+# seconds between running periodic tasks (integer value)
+#periodic_interval=60
+
+# range of seconds to randomly delay when starting the
+# periodic task scheduler to reduce stampeding. (Disable by
+# setting to 0) (integer value)
+#periodic_fuzzy_delay=60
+
+# IP address for OpenStack Volume API to listen (string value)
+#osapi_volume_listen=0.0.0.0
+
+# port for os volume api to listen (integer value)
+#osapi_volume_listen_port=8776
+
+
+#
+# Options defined in cinder.test
+#
+
+# File name of clean sqlite db (string value)
+#sqlite_clean_db=clean.sqlite
+
+# should we use everything for testing (boolean value)
+#fake_tests=true
+
+
+#
+# Options defined in cinder.wsgi
+#
+
+# Number of backlog requests to configure the socket with
+# (integer value)
+#backlog=4096
+
+# Sets the value of TCP_KEEPIDLE in seconds for each server
+# socket. Not supported on OS X. (integer value)
+#tcp_keepidle=600
+
+# CA certificate file to use to verify connecting clients
+# (string value)
+#ssl_ca_file=<None>
+
+# Certificate file to use when starting the server securely
+# (string value)
+#ssl_cert_file=<None>
+
+# Private key file to use when starting the server securely
+# (string value)
+#ssl_key_file=<None>
+
+
+#
+# Options defined in cinder.api.middleware.auth
+#
+
+# Treat X-Forwarded-For as the canonical remote address. Only
+# enable this if you have a sanitizing proxy. (boolean value)
+#use_forwarded_for=false
+
+
+#
+# Options defined in cinder.api.middleware.sizelimit
+#
+
+# Max size for body of a request (integer value)
+#osapi_max_request_body_size=114688
+
+
+#
+# Options defined in cinder.common.deprecated
+#
+
+# make deprecations fatal (boolean value)
+#fatal_deprecations=false
+
+
+#
+# Options defined in cinder.db.api
+#
+
+# The backend to use for db (string value)
+#db_backend=sqlalchemy
+
+# Services to be added to the available pool on create
+# (boolean value)
+#enable_new_services=true
+
+# Template string to be used to generate volume names (string
+# value)
+#volume_name_template=volume-%s
+
+# Template string to be used to generate snapshot names
+# (string value)
+#snapshot_name_template=snapshot-%s
+
+# Template string to be used to generate backup names (string
+# value)
+#backup_name_template=backup-%s
+
+#
+# Options defined in cinder.db.base
+#
+
+# driver to use for database access (string value)
+#db_driver=cinder.db
+
+
+#
+# Options defined in cinder.image.image_utils
+#
+
+# parent dir for tempdir used for image conversion (string
+# value)
+#image_conversion_dir=/tmp
+
+
+#
+# Options defined in cinder.openstack.common.lockutils
+#
+
+# Whether to disable inter-process locks (boolean value)
+#disable_process_locking=false
+
+# Directory to use for lock files (string value)
+#lock_path=<None>
+
+
+#
+# Options defined in cinder.openstack.common.log
+#
+
+# Log output to a per-service log file in named directory
+# (string value)
+#logdir=<None>
+
+# Log output to a named file (string value)
+#logfile=<None>
+
+# Log output to standard error (boolean value)
+#use_stderr=true
+
+# Default file mode used when creating log files (string
+# value)
+#logfile_mode=0644
+
+# format string to use for log messages with context (string
+# value)
+#logging_context_format_string=%(asctime)s %(levelname)s %(name)s [%(request_id)s %(user_id)s %(project_id)s] %(instance)s%(message)s
+
+# format string to use for log messages without context
+# (string value)
+#logging_default_format_string=%(asctime)s %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s
+
+# data to append to log format when level is DEBUG (string
+# value)
+#logging_debug_format_suffix=%(funcName)s %(pathname)s:%(lineno)d
+
+# prefix each line of exception output with this format
+# (string value)
+#logging_exception_prefix=%(asctime)s %(process)d TRACE %(name)s %(instance)s
+
+# list of logger=LEVEL pairs (list value)
+#default_log_levels=amqplib=WARN,sqlalchemy=WARN,boto=WARN,suds=INFO,keystone=INFO,eventlet.wsgi.server=WARN
+
+# publish error events (boolean value)
+#publish_errors=false
+
+# If an instance is passed with the log message, format it
+# like this (string value)
+#instance_format="[instance: %(uuid)s] "
+
+# If an instance UUID is passed with the log message, format
+# it like this (string value)
+#instance_uuid_format="[instance: %(uuid)s] "
+
+
+#
+# Options defined in cinder.openstack.common.notifier.api
+#
+
+# Driver or drivers to handle sending notifications (multi
+# valued)
+
+# Default notification level for outgoing notifications
+# (string value)
+#default_notification_level=INFO
+
+# Default publisher_id for outgoing notifications (string
+# value)
+#default_publisher_id=$host
+
+
+#
+# Options defined in cinder.openstack.common.notifier.rabbit_notifier
+#
+
+# AMQP topic used for openstack notifications (list value)
+#notification_topics=notifications
+
+
+#
+# Options defined in cinder.openstack.common.rpc
+#
+
+# The messaging module to use, defaults to kombu. (string
+# value)
+#rpc_backend=cinder.openstack.common.rpc.impl_kombu
+
+# Size of RPC thread pool (integer value)
+#rpc_thread_pool_size=64
+
+# Size of RPC connection pool (integer value)
+#rpc_conn_pool_size=30
+
+# Seconds to wait for a response from call or multicall
+# (integer value)
+#rpc_response_timeout=60
+
+# Seconds to wait before a cast expires (TTL). Only supported
+# by impl_zmq. (integer value)
+#rpc_cast_timeout=30
+
+# Modules of exceptions that are permitted to be recreatedupon
+# receiving exception data from an rpc call. (list value)
+#allowed_rpc_exception_modules=cinder.openstack.common.exception,nova.exception,cinder.exception
+
+# If passed, use a fake RabbitMQ provider (boolean value)
+#fake_rabbit=false
+
+
+#
+# Options defined in cinder.openstack.common.rpc.impl_kombu
+#
+
+# SSL version to use (valid only if SSL enabled) (string
+# value)
+#kombu_ssl_version=
+
+# SSL key file (valid only if SSL enabled) (string value)
+#kombu_ssl_keyfile=
+
+# SSL cert file (valid only if SSL enabled) (string value)
+#kombu_ssl_certfile=
+
+# SSL certification authority file (valid only if SSL enabled)
+# (string value)
+#kombu_ssl_ca_certs=
+
+# The RabbitMQ broker address where a single node is used
+# (string value)
+#rabbit_host=localhost
+
+# The RabbitMQ broker port where a single node is used
+# (integer value)
+#rabbit_port=5672
+
+# RabbitMQ HA cluster host:port pairs (list value)
+#rabbit_hosts=$rabbit_host:$rabbit_port
+
+# connect over SSL for RabbitMQ (boolean value)
+#rabbit_use_ssl=false
+
+# the RabbitMQ userid (string value)
+#rabbit_userid=guest
+
+# the RabbitMQ password (string value)
+#rabbit_password=guest
+
+# the RabbitMQ virtual host (string value)
+#rabbit_virtual_host=/
+
+# how frequently to retry connecting with RabbitMQ (integer
+# value)
+#rabbit_retry_interval=1
+
+# how long to backoff for between retries when connecting to
+# RabbitMQ (integer value)
+#rabbit_retry_backoff=2
+
+# maximum retries with trying to connect to RabbitMQ (the
+# default of 0 implies an infinite retry count) (integer
+# value)
+#rabbit_max_retries=0
+
+# use durable queues in RabbitMQ (boolean value)
+#rabbit_durable_queues=false
+
+# use H/A queues in RabbitMQ (x-ha-policy: all).You need to
+# wipe RabbitMQ database when changing this option. (boolean
+# value)
+#rabbit_ha_queues=false
+
+
+#
+# Options defined in cinder.openstack.common.rpc.impl_qpid
+#
+
+# Qpid broker hostname (string value)
+#qpid_hostname=localhost
+
+# Qpid broker port (string value)
+#qpid_port=5672
+
+# Username for qpid connection (string value)
+#qpid_username=
+
+# Password for qpid connection (string value)
+#qpid_password=
+
+# Space separated list of SASL mechanisms to use for auth
+# (string value)
+#qpid_sasl_mechanisms=
+
+# Automatically reconnect (boolean value)
+#qpid_reconnect=true
+
+# Reconnection timeout in seconds (integer value)
+#qpid_reconnect_timeout=0
+
+# Max reconnections before giving up (integer value)
+#qpid_reconnect_limit=0
+
+# Minimum seconds between reconnection attempts (integer
+# value)
+#qpid_reconnect_interval_min=0
+
+# Maximum seconds between reconnection attempts (integer
+# value)
+#qpid_reconnect_interval_max=0
+
+# Equivalent to setting max and min to the same value (integer
+# value)
+#qpid_reconnect_interval=0
+
+# Seconds between connection keepalive heartbeats (integer
+# value)
+#qpid_heartbeat=60
+
+# Transport to use, either 'tcp' or 'ssl' (string value)
+#qpid_protocol=tcp
+
+# Disable Nagle algorithm (boolean value)
+#qpid_tcp_nodelay=true
+
+
+#
+# Options defined in cinder.openstack.common.rpc.impl_zmq
+#
+
+# ZeroMQ bind address. Should be a wildcard (*), an ethernet
+# interface, or IP. The "host" option should point or resolve
+# to this address. (string value)
+#rpc_zmq_bind_address=*
+
+# MatchMaker driver (string value)
+#rpc_zmq_matchmaker=cinder.openstack.common.rpc.matchmaker.MatchMakerLocalhost
+
+# ZeroMQ receiver listening port (integer value)
+#rpc_zmq_port=9501
+
+# Number of ZeroMQ contexts, defaults to 1 (integer value)
+#rpc_zmq_contexts=1
+
+# Directory for holding IPC sockets (string value)
+#rpc_zmq_ipc_dir=/var/run/openstack
+
+# Name of this node. Must be a valid hostname, FQDN, or IP
+# address. Must match "host" option, if running Nova. (string
+# value)
+#rpc_zmq_host=cinder
+
+
+#
+# Options defined in cinder.openstack.common.rpc.matchmaker
+#
+
+# Matchmaker ring file (JSON) (string value)
+#matchmaker_ringfile=/etc/nova/matchmaker_ring.json
+
+
+#
+# Options defined in cinder.scheduler.driver
+#
+
+# The scheduler host manager class to use (string value)
+#scheduler_host_manager=cinder.scheduler.host_manager.HostManager
+
+
+#
+# Options defined in cinder.scheduler.host_manager
+#
+
+# Which filter class names to use for filtering hosts when not
+# specified in the request. (list value)
+#scheduler_default_filters=AvailabilityZoneFilter,CapacityFilter,CapabilitiesFilter
+
+# Which weigher class names to use for weighing hosts. (list
+# value)
+#scheduler_default_weighers=CapacityWeigher
+
+
+#
+# Options defined in cinder.scheduler.manager
+#
+
+# Default scheduler driver to use (string value)
+#scheduler_driver=cinder.scheduler.simple.SimpleScheduler
+
+
+#
+# Options defined in cinder.scheduler.scheduler_options
+#
+
+# Absolute path to scheduler configuration JSON file. (string
+# value)
+#scheduler_json_config_location=
+
+
+#
+# Options defined in cinder.scheduler.simple
+#
+
+# maximum number of volume gigabytes to allow per host
+# (integer value)
+#max_gigabytes=10000
+
+
+#
+# Options defined in cinder.scheduler.weights.capacity
+#
+
+# Multiplier used for weighing volume capacity. Negative
+# numbers mean to stack vs spread. (floating point value)
+#capacity_weight_multiplier=1.0
+
+
+#
+# Options defined in cinder.volume.api
+#
+
+# Create volume from snapshot at the host where snapshot
+# resides (boolean value)
+#snapshot_same_host=true
+
+
+#
+# Options defined in cinder.volume.driver
+#
+
+# number of times to attempt to run flakey shell commands
+# (integer value)
+#num_shell_tries=3
+
+# The percentage of backend capacity is reserved (integer
+# value)
+#reserved_percentage=0
+
+# number of times to rescan iSCSI target to find volume
+# (integer value)
+#num_iscsi_scan_tries=3
+
+# Number of iscsi target ids per host (integer value)
+#iscsi_num_targets=100
+
+# prefix for iscsi volumes (string value)
+#iscsi_target_prefix=iqn.2010-10.org.openstack:
+
+# The port that the iSCSI daemon is listening on (string
+# value)
+#iscsi_ip_address=$my_ip
+
+# The port that the iSCSI daemon is listening on (integer
+# value)
+#iscsi_port=3260
+
+# Optional override to the capacity based volume backend name
+#
+#volume_backend_name=LVM_iSCSI_unique1
+
+#
+# Options defined in cinder.volume.drivers.glusterfs
+#
+
+# File with the list of available gluster shares (string
+# value)
+#glusterfs_shares_config=<None>
+
+# Base dir where gluster expected to be mounted (string value)
+#glusterfs_mount_point_base=$state_path/mnt
+
+# Use du or df for free space calculation (string value)
+#glusterfs_disk_util=df
+
+# Create volumes as sparsed files which take no space.If set
+# to False volume is created as regular file.In such case
+# volume creation takes a lot of time. (boolean value)
+#glusterfs_sparsed_volumes=true
+
+
+#
+# Options defined in cinder.volume.drivers.lvm
+#
+
+# Name for the VG that will contain exported volumes (string
+# value)
+#volume_group=cinder-volumes
+
+# Method used to wipe old volumes (valid options are: none,
+# zero, shred) (string value)
+#volume_clear=zero
+
+# Size in MiB to wipe at start of old volumes. 0 => all
+# (integer value)
+#volume_clear_size=0
+
+# Size of thin provisioning pool (None uses entire cinder VG)
+# (string value)
+#pool_size=<None>
+
+# If set, create lvms with multiple mirrors. Note that this
+# requires lvm_mirrors + 2 pvs with available space (integer
+# value)
+#lvm_mirrors=0
+
+
+#
+# Options defined in cinder.volume.drivers.netapp
+#
+
+# URL of the WSDL file for the DFM server (string value)
+#netapp_wsdl_url=<None>
+
+# User name for the DFM server (string value)
+#netapp_login=<None>
+
+# Password for the DFM server (string value)
+#netapp_password=<None>
+
+# Hostname for the DFM server (string value)
+#netapp_server_hostname=<None>
+
+# Port number for the DFM server (integer value)
+#netapp_server_port=8088
+
+# Storage service to use for provisioning (when
+# volume_type=None) (string value)
+#netapp_storage_service=<None>
+
+# Prefix of storage service name to use for provisioning
+# (volume_type name will be appended) (string value)
+#netapp_storage_service_prefix=<None>
+
+# Vfiler to use for provisioning (string value)
+#netapp_vfiler=<None>
+
+
+#
+# Options defined in cinder.volume.drivers.netapp_nfs
+#
+
+# Does snapshot creation call returns immediately (integer
+# value)
+#synchronous_snapshot_create=0
+
+# URL of the WSDL file for the DFM server (string value)
+#netapp_wsdl_url=<None>
+
+# User name for the DFM server (string value)
+#netapp_login=<None>
+
+# Password for the DFM server (string value)
+#netapp_password=<None>
+
+# Hostname for the DFM server (string value)
+#netapp_server_hostname=<None>
+
+# Port number for the DFM server (integer value)
+#netapp_server_port=8088
+
+# Storage service to use for provisioning (when
+# volume_type=None) (string value)
+#netapp_storage_service=<None>
+
+# Prefix of storage service name to use for provisioning
+# (volume_type name will be appended) (string value)
+#netapp_storage_service_prefix=<None>
+
+# Vfiler to use for provisioning (string value)
+#netapp_vfiler=<None>
+
+
+#
+# Options defined in cinder.volume.drivers.nexenta.volume
+#
+
+# IP address of Nexenta SA (string value)
+#nexenta_host=
+
+# HTTP port to connect to Nexenta REST API server (integer
+# value)
+#nexenta_rest_port=2000
+
+# Use http or https for REST connection (default auto) (string
+# value)
+#nexenta_rest_protocol=auto
+
+# User name to connect to Nexenta SA (string value)
+#nexenta_user=admin
+
+# Password to connect to Nexenta SA (string value)
+#nexenta_password=nexenta
+
+# Nexenta target portal port (integer value)
+#nexenta_iscsi_target_portal_port=3260
+
+# pool on SA that will hold all volumes (string value)
+#nexenta_volume=cinder
+
+# IQN prefix for iSCSI targets (string value)
+#nexenta_target_prefix=iqn.1986-03.com.sun:02:cinder-
+
+# prefix for iSCSI target groups on SA (string value)
+#nexenta_target_group_prefix=cinder/
+
+# block size for volumes (blank=default,8KB) (string value)
+#nexenta_blocksize=
+
+# flag to create sparse volumes (boolean value)
+#nexenta_sparse=false
+
+
+#
+# Options defined in cinder.volume.drivers.nfs
+#
+
+# File with the list of available nfs shares (string value)
+#nfs_shares_config=<None>
+
+# Base dir where nfs expected to be mounted (string value)
+#nfs_mount_point_base=$state_path/mnt
+
+# Use du or df for free space calculation (string value)
+#nfs_disk_util=df
+
+# Create volumes as sparsed files which take no space.If set
+# to False volume is created as regular file.In such case
+# volume creation takes a lot of time. (boolean value)
+#nfs_sparsed_volumes=true
+
+# Mount options passed to the nfs client (string value)
+# The value set here is passed directly to the -o flag
+# of the mount command. See the nfs man page for details.
+#nfs_mount_options=None
+
+
+#
+# Options defined in cinder.volume.drivers.rbd
+#
+
+# the RADOS pool in which rbd volumes are stored (string
+# value)
+#rbd_pool=rbd
+
+# the RADOS client name for accessing rbd volumes (string
+# value)
+#rbd_user=<None>
+
+# the libvirt uuid of the secret for the rbd_uservolumes
+# (string value)
+#rbd_secret_uuid=<None>
+
+# where to store temporary image files if the volume driver
+# does not write them directly to the volume (string value)
+#volume_tmp_dir=<None>
+
+
+#
+# Options defined in cinder.volume.drivers.san.san
+#
+
+# Use thin provisioning for SAN volumes? (boolean value)
+#san_thin_provision=true
+
+# IP address of SAN controller (string value)
+#san_ip=
+
+# Username for SAN controller (string value)
+#san_login=admin
+
+# Password for SAN controller (string value)
+#san_password=
+
+# Filename of private key to use for SSH authentication
+# (string value)
+#san_private_key=
+
+# Cluster name to use for creating volumes (string value)
+#san_clustername=
+
+# SSH port to use with SAN (integer value)
+#san_ssh_port=22
+
+# Execute commands locally instead of over SSH; use if the
+# volume service is running on the SAN device (boolean value)
+#san_is_local=false
+
+# SSH connection timeout in seconds (integer value)
+#ssh_conn_timeout=30
+
+# Minimum ssh connections in the pool (integer value)
+#ssh_min_pool_conn=1
+
+# Maximum ssh connections in the pool (integer value)
+#ssh_max_pool_conn=5
+
+
+#
+# Options defined in cinder.volume.drivers.san.solaris
+#
+
+# The ZFS path under which to create zvols for volumes.
+# (string value)
+#san_zfs_volume_base=rpool/
+
+
+#
+# Options defined in cinder.volume.drivers.scality
+#
+
+# Path or URL to Scality SOFS configuration file (string
+# value)
+#scality_sofs_config=<None>
+
+# Base dir where Scality SOFS shall be mounted (string value)
+#scality_sofs_mount_point=$state_path/scality
+
+# Path from Scality SOFS root to volume dir (string value)
+#scality_sofs_volume_dir=cinder/volumes
+
+
+#
+# Options defined in cinder.volume.drivers.solidfire
+#
+
+# Set 512 byte emulation on volume creation;  (boolean value)
+#sf_emulate_512=true
+
+# Allow tenants to specify QOS on create (boolean value)
+#sf_allow_tenant_qos=false
+
+
+#
+# Options defined in cinder.volume.drivers.storwize_svc
+#
+
+# Storage system storage pool for volumes (string value)
+#storwize_svc_volpool_name=volpool
+
+# Storage system space-efficiency parameter for volumes
+# (string value)
+#storwize_svc_vol_rsize=2%
+
+# Storage system threshold for volume capacity warnings
+# (string value)
+#storwize_svc_vol_warning=0
+
+# Storage system autoexpand parameter for volumes (True/False)
+# (boolean value)
+#storwize_svc_vol_autoexpand=true
+
+# Storage system grain size parameter for volumes
+# (32/64/128/256) (string value)
+#storwize_svc_vol_grainsize=256
+
+# Storage system compression option for volumes (boolean
+# value)
+#storwize_svc_vol_compression=false
+
+# Enable Easy Tier for volumes (boolean value)
+#storwize_svc_vol_easytier=true
+
+# Maximum number of seconds to wait for FlashCopy to be
+# prepared. Maximum value is 600 seconds (10 minutes). (string
+# value)
+#storwize_svc_flashcopy_timeout=120
+
+
+#
+# Options defined in cinder.volume.drivers.windows
+#
+
+# Path to store VHD backed volumes (string value)
+#windows_iscsi_lun_path=C:\iSCSIVirtualDisks
+
+
+#
+# Options defined in cinder.volume.drivers.xenapi.sm
+#
+
+# NFS server to be used by XenAPINFSDriver (string value)
+#xenapi_nfs_server=<None>
+
+# Path of exported NFS, used by XenAPINFSDriver (string value)
+#xenapi_nfs_serverpath=<None>
+
+# URL for XenAPI connection (string value)
+#xenapi_connection_url=<None>
+
+# Username for XenAPI connection (string value)
+#xenapi_connection_username=root
+
+# Password for XenAPI connection (string value)
+#xenapi_connection_password=<None>
+
+
+#
+# Options defined in cinder.volume.drivers.xiv
+#
+
+# Proxy driver (string value)
+#xiv_proxy=xiv_openstack.nova_proxy.XIVNovaProxy
+
+
+#
+# Options defined in cinder.volume.drivers.zadara
+#
+
+# Management IP of Zadara VPSA (string value)
+#zadara_vpsa_ip=<None>
+
+# Zadara VPSA port number (string value)
+#zadara_vpsa_port=<None>
+
+# Use SSL connection (boolean value)
+#zadara_vpsa_use_ssl=false
+
+# User name for the VPSA (string value)
+#zadara_user=<None>
+
+# Password for the VPSA (string value)
+#zadara_password=<None>
+
+# Name of VPSA storage pool for volumes (string value)
+#zadara_vpsa_poolname=<None>
+
+# Default cache policy for volumes (string value)
+#zadara_default_cache_policy=write-through
+
+# Default encryption policy for volumes (string value)
+#zadara_default_encryption=NO
+
+# Default striping mode for volumes (string value)
+#zadara_default_striping_mode=simple
+
+# Default stripe size for volumes (string value)
+#zadara_default_stripesize=64
+
+# Default template for VPSA volume names (string value)
+#zadara_vol_name_template=OS_%s
+
+# Automatically detach from servers on volume delete (boolean
+# value)
+#zadara_vpsa_auto_detach_on_delete=true
+
+# Don't halt on deletion of non-existing volumes (boolean
+# value)
+#zadara_vpsa_allow_nonexistent_delete=true
+
+
+#
+# Options defined in cinder.volume.iscsi
+#
+
+# iscsi target user-land tool to use (string value)
+#iscsi_helper=tgtadm
+
+# Volume configuration file storage directory (string value)
+#volumes_dir=$state_path/volumes
+
+# IET configuration file (string value)
+#iet_conf=/etc/iet/ietd.conf
+
+# Comma-separatd list of initiator IQNs allowed to connect to
+# the iSCSI target. (From Nova compute nodes.) (string value)
+#lio_initiator_iqns=
+
+
+#
+# Options defined in cinder.volume.manager
+#
+
+# Driver to use for volume creation (string value)
+# The local ZFS driver provides direct access to ZFS volumes that it
+# creates. The iSCSI ZFS driver provides the access to local ZFS volumes
+# using iSCSI over loopback and may be more suitable for future use of
+# features such as live migration of Nova instances.
+volume_driver=cinder.volume.drivers.solaris.zfs.ZFSVolumeDriver
+#volume_driver=cinder.volume.drivers.solaris.zfs.ZFSISCSIDriver
+
+
+#
+# Options defined in cinder.volume.drivers.solaris.zfs
+#
+
+# The base dataset for ZFS cinder volumes.
+#zfs_volume_base=rpool/cinder
+
+
+#
+# Multi backend options
+#
+
+# Define the names of the groups for multiple volume backends
+#enabled_backends=fakedriver,lvmdriver
+
+# Define the groups as above
+#[lvmdriver]
+#volume_group=lvm-group-1
+#volume_driver=cinder.volume.drivers.lvm.LVMISCSIDriver
+#volume_backend_name=LVM_iSCSI_unique1
+#[fakedriver]
+#volume_driver=cinder.volume.driver.FakeISCSIDriver
+
+
+# Total option count: 256
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/files/cinder.exec_attr	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,9 @@
+OpenStack Block Storage Management:solaris:cmd:RO::\
+/usr/bin/cinder-clear-rabbit-queues:uid=cinder;gid=cinder
+
+OpenStack Block Storage Management:solaris:cmd:RO::\
+/usr/bin/cinder-manage:uid=cinder;gid=cinder
+
+cinder-volume:solaris:cmd:RO::/usr/sbin/itadm:uid=0
+cinder-volume:solaris:cmd:RO::/usr/sbin/stmfadm:euid=0
+cinder-volume:solaris:cmd:RO::/usr/sbin/zfs:privs=sys_config,sys_mount
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/files/cinder.prof_attr	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,15 @@
+OpenStack Block Storage Management:RO::\
+Manage OpenStack Cinder:\
+auths=solaris.admin.edit/etc/cinder/api-paste.ini,\
+solaris.admin.edit/etc/cinder/cinder.conf,\
+solaris.admin.edit/etc/cinder/cinder_emc_config.xml,\
+solaris.admin.edit/etc/cinder/logging.conf,\
+solaris.admin.edit/etc/cinder/policy.json,\
+solaris.smf.manage.cinder,\
+solaris.smf.value.cinder
+
+OpenStack Management:RO:::profiles=OpenStack Block Storage Management
+
+cinder-volume:RO::\
+Do not assign to users. \
+Commands required for application/openstack/cinder/cinder-volume:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/files/cinder.user_attr	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,1 @@
+cinder::RO::profiles=cinder-volume
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/files/solaris/zfs.py	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,529 @@
+# vim: tabstop=4 shiftwidth=4 softtabstop=4
+# Copyright (c) 2012 OpenStack LLC.
+# All Rights Reserved.
+#
+# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+#
+#    Licensed 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.
+"""
+Drivers for Solaris ZFS operations in local and iSCSI modes
+"""
+
+import abc
+import os
+
+from oslo.config import cfg
+
+from cinder import exception
+from cinder import flags
+from cinder.image import image_utils
+from cinder.openstack.common import log as logging
+from cinder.volume import driver
+
+FLAGS = flags.FLAGS
+LOG = logging.getLogger(__name__)
+
+solaris_zfs_opts = [
+    cfg.StrOpt('zfs_volume_base',
+               default='rpool/cinder',
+               help='The base dataset for ZFS volumes.'), ]
+
+FLAGS.register_opts(solaris_zfs_opts)
+
+
+class ZFSVolumeDriver(driver.VolumeDriver):
+    """Local ZFS volume operations."""
+    protocol = 'local'
+
+    def __init__(self, *args, **kwargs):
+        super(ZFSVolumeDriver, self).__init__(*args, **kwargs)
+        self.configuration.append_config_values(solaris_zfs_opts)
+
+    def check_for_setup_error(self):
+        """Check the setup error."""
+        pass
+
+    def create_volume(self, volume):
+        """Create a volume."""
+        size = '%sG' % volume['size']
+        zfs_volume = self._get_zfs_volume_name(volume)
+
+        # Create a ZFS volume
+        cmd = ['/usr/sbin/zfs', 'create', '-V', size, zfs_volume]
+        self._execute(*cmd)
+        LOG.debug(_("Created ZFS volume '%s'") % volume['name'])
+
+    def create_volume_from_snapshot(self, volume, snapshot):
+        """Create a cloned volume from a snapshot."""
+        if volume['size'] != snapshot['volume_size']:
+            exception_message = (_("Could not create volume '%s' because "
+                                   "its volume size of '%s' is different "
+                                   "from that of the snapshot, '%s'.")
+                                 % (volume['name'], volume['size'],
+                                    snapshot['volume_size']))
+            raise exception.VolumeBackendAPIException(data=exception_message)
+
+        # Create a ZFS clone
+        zfs_snapshot = self._get_zfs_snap_name(snapshot)
+        zfs_volume = self._get_zfs_volume_name(volume)
+        cmd = ['/usr/sbin/zfs', 'clone', zfs_snapshot, zfs_volume]
+        self._execute(*cmd)
+
+        LOG.debug(_("Created cloned volume '%s'") % volume['name'])
+
+    def create_cloned_volume(self, volume, src_vref):
+        """Create a clone of the specified volume."""
+        if volume['size'] != src_vref['size']:
+            exception_message = (_("Could not clone volume '%s' because "
+                                   "its volume size of '%s' is different "
+                                   "from that of the source volume, '%s'.")
+                                 % (volume['name'], volume['size'],
+                                    src_vref['size']))
+            raise exception.VolumeBackendAPIException(data=exception_message)
+
+        src_volume_name = src_vref['name']
+        volume_name = volume['name']
+        tmp_snapshot = {'volume_name': src_volume_name,
+                        'name': 'tmp-snapshot-%s' % volume['id']}
+        self.create_snapshot(tmp_snapshot)
+
+        # Create a ZFS clone
+        zfs_snapshot = self._get_zfs_snap_name(tmp_snapshot)
+        zfs_volume = self._get_zfs_volume_name(volume)
+        cmd = ['/usr/sbin/zfs', 'clone', zfs_snapshot, zfs_volume]
+        self._execute(*cmd)
+
+        LOG.debug(_("Created cloned volume '%s' from source volume '%s'")
+                  % (volume_name, src_volume_name))
+
+    def delete_volume(self, volume):
+        """Delete a volume.
+
+        Firstly, the volume should be checked if it is a cloned one. If yes,
+        its parent snapshot with prefix 'tmp-snapshot-' should be deleted as
+        well after it is removed.
+        """
+        zvol = self._get_zvol_path(volume)
+        if not os.path.exists(zvol):
+            LOG.debug(_("The volume path '%s' doesn't exist") % zvol)
+            return
+
+        zfs_volume = self._get_zfs_volume_name(volume)
+        origin_snapshot = self._get_zfs_property('origin', zfs_volume)
+        tmp_cloned_vol = False
+
+        # Check if it is the temporary snapshot created for the cloned volume
+        if origin_snapshot.startswith(self.configuration.zfs_volume_base):
+            prop_type = self._get_zfs_property('type', origin_snapshot)
+            tmp_snap_prefix = 'tmp-snapshot-%s' % volume['id']
+            if prop_type == 'snapshot' and tmp_snap_prefix in origin_snapshot:
+                tmp_cloned_vol = True
+
+        cmd = ['/usr/sbin/zfs', 'destroy', zfs_volume]
+        self._execute(*cmd)
+        LOG.debug(_("Deleted volume '%s'") % volume['name'])
+
+        if tmp_cloned_vol:
+            self._execute('/usr/sbin/zfs', 'destroy', origin_snapshot)
+            LOG.debug(_("Deleted parent snapshot '%s' of volume '%s'")
+                      % (origin_snapshot, volume['name']))
+
+    def create_snapshot(self, snapshot):
+        """Create a snapshot."""
+        cmd = ['/usr/sbin/zfs', 'snapshot', self._get_zfs_snap_name(snapshot)]
+        self._execute(*cmd)
+
+        LOG.debug(_("Created snapshot '%s'") % snapshot['name'])
+
+    def delete_snapshot(self, snapshot):
+        """Delete a snapshot."""
+        cmd = ['/usr/sbin/zfs', 'destroy', self._get_zfs_snap_name(snapshot)]
+        self._execute(*cmd)
+
+        LOG.debug(_("Deleted snapshot '%s'") % snapshot['name'])
+
+    def ensure_export(self, context, volume):
+        """Synchronously recreate an export for a logical volume."""
+        pass
+
+    def create_export(self, context, volume):
+        """Export the volume."""
+        pass
+
+    def remove_export(self, context, volume):
+        """Remove an export for a volume."""
+        pass
+
+    def initialize_connection(self, volume, connector):
+        """Initialize the connection and returns connection info."""
+        volume_path = '%s/volume-%s' % (self.configuration.zfs_volume_base,
+                                        volume['id'])
+        return {
+            'driver_volume_type': 'local',
+            'volume_path': volume_path
+        }
+
+    def terminate_connection(self, volume, connector, **kwargs):
+        """Disconnection from the connector."""
+        pass
+
+    def attach_volume(self, context, volume_id, instance_uuid, mountpoint):
+        """ Callback for volume attached to instance."""
+        pass
+
+    def detach_volume(self, context, volume_id):
+        """ Callback for volume detached."""
+        pass
+
+    def get_volume_stats(self, refresh=False):
+        """Get volume status."""
+
+        if refresh:
+            self._update_volume_stats()
+
+        return self._stats
+
+    def copy_image_to_volume(self, context, volume, image_service, image_id):
+        """Fetch the image from image_service and write it to the volume."""
+        image_utils.fetch_to_raw(context,
+                                 image_service,
+                                 image_id,
+                                 self.local_path(volume))
+
+    def copy_volume_to_image(self, context, volume, image_service, image_meta):
+        """Copy the volume to the specified image."""
+        image_utils.upload_volume(context,
+                                  image_service,
+                                  image_meta,
+                                  self.local_path(volume))
+
+    def _get_zfs_property(self, prop, vol_snap):
+        """Get the value of property for the volume or snapshot."""
+        (out, _err) = self._execute('/usr/sbin/zfs', 'get', '-H', '-o',
+                                    'value', prop, vol_snap)
+        return out.rstrip()
+
+    def _get_zfs_snap_name(self, snapshot):
+        """Get the snapshot path."""
+        return "%s/%[email protected]%s" % (self.configuration.zfs_volume_base,
+                             snapshot['volume_name'], snapshot['name'])
+
+    def _get_zfs_volume_name(self, volume):
+        """Add the pool name to get the ZFS volume."""
+        return "%s/%s" % (self.configuration.zfs_volume_base,
+                          volume['name'])
+
+    def _get_zpool_property(self, prop):
+        """Get the value of property from the zpool."""
+        zpool = self.configuration.zfs_volume_base.split('/')[0]
+        try:
+            value = None
+            (out, _err) = self._execute('/usr/sbin/zpool', 'get', prop, zpool)
+        except exception.ProcessExecutionError as err:
+            LOG.error(_("Failed to get property '%s': %s")
+                      % (prop, err.stderr))
+            return value
+
+        zpool_prop = out.splitlines()[1].split()
+        if zpool_prop[1] == prop:
+            value = zpool_prop[2]
+
+        return value
+
+    def _get_zvol_path(self, volume):
+        """Get the ZFS volume path."""
+        return "/dev/zvol/rdsk/%s" % self._get_zfs_volume_name(volume)
+
+    def _update_volume_stats(self):
+        """Retrieve volume status info."""
+
+        LOG.debug(_("Updating volume status"))
+        stats = {}
+        backend_name = self.configuration.safe_get('volume_backend_name')
+        stats["volume_backend_name"] = backend_name or self.__class__.__name__
+        stats["storage_protocol"] = self.protocol
+        stats["driver_version"] = '1.0'
+        stats["vendor_name"] = 'Oracle'
+        stats['QoS_support'] = False
+
+        total = self._get_zpool_property("size")
+        free = self._get_zpool_property("free")
+        if total is not None:
+            stats['total_capacity_gb'] = float(total.split('G')[0])
+        else:
+            stats['total_capacity_gb'] = 0
+        if free is not None:
+            stats['free_capacity_gb'] = float(free.split('G')[0])
+        else:
+            stats['free_capacity_gb'] = 0
+        stats['reserved_percentage'] = self.configuration.reserved_percentage
+
+        self._stats = stats
+
+
+class STMFDriver(ZFSVolumeDriver):
+    """Abstract base class for common COMSTAR operations."""
+    __metaclass__ = abc.ABCMeta
+
+    def __init__(self, *args, **kwargs):
+        super(STMFDriver, self).__init__(*args, **kwargs)
+
+    def _check_target(self, target, protocol):
+        """Verify if the target exists."""
+        (out, _err) = self._execute('/usr/sbin/stmfadm', 'list-target')
+
+        for line in [l.strip() for l in out.splitlines()]:
+            if line.startswith("Target:"):
+                if target == line.split()[-1]:
+                    break
+        else:
+            LOG.debug(_("The target '%s' doesn't exist") % target)
+            return False
+
+        # Verify if the target protocol is iSCSI.
+        (out, _err) = self._execute('/usr/sbin/stmfadm', 'list-target',
+                                    '-v', target)
+
+        for line in [l.strip() for l in out.splitlines()]:
+            if line.startswith("Target:"):
+                tmp_target = line.split()[-1]
+            if line.startswith("Operational"):
+                status = line.split()[-1]
+            if line.startswith("Protocol"):
+                tmp_protocol = line.split()[-1]
+                break
+
+        return (tmp_target == target and status == 'Online' and
+                tmp_protocol == protocol)
+
+    def _check_tg(self, tg):
+        """Check if the target group exists."""
+        (out, _err) = self._execute('/usr/sbin/stmfadm', 'list-tg')
+        found = False
+
+        for line in [l.strip() for l in out.splitlines()]:
+            if line.startswith("Target"):
+                if tg == line.split()[-1]:
+                    found = True
+                    break
+        else:
+            LOG.debug(_("The target group '%s' doesn't exist") % tg)
+
+        return found
+
+    def _get_luid(self, volume):
+        """Get the LU corresponding to the volume."""
+        zvol = self._get_zvol_path(volume)
+
+        (out, _err) = self._execute('/usr/sbin/stmfadm', 'list-lu', '-v')
+        luid = None
+
+        for line in [l.strip() for l in out.splitlines()]:
+            if line.startswith("LU Name:"):
+                luid = line.split()[-1]
+            if line.startswith("Alias") and line.split()[-1] == zvol:
+                break
+        else:
+            luid = None
+
+        if luid is not None:
+            LOG.debug(_("Got the LU '%s'") % luid)
+        else:
+            LOG.debug(_("Failed to get LU for volume '%s'")
+                      % volume['name'])
+        return luid
+
+    def _get_view_and_lun(self, lu):
+        """Check the view entry of the LU and then get the lun and view."""
+        view_and_lun = {}
+        view_and_lun['valid_value'] = False
+        try:
+            (out, _err) = self._execute('/usr/sbin/stmfadm', 'list-view',
+                                        '-l', lu)
+        except exception.ProcessExecutionError as error:
+            if 'no views found' in error.stderr:
+                LOG.debug(_("No view is found for LU '%s'") % lu)
+                return view_and_lun
+            else:
+                raise
+
+        for line in [l.strip() for l in out.splitlines()]:
+            if line.startswith("View Entry:"):
+                view_and_lun['view'] = line.split()[-1]
+                view_and_lun['valid_value'] = True
+            if line.startswith("LUN"):
+                view_and_lun['lun'] = line.split()[-1]
+
+        if view_and_lun['lun'] == 'Auto':
+            view_and_lun['lun'] = 0
+
+        LOG.debug(_("The view_entry and LUN of LU '%s' are '%s' and '%s'.")
+                  % (lu, view_and_lun['view'], view_and_lun['lun']))
+
+        return view_and_lun
+
+
+class ZFSISCSIDriver(STMFDriver, driver.ISCSIDriver):
+    """ZFS volume operations in iSCSI mode."""
+    protocol = 'iSCSI'
+
+    def __init__(self, *args, **kwargs):
+        super(ZFSISCSIDriver, self).__init__(*args, **kwargs)
+
+    def create_export(self, context, volume):
+        """Export the volume."""
+        zvol = self._get_zvol_path(volume)
+
+        # Create a Logical Unit (LU)
+        self._execute('/usr/sbin/stmfadm', 'create-lu', zvol)
+        luid = self._get_luid(volume)
+        if not luid:
+            msg = (_("Failed to create LU for volume '%s'")
+                   % volume['name'])
+            raise exception.VolumeBackendAPIException(data=msg)
+
+        # Create a target group and a target belonging to the target group
+        target_group = 'tg-%s' % volume['name']
+        self._execute('/usr/sbin/stmfadm', 'create-tg', target_group)
+
+        target_name = '%s%s' % (self.configuration.iscsi_target_prefix,
+                                volume['name'])
+        self._execute('/usr/sbin/stmfadm', 'add-tg-member', '-g',
+                      target_group, target_name)
+
+        self._execute('/usr/sbin/itadm', 'create-target', '-n', target_name)
+        assert self._check_target(target_name, 'iSCSI')
+
+        # Add a logical unit view entry
+        if luid is not None:
+            self._execute('/usr/sbin/stmfadm', 'add-view', '-t',
+                          target_group, luid)
+
+    def remove_export(self, context, volume):
+        """Remove an export for a volume.
+
+        All of the related elements about the volume, including the
+        target, target group, view entry and lu, are deleted.
+        """
+        luid = self._get_luid(volume)
+        target_group = 'tg-%s' % volume['name']
+        target_name = '%s%s' % (self.configuration.iscsi_target_prefix,
+                                volume['name'])
+
+        # Remove the view entry
+        if luid is not None:
+            view_lun = self._get_view_and_lun(luid)
+            if view_lun['valid_value']:
+                self._execute('/usr/sbin/stmfadm', 'remove-view', '-l',
+                              luid, view_lun['view'])
+
+        # Remove the target and its target group
+        if self._check_target(target_name, 'iSCSI'):
+            self._execute('/usr/sbin/stmfadm', 'offline-target', target_name)
+            self._execute('/usr/sbin/itadm', 'delete-target', '-f',
+                          target_name)
+
+        if self._check_tg(target_group):
+            self._execute('/usr/sbin/stmfadm', 'delete-tg', target_group)
+
+        # Remove the LU
+        if luid is not None:
+            self._execute('/usr/sbin/stmfadm', 'delete-lu', luid)
+
+    def _get_iscsi_properties(self, volume):
+        """Get iSCSI configuration
+
+        Now we use the discovery address as the default approach to add
+        objects into the initiator. A discovery address is an IP address:port
+        combination used in a SendTargets discovery session in the initiator.
+
+        :target_discovered:    boolean indicating whether discovery was used
+        :target_iqn:           the IQN of the iSCSI target
+        :target_portal:        the portal of the iSCSI target
+        :target_lun:           the lun of the iSCSI target
+        :volume_id:            the id of the volume
+
+        :auth_method:, :auth_username:, :auth_password:
+            the authentication details. Right now, either auth_method is not
+            present meaning no authentication, or auth_method == `CHAP`
+            meaning use CHAP with the specified credentials.
+        """
+        luid = self._get_luid(volume)
+        if not luid:
+            msg = (_("Failed to get LU for volume '%s'") % volume['name'])
+            raise exception.VolumeBackendAPIException(data=msg)
+
+        target_name = '%s%s' % (self.configuration.iscsi_target_prefix,
+                                volume['name'])
+        properties = {}
+
+        properties['target_discovered'] = True
+        properties['target_iqn'] = target_name
+        properties['target_portal'] = ('%s:%d' %
+                                       (self.configuration.iscsi_ip_address,
+                                       self.configuration.iscsi_port))
+        view_lun = self._get_view_and_lun(luid)
+        if view_lun['valid_value']:
+            properties['target_lun'] = view_lun['lun']
+        properties['volume_id'] = volume['id']
+
+        auth = volume['provider_auth']
+        if auth:
+            (auth_method, auth_username, auth_secret) = auth.split()
+            properties['auth_method'] = auth_method
+            properties['auth_username'] = auth_username
+            properties['auth_password'] = auth_secret
+
+        return properties
+
+    def initialize_connection(self, volume, connector):
+        """Initialize the connection and returns connection info.
+
+        The iSCSI driver returns a driver_volume_type of 'iscsi'.
+        The format of the driver data is defined in _get_iscsi_properties.
+        Example return value::
+
+        {
+            'driver_volume_type': 'iscsi'
+            'data': {
+                'target_discovered': True,
+                'target_iqn':
+                'iqn.1986-03.com.sun:02:200720c6-9bca-cb8f-c061-d427d7ab978f',
+                'target_portal': '127.0.0.1:3260',
+                'volume_id': 1,
+            }
+        }
+
+        """
+        initiator_name = connector['initiator']
+        volume_name = volume['name']
+        LOG.debug(_('Connecting the initiator %(initiator_name)s '
+                    'for volume %(volume_name)s')
+                  % {'initiator_name': initiator_name,
+                     'volume_name': volume_name})
+        iscsi_properties = self._get_iscsi_properties(volume)
+
+        return {
+            'driver_volume_type': 'iscsi',
+            'data': iscsi_properties
+        }
+
+    def terminate_connection(self, volume, connector, **kwargs):
+        """Disconnection from the connector."""
+        initiator_name = connector['initiator']
+        volume_name = volume['name']
+
+        LOG.debug(_('Disconnecting the initiator %(initiator_name)s '
+                    'for volume %(volume_name)s')
+                  % {'initiator_name': initiator_name,
+                     'volume_name': volume_name})
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/patches/01-noamqplib.patch	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,20 @@
+In-house patch to remove amqplib from Cinder's requirements files as
+an alternate implementation is used on Solaris.
+
+--- cinder-2013.1.4/cinder.egg-info/requires.txt.orig 2013-11-22 07:46:37.051978903 -0700
++++ cinder-2013.1.4/cinder.egg-info/requires.txt        2013-11-22 07:46:45.304481983 -0700
[email protected]@ -1,5 +1,4 @@
+ SQLAlchemy>=0.7.3,<=0.7.9
+-amqplib>=0.6.1
+ anyjson>=0.2.4
+ eventlet>=0.9.17
+ kombu>=1.0.4
+
+--- cinder-2013.1.4/tools/pip-requires.orig       2013-11-22 07:48:29.381781247 -0700
++++ cinder-2013.1.4/tools/pip-requires        2013-11-22 07:48:34.137850426 -0700
[email protected]@ -1,5 +1,4 @@
+ SQLAlchemy>=0.7.3,<=0.7.9
+-amqplib>=0.6.1
+ anyjson>=0.2.4
+ argparse
+ eventlet>=0.9.17
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/patches/02-noparamiko.patch	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,169 @@
+In-house patch for the temporary removal of Paramiko dependency in
+Cinder.  This patch is Solaris-specific and not suitable for upstream
+
+--- cinder-2013.1.4/cinder/utils.py.orig	2013-10-17 11:21:37.000000000 -0700
++++ cinder-2013.1.4/cinder/utils.py	2014-03-08 11:55:09.044072461 -0800
[email protected]@ -27,7 +27,6 @@
+ import inspect
+ import itertools
+ import os
+-import paramiko
+ import pyclbr
+ import random
+ import re
[email protected]@ -233,135 +232,6 @@
+     return out, err
+ 
+ 
+-def ssh_execute(ssh, cmd, process_input=None,
+-                addl_env=None, check_exit_code=True):
+-    LOG.debug(_('Running cmd (SSH): %s'), cmd)
+-    if addl_env:
+-        raise exception.Error(_('Environment not supported over SSH'))
+-
+-    if process_input:
+-        # This is (probably) fixable if we need it...
+-        raise exception.Error(_('process_input not supported over SSH'))
+-
+-    stdin_stream, stdout_stream, stderr_stream = ssh.exec_command(cmd)
+-    channel = stdout_stream.channel
+-
+-    #stdin.write('process_input would go here')
+-    #stdin.flush()
+-
+-    # NOTE(justinsb): This seems suspicious...
+-    # ...other SSH clients have buffering issues with this approach
+-    stdout = stdout_stream.read()
+-    stderr = stderr_stream.read()
+-    stdin_stream.close()
+-    stdout_stream.close()
+-    stderr_stream.close()
+-
+-    exit_status = channel.recv_exit_status()
+-
+-    # exit_status == -1 if no exit code was returned
+-    if exit_status != -1:
+-        LOG.debug(_('Result was %s') % exit_status)
+-        if check_exit_code and exit_status != 0:
+-            raise exception.ProcessExecutionError(exit_code=exit_status,
+-                                                  stdout=stdout,
+-                                                  stderr=stderr,
+-                                                  cmd=cmd)
+-    channel.close()
+-    return (stdout, stderr)
+-
+-
+-def create_channel(client, width, height):
+-    """Invoke an interactive shell session on server."""
+-    channel = client.invoke_shell()
+-    channel.resize_pty(width, height)
+-    return channel
+-
+-
+-class SSHPool(pools.Pool):
+-    """A simple eventlet pool to hold ssh connections."""
+-
+-    def __init__(self, ip, port, conn_timeout, login, password=None,
+-                 privatekey=None, *args, **kwargs):
+-        self.ip = ip
+-        self.port = port
+-        self.login = login
+-        self.password = password
+-        self.conn_timeout = conn_timeout if conn_timeout else None
+-        self.privatekey = privatekey
+-        super(SSHPool, self).__init__(*args, **kwargs)
+-
+-    def create(self):
+-        try:
+-            ssh = paramiko.SSHClient()
+-            ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+-            if self.password:
+-                ssh.connect(self.ip,
+-                            port=self.port,
+-                            username=self.login,
+-                            password=self.password,
+-                            timeout=self.conn_timeout)
+-            elif self.privatekey:
+-                pkfile = os.path.expanduser(self.privatekey)
+-                privatekey = paramiko.RSAKey.from_private_key_file(pkfile)
+-                ssh.connect(self.ip,
+-                            port=self.port,
+-                            username=self.login,
+-                            pkey=privatekey,
+-                            timeout=self.conn_timeout)
+-            else:
+-                msg = _("Specify a password or private_key")
+-                raise exception.CinderException(msg)
+-
+-            # Paramiko by default sets the socket timeout to 0.1 seconds,
+-            # ignoring what we set thru the sshclient. This doesn't help for
+-            # keeping long lived connections. Hence we have to bypass it, by
+-            # overriding it after the transport is initialized. We are setting
+-            # the sockettimeout to None and setting a keepalive packet so that,
+-            # the server will keep the connection open. All that does is send
+-            # a keepalive packet every ssh_conn_timeout seconds.
+-            if self.conn_timeout:
+-                transport = ssh.get_transport()
+-                transport.sock.settimeout(None)
+-                transport.set_keepalive(self.conn_timeout)
+-            return ssh
+-        except Exception as e:
+-            msg = _("Error connecting via ssh: %s") % e
+-            LOG.error(msg)
+-            raise paramiko.SSHException(msg)
+-
+-    def get(self):
+-        """
+-        Return an item from the pool, when one is available.  This may
+-        cause the calling greenthread to block. Check if a connection is active
+-        before returning it. For dead connections create and return a new
+-        connection.
+-        """
+-        if self.free_items:
+-            conn = self.free_items.popleft()
+-            if conn:
+-                if conn.get_transport().is_active():
+-                    return conn
+-                else:
+-                    conn.close()
+-            return self.create()
+-        if self.current_size < self.max_size:
+-            created = self.create()
+-            self.current_size += 1
+-            return created
+-        return self.channel.get()
+-
+-    def remove(self, ssh):
+-        """Close an ssh client and remove it if in free_items."""
+-        ssh.close()
+-        if ssh in self.free_items:
+-            self.free_items.pop(ssh)
+-        ssh = None
+-
+-        if self.current_size > 0:
+-            self.current_size -= 1
+-
+-
+ def cinderdir():
+     import cinder
+     return os.path.abspath(cinder.__file__).split('cinder/__init__.py')[0]
+--- cinder-2013.1.4/cinder.egg-info/requires.txt.orig	Wed Feb 26 10:56:39 2014
++++ cinder-2013.1.4/cinder.egg-info/requires.txt	Wed Feb 26 10:58:01 2014
[email protected]@ -14,7 +14,6 @@
+ sqlalchemy-migrate>=0.7.2
+ stevedore>=0.8.0
+ suds>=0.4
+-paramiko
+ Babel>=0.9.6
+ iso8601>=0.1.4
+ setuptools_git>=0.4
+--- cinder-2013.1.4/tools/pip-requires.orig	Wed Feb 26 10:56:38 2014
++++ cinder-2013.1.4/tools/pip-requires	Wed Feb 26 10:58:25 2014
[email protected]@ -14,7 +14,6 @@
+ sqlalchemy-migrate>=0.7.2
+ stevedore>=0.8.0
+ suds>=0.4
+-paramiko
+ Babel>=0.9.6
+ iso8601>=0.1.4
+ setuptools_git>=0.4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/patches/03-emc_smis_iscsi.patch	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,61 @@
+In-house patch to adopt EMC driver to use Solaris' iscsiadm(1M) rather
+than that from Linux.  Patch has not yet been submitted upstream.
+
+--- cinder-2013.1.4/cinder/volume/drivers/emc/emc_smis_iscsi.py.~1~	2013-10-17 11:21:37.000000000 -0700
++++ cinder-2013.1.4/cinder/volume/drivers/emc/emc_smis_iscsi.py	2014-03-12 17:07:06.500560732 -0700
[email protected]@ -21,6 +21,7 @@
+ """
+ 
+ import os
++import sys
+ import time
+ 
+ from cinder import exception
[email protected]@ -118,13 +119,41 @@
+ 
+         LOG.warn(_("ISCSI provider_location not stored, using discovery"))
+ 
+-        (out, _err) = self._execute('iscsiadm', '-m', 'discovery',
+-                                    '-t', 'sendtargets', '-p',
+-                                    self.configuration.iscsi_ip_address,
+-                                    run_as_root=True)
+         targets = []
+-        for target in out.splitlines():
+-            targets.append(target)
++
++        if sys.platform == 'sunos5':
++            data = _("Unexpected response while retrieving discovery-address "
++                     "objects for volume '%s'") % volume["name"]
++
++            self._execute('/usr/sbin/iscsiadm', 'add', 'discovery-address',
++                          self.configuration.iscsi_ip_address)
++            (out, _err) = self._execute('/usr/sbin/iscsiadm', 'list',
++                                        'discovery-address', '-v',
++                                        self.configuration.iscsi_ip_address)
++            lines = out.splitlines()
++            if not lines[0].strip().startswith('Discovery Address: '):
++                raise exception.VolumeBackendAPIException(data=data)
++
++            for i in range(1, len(lines), 2):
++                name = lines[i].strip()
++                if not name.startswith('Target name: '):
++                    raise exception.VolumeBackendAPIException(data=data)
++                (_, _, name) = name.split()
++
++                address = lines[i + 1].strip()
++                if not address.startswith('Target address: '):
++                    raise exception.VolumeBackendAPIException(data=data)
++                (_, _, address, tpgt) = address.split()
++                target = address + tpgt + ' ' + name
++                targets.append(target)
++
++        else:
++            (out, _err) = self._execute('iscsiadm', '-m', 'discovery',
++                                        '-t', 'sendtargets', '-p',
++                                        self.configuration.iscsi_ip_address,
++                                        run_as_root=True)
++            for target in out.splitlines():
++                targets.append(target)
+ 
+         return targets
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/cinder/resolve.deps	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,15 @@
+library/python-2/eventlet-26
+library/python-2/ipython-26
+library/python-2/oslo.config-26
+library/python-2/sqlalchemy-26
+library/python-2/sqlalchemy-migrate-26
+library/python/eventlet-26
+library/python/ipython-26
+library/python/oslo.config-26
+library/python/sqlalchemy-26
+library/python/sqlalchemy-migrate-26
+runtime/python-26
+system/core-os
+system/file-system/zfs
+system/storage/iscsi/iscsi-target
+system/storage/scsi-target-mode-framework
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/common/Makefile	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,61 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+#
+include ../../../make-rules/shared-macros.mk
+
+COMPONENT_NAME=		openstack
+COMPONENT_VERSION=	2013.1.4
+COMPONENT_PROJECT_URL=	http://www.openstack.org/
+IPS_COMPONENT_VERSION=  0.$(COMPONENT_VERSION)
+
+include $(WS_TOP)/make-rules/ips.mk
+
+ASLR_MODE = $(ASLR_NOT_APPLICABLE)
+
+# Do not apply the standard license transforms for this component.
+LICENSE_TRANSFORMS =
+
+# common targets
+prep:
+	$(TOUCH) [email protected]
+
+build:		FRC
+	@/bin/true
+
+install:	FRC
+	@/bin/true
+
+download::
+	@echo 'No downloads for this component'
+
+clobber::	clean
+
+clean::
+	$(RM) -r $(SOURCE_DIR)/build
+
+test:		$(NO_TESTS)
+
+BUILD_PKG_DEPENDENCIES =	$(BUILD_TOOLS)
+
+include $(WS_TOP)/make-rules/depend.mk
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/common/openstack.p5m	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,54 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+#
+
+set name=pkg.fmri \
+    value=pkg:/cloud/[email protected]$(IPS_COMPONENT_VERSION),$(BUILD_VERSION)
+set name=pkg.summary value=OpenStack
+set name=pkg.description \
+    value="OpenStack is a cloud operating system that controls large pools of compute, storage, and networking resources throughout a data center, all managed through a dashboard that gives administrators control while empowering their users to provision resources through a web interface."
+set name=pkg.human-version value="Grizzly $(COMPONENT_VERSION)"
+set name=info.classification \
+    value="org.opensolaris.category.2008:Meta Packages/Group Packages" \
+    value="org.opensolaris.category.2008:System/Administration and Configuration" \
+    value="org.opensolaris.category.2008:System/Enterprise Management" \
+    value=org.opensolaris.category.2008:System/Virtualization \
+    value="org.opensolaris.category.2008:Web Services/Application and Web Servers"
+set name=info.upstream value="OpenStack <[email protected]>"
+set name=info.upstream-url value=$(COMPONENT_PROJECT_URL)
+set name=org.opensolaris.arc-caseid value=PSARC/2013/350
+set name=org.opensolaris.consolidation value=$(CONSOLIDATION)
+depend type=group fmri=cloud/openstack/cinder
+depend type=group fmri=cloud/openstack/glance
+depend type=group fmri=cloud/openstack/horizon
+depend type=group fmri=cloud/openstack/keystone
+depend type=group fmri=cloud/openstack/neutron
+depend type=group fmri=cloud/openstack/nova
+depend type=group fmri=library/python/cinderclient
+depend type=group fmri=library/python/glanceclient
+depend type=group fmri=library/python/keystoneclient
+depend type=group fmri=library/python/neutronclient
+depend type=group fmri=library/python/novaclient
+depend type=group fmri=library/python/quantumclient
+depend type=group fmri=library/python/swiftclient
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/common/resolve.deps	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,1 @@
+consolidation/userland/userland-incorporation
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/glance/Makefile	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,68 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+#
+include ../../../make-rules/shared-macros.mk
+
+COMPONENT_NAME=		glance
+COMPONENT_CODENAME=	grizzly
+COMPONENT_VERSION=	2013.1.4
+COMPONENT_SRC=		$(COMPONENT_NAME)-$(COMPONENT_VERSION)
+COMPONENT_ARCHIVE=	$(COMPONENT_SRC).tar.gz
+COMPONENT_ARCHIVE_HASH=	\
+    sha256:dfb8070a12bbf5761db1c55d21db4772fe81ed903d57cf991618e5224cbdcd67
+COMPONENT_ARCHIVE_URL=	http://launchpad.net/$(COMPONENT_NAME)/$(COMPONENT_CODENAME)/$(COMPONENT_VERSION)/+download/$(COMPONENT_ARCHIVE)
+COMPONENT_PROJECT_URL=	http://www.openstack.org/
+COMPONENT_BUGDB=	service/glance
+IPS_COMPONENT_VERSION=	0.$(COMPONENT_VERSION) 
+
+include $(WS_TOP)/make-rules/prep.mk
+include $(WS_TOP)/make-rules/setup.py.mk
+include $(WS_TOP)/make-rules/ips.mk
+
+ASLR_MODE = $(ASLR_NOT_APPLICABLE)
+
+# Since this is an app, and doesn't provide any public library interfaces, we
+# only need to deliver one version.  The manifest is parameterized, though.
+PYTHON_VERSIONS=	2.6
+
+PKG_MACROS +=		PYVER=$(PYTHON_VERSIONS)
+
+# glance-api and glance-registry depend on the glance-db svc so copy
+# the manifests into the proto directory for pkgdepend to find
+COMPONENT_POST_INSTALL_ACTION += \
+	($(MKDIR) $(PROTO_DIR)/lib/svc/manifest/application/openstack; \
+ 	 $(CP) files/glance-db.xml $(PROTO_DIR)/lib/svc/manifest/application/openstack; \
+ 	 $(CP) files/glance-api.xml $(PROTO_DIR)/lib/svc/manifest/application/openstack; \
+ 	 $(CP) files/glance-registry.xml $(PROTO_DIR)/lib/svc/manifest/application/openstack)
+
+# common targets
+build:		$(BUILD_NO_ARCH)
+
+install:	$(INSTALL_NO_ARCH)
+
+test:		$(NO_TESTS)
+
+BUILD_PKG_DEPENDENCIES =	$(BUILD_TOOLS)
+
+include $(WS_TOP)/make-rules/depend.mk
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/glance/files/glance-api	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,27 @@
+#!/usr/bin/python2.6
+
+# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+#
+#    Licensed 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.
+
+import os
+
+import smf_include
+
+
+def start():
+    smf_include.smf_subprocess("/usr/lib/glance/glance-api")
+
+if __name__ == "__main__":
+    os.putenv("LC_ALL", "C")
+    smf_include.smf_main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/glance/files/glance-api.conf	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,356 @@
+[DEFAULT]
+# Show more verbose log output (sets INFO log level output)
+#verbose = False
+
+# Show debugging output in logs (sets DEBUG log level output)
+#debug = False
+
+# Which backend scheme should Glance use by default is not specified
+# in a request to add a new image to Glance? Known schemes are determined
+# by the known_stores option below.
+# Default: 'file'
+default_store = file
+
+# List of which store classes and store class locations are
+# currently known to glance at startup.
+#known_stores = glance.store.filesystem.Store,
+#               glance.store.http.Store,
+#               glance.store.rbd.Store,
+#               glance.store.s3.Store,
+#               glance.store.swift.Store,
+
+
+# Maximum image size (in bytes) that may be uploaded through the
+# Glance API server. Defaults to 1 TB.
+# WARNING: this value should only be increased after careful consideration
+# and must be set to a value under 8 EB (9223372036854775808).
+#image_size_cap = 1099511627776
+
+# Address to bind the API server
+bind_host = 0.0.0.0
+
+# Port the bind the API server to
+bind_port = 9292
+
+# Log to this file. Make sure you do not set the same log
+# file for both the API and registry servers!
+log_file = /var/log/glance/api.log
+
+# Backlog requests when creating socket
+backlog = 4096
+
+# TCP_KEEPIDLE value in seconds when creating socket.
+# Not supported on OS X.
+#tcp_keepidle = 600
+
+# SQLAlchemy connection string for the reference implementation
+# registry server. Any valid SQLAlchemy connection string is fine.
+# See: http://www.sqlalchemy.org/docs/05/reference/sqlalchemy/connections.html#sqlalchemy.create_engine
+sql_connection = sqlite:////var/lib/glance/glance.sqlite
+
+# Period in seconds after which SQLAlchemy should reestablish its connection
+# to the database.
+#
+# MySQL uses a default `wait_timeout` of 8 hours, after which it will drop
+# idle connections. This can result in 'MySQL Gone Away' exceptions. If you
+# notice this, you can lower this value to ensure that SQLAlchemy reconnects
+# before MySQL can drop the connection.
+sql_idle_timeout = 3600
+
+# Number of Glance API worker processes to start.
+# On machines with more than one CPU increasing this value
+# may improve performance (especially if using SSL with
+# compression turned on). It is typically recommended to set
+# this value to the number of CPUs present on your machine.
+workers = 1
+
+# Role used to identify an authenticated user as administrator
+#admin_role = admin
+
+# Allow unauthenticated users to access the API with read-only
+# privileges. This only applies when using ContextMiddleware.
+#allow_anonymous_access = False
+
+# Allow access to version 1 of glance api
+#enable_v1_api = True
+
+# Allow access to version 2 of glance api
+#enable_v2_api = True
+
+# Return the URL that references where the data is stored on
+# the backend storage system.  For example, if using the
+# file system store a URL of 'file:///path/to/image' will
+# be returned to the user in the 'direct_url' meta-data field.
+# The default value is false.
+#show_image_direct_url = False
+
+# ================= Syslog Options ============================
+
+# Send logs to syslog (/dev/log) instead of to file specified
+# by `log_file`
+#use_syslog = False
+
+# Facility to use. If unset defaults to LOG_USER.
+#syslog_log_facility = LOG_LOCAL0
+
+# ================= SSL Options ===============================
+
+# Certificate file to use when starting API server securely
+#cert_file = /path/to/certfile
+
+# Private key file to use when starting API server securely
+#key_file = /path/to/keyfile
+
+# CA certificate file to use to verify connecting clients
+#ca_file = /path/to/cafile
+
+# ================= Security Options ==========================
+
+# AES key for encrypting store 'location' metadata, including
+# -- if used -- Swift or S3 credentials
+# Should be set to a random string of length 16, 24 or 32 bytes
+#metadata_encryption_key = <16, 24 or 32 char registry metadata key>
+
+# ============ Registry Options ===============================
+
+# Address to find the registry server
+registry_host = 0.0.0.0
+
+# Port the registry server is listening on
+registry_port = 9191
+
+# What protocol to use when connecting to the registry server?
+# Set to https for secure HTTP communication
+registry_client_protocol = http
+
+# The path to the key file to use in SSL connections to the
+# registry server, if any. Alternately, you may set the
+# GLANCE_CLIENT_KEY_FILE environ variable to a filepath of the key file
+#registry_client_key_file = /path/to/key/file
+
+# The path to the cert file to use in SSL connections to the
+# registry server, if any. Alternately, you may set the
+# GLANCE_CLIENT_CERT_FILE environ variable to a filepath of the cert file
+#registry_client_cert_file = /path/to/cert/file
+
+# The path to the certifying authority cert file to use in SSL connections
+# to the registry server, if any. Alternately, you may set the
+# GLANCE_CLIENT_CA_FILE environ variable to a filepath of the CA cert file
+#registry_client_ca_file = /path/to/ca/file
+
+# When using SSL in connections to the registry server, do not require
+# validation via a certifying authority. This is the registry's equivalent of
+# specifying --insecure on the command line using glanceclient for the API
+# Default: False
+#registry_client_insecure = False
+
+# The period of time, in seconds, that the API server will wait for a registry
+# request to complete. A value of '0' implies no timeout.
+# Default: 600
+#registry_client_timeout = 600
+
+# Whether to automatically create the database tables.
+# Default: False
+#db_auto_create = False
+
+# ============ Notification System Options =====================
+
+# Notifications can be sent when images are create, updated or deleted.
+# There are three methods of sending notifications, logging (via the
+# log_file directive), rabbit (via a rabbitmq queue), qpid (via a Qpid
+# message queue), or noop (no notifications sent, the default)
+notifier_strategy = noop
+
+# Configuration options if sending notifications via rabbitmq (these are
+# the defaults)
+rabbit_host = localhost
+rabbit_port = 5672
+rabbit_use_ssl = false
+rabbit_userid = guest
+rabbit_password = guest
+rabbit_virtual_host = /
+rabbit_notification_exchange = glance
+rabbit_notification_topic = notifications
+rabbit_durable_queues = False
+
+# Configuration options if sending notifications via Qpid (these are
+# the defaults)
+qpid_notification_exchange = glance
+qpid_notification_topic = notifications
+qpid_host = localhost
+qpid_port = 5672
+qpid_username =
+qpid_password =
+qpid_sasl_mechanisms =
+qpid_reconnect_timeout = 0
+qpid_reconnect_limit = 0
+qpid_reconnect_interval_min = 0
+qpid_reconnect_interval_max = 0
+qpid_reconnect_interval = 0
+qpid_heartbeat = 5
+# Set to 'ssl' to enable SSL
+qpid_protocol = tcp
+qpid_tcp_nodelay = True
+
+# ============ Filesystem Store Options ========================
+
+# Directory that the Filesystem backend store
+# writes image data to
+filesystem_store_datadir = /var/lib/glance/images/
+
+# ============ Swift Store Options =============================
+
+# Version of the authentication service to use
+# Valid versions are '2' for keystone and '1' for swauth and rackspace
+swift_store_auth_version = 2
+
+# Address where the Swift authentication service lives
+# Valid schemes are 'http://' and 'https://'
+# If no scheme specified,  default to 'https://'
+# For swauth, use something like '127.0.0.1:8080/v1.0/'
+swift_store_auth_address = 127.0.0.1:5000/v2.0/
+
+# User to authenticate against the Swift authentication service
+# If you use Swift authentication service, set it to 'account':'user'
+# where 'account' is a Swift storage account and 'user'
+# is a user in that account
+swift_store_user = jdoe:jdoe
+
+# Auth key for the user authenticating against the
+# Swift authentication service
+swift_store_key = a86850deb2742ec3cb41518e26aa2d89
+
+# Container within the account that the account should use
+# for storing images in Swift
+swift_store_container = glance
+
+# Do we create the container if it does not exist?
+swift_store_create_container_on_put = False
+
+# What size, in MB, should Glance start chunking image files
+# and do a large object manifest in Swift? By default, this is
+# the maximum object size in Swift, which is 5GB
+swift_store_large_object_size = 5120
+
+# When doing a large object manifest, what size, in MB, should
+# Glance write chunks to Swift? This amount of data is written
+# to a temporary disk buffer during the process of chunking
+# the image file, and the default is 200MB
+swift_store_large_object_chunk_size = 200
+
+# Whether to use ServiceNET to communicate with the Swift storage servers.
+# (If you aren't RACKSPACE, leave this False!)
+#
+# To use ServiceNET for authentication, prefix hostname of
+# `swift_store_auth_address` with 'snet-'.
+# Ex. https://example.com/v1.0/ -> https://snet-example.com/v1.0/
+swift_enable_snet = False
+
+# If set to True enables multi-tenant storage mode which causes Glance images
+# to be stored in tenant specific Swift accounts.
+#swift_store_multi_tenant = False
+
+# A list of swift ACL strings that will be applied as both read and
+# write ACLs to the containers created by Glance in multi-tenant
+# mode. This grants the specified tenants/users read and write access
+# to all newly created image objects. The standard swift ACL string
+# formats are allowed, including:
+# <tenant_id>:<username>
+# <tenant_name>:<username>
+# *:<username>
+# Multiple ACLs can be combined using a comma separated list, for
+# example: swift_store_admin_tenants = service:glance,*:admin
+#swift_store_admin_tenants =
+
+# The region of the swift endpoint to be used for single tenant. This setting
+# is only necessary if the tenant has multiple swift endpoints.
+#swift_store_region =
+
+# ============ S3 Store Options =============================
+
+# Address where the S3 authentication service lives
+# Valid schemes are 'http://' and 'https://'
+# If no scheme specified,  default to 'http://'
+s3_store_host = 127.0.0.1:8080/v1.0/
+
+# User to authenticate against the S3 authentication service
+s3_store_access_key = <20-char AWS access key>
+
+# Auth key for the user authenticating against the
+# S3 authentication service
+s3_store_secret_key = <40-char AWS secret key>
+
+# Container within the account that the account should use
+# for storing images in S3. Note that S3 has a flat namespace,
+# so you need a unique bucket name for your glance images. An
+# easy way to do this is append your AWS access key to "glance".
+# S3 buckets in AWS *must* be lowercased, so remember to lowercase
+# your AWS access key if you use it in your bucket name below!
+s3_store_bucket = <lowercased 20-char aws access key>glance
+
+# Do we create the bucket if it does not exist?
+s3_store_create_bucket_on_put = False
+
+# When sending images to S3, the data will first be written to a
+# temporary buffer on disk. By default the platform's temporary directory
+# will be used. If required, an alternative directory can be specified here.
+#s3_store_object_buffer_dir = /path/to/dir
+
+# When forming a bucket url, boto will either set the bucket name as the
+# subdomain or as the first token of the path. Amazon's S3 service will
+# accept it as the subdomain, but Swift's S3 middleware requires it be
+# in the path. Set this to 'path' or 'subdomain' - defaults to 'subdomain'.
+#s3_store_bucket_url_format = subdomain
+
+# ============ RBD Store Options =============================
+
+# Ceph configuration file path
+# If using cephx authentication, this file should
+# include a reference to the right keyring
+# in a client.<USER> section
+rbd_store_ceph_conf = /etc/ceph/ceph.conf
+
+# RADOS user to authenticate as (only applicable if using cephx)
+rbd_store_user = glance
+
+# RADOS pool in which images are stored
+rbd_store_pool = images
+
+# Images will be chunked into objects of this size (in megabytes).
+# For best performance, this should be a power of two
+rbd_store_chunk_size = 8
+
+# ============ Delayed Delete Options =============================
+
+# Turn on/off delayed delete
+delayed_delete = False
+
+# Delayed delete time in seconds
+scrub_time = 43200
+
+# Directory that the scrubber will use to remind itself of what to delete
+# Make sure this is also set in glance-scrubber.conf
+scrubber_datadir = /var/lib/glance/scrubber
+
+# =============== Image Cache Options =============================
+
+# Base directory that the Image Cache uses
+image_cache_dir = /var/lib/glance/image-cache/
+
+[keystone_authtoken]
+auth_host = 127.0.0.1
+auth_port = 35357
+auth_protocol = http
+admin_tenant_name = %SERVICE_TENANT_NAME%
+admin_user = %SERVICE_USER%
+admin_password = %SERVICE_PASSWORD%
+
+[paste_deploy]
+# Name of the paste configuration file that defines the available pipelines
+#config_file = glance-api-paste.ini
+
+# Partial name of a pipeline in your paste configuration file with the
+# service name removed. For example, if your paste section name is
+# [pipeline:glance-api-keystone], you would configure the flavor below
+# as 'keystone'.
+#flavor=
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/glance/files/glance-api.xml	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,71 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed 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.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="glance-api">
+
+  <service version="1" type="service"
+    name="application/openstack/glance/glance-api">
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+    <!-- create a dependency on the glance_db service so the glance-api and
+         glance-registry services do not collide when creating the database -->
+    <dependency name='glance_db' grouping='optional_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/application/openstack/glance/glance-db'/>
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/glance-api %m">
+      <method_context>
+        <method_credential user='glance' group='glance' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.glance' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.glance' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Glance API Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          glance-api is a server daemon that serves the Glance API
+        </loctext>
+      </description>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/glance/files/glance-db.xml	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,70 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed 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.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="glance-db">
+
+  <service version="1" type="service"
+    name="application/openstack/glance/glance-db">
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/usr/bin/glance-manage db_sync">
+      <method_context>
+        <method_credential user='glance' group='glance' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":true"/>
+
+    <property_group type="framework" name="startd">
+      <propval type="astring" name="duration" value="transient"/>
+    </property_group>
+
+    <instance name='default' enabled='false'>
+
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.glance'/>
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.glance'/>
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Glance Database Creation Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          glance-db is a transient service to create the Glance database if
+          required.
+        </loctext>
+      </description>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/glance/files/glance-registry	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,27 @@
+#!/usr/bin/python2.6
+
+# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+#
+#    Licensed 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.
+
+import os
+
+import smf_include
+
+
+def start():
+    smf_include.smf_subprocess("/usr/lib/glance/glance-registry")
+
+if __name__ == "__main__":
+    os.putenv("LC_ALL", "C")
+    smf_include.smf_main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/glance/files/glance-registry.xml	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,72 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed 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.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="glance-registry">
+
+  <service version="1" type="service"
+    name="application/openstack/glance/glance-registry">
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+    <!-- create a dependency on the glance_db service so the glance-api and
+         glance-registry services do not collide when creating the database -->
+    <dependency name='glance_db' grouping='optional_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/application/openstack/glance/glance-db'/>
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/glance-registry %m">
+      <method_context>
+        <method_credential user='glance' group='glance' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.glance' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.glance' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Glance Image Metadata Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          glance-registry is a server daemon that serves image metadata through
+          a REST-like API.
+        </loctext>
+      </description>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/glance/files/glance-scrubber	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,27 @@
+#!/usr/bin/python2.6
+
+# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+#
+#    Licensed 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.
+
+import os
+
+import smf_include
+
+
+def start():
+    smf_include.smf_subprocess("/usr/lib/glance/glance-scrubber")
+
+if __name__ == "__main__":
+    os.putenv("LC_ALL", "C")
+    smf_include.smf_main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/glance/files/glance-scrubber.conf	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,40 @@
+[DEFAULT]
+# Show more verbose log output (sets INFO log level output)
+#verbose = False
+
+# Show debugging output in logs (sets DEBUG log level output)
+#debug = False
+
+# Log to this file. Make sure you do not set the same log
+# file for both the API and registry servers!
+log_file = /var/log/glance/scrubber.log
+
+# Send logs to syslog (/dev/log) instead of to file specified by `log_file`
+#use_syslog = False
+
+# Should we run our own loop or rely on cron/scheduler to run us
+daemon = True
+
+# Loop time between checking for new items to schedule for delete
+wakeup_time = 300
+
+# Directory that the scrubber will use to remind itself of what to delete
+# Make sure this is also set in glance-api.conf
+scrubber_datadir = /var/lib/glance/scrubber
+
+# Only one server in your deployment should be designated the cleanup host
+cleanup_scrubber = False
+
+# pending_delete items older than this time are candidates for cleanup
+cleanup_scrubber_time = 86400
+
+# Address to find the registry server for cleanups
+registry_host = 0.0.0.0
+
+# Port the registry server is listening on
+registry_port = 9191
+
+# AES key for encrypting store 'location' metadata, including
+# -- if used -- Swift or S3 credentials
+# Should be set to a random string of length 16, 24 or 32 bytes
+#metadata_encryption_key = <16, 24 or 32 char registry metadata key>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/glance/files/glance-scrubber.xml	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,67 @@
+<?xml version="1.0" ?>
+<!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
+<!--
+ Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+
+ Licensed 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.
+
+ NOTE:  This service manifest is not editable; its contents will
+ be overwritten by package or patch operations, including
+ operating system upgrade.  Make customizations in a different
+ file.
+-->
+<service_bundle type="manifest" name="glance-scrubber">
+
+  <service version="1" type="service"
+    name="application/openstack/glance/glance-scrubber">
+
+    <dependency name='multiuser' grouping='require_all' restart_on='error'
+      type='service'>
+      <service_fmri value='svc:/milestone/multi-user:default' />
+    </dependency>
+
+    <exec_method timeout_seconds="60" type="method" name="start"
+      exec="/lib/svc/method/glance-scrubber %m">
+      <method_context>
+        <method_credential user='glance' group='glance' />
+      </method_context>
+    </exec_method>
+    <exec_method timeout_seconds="60" type="method" name="stop"
+      exec=":kill"/>
+
+    <instance name='default' enabled='false'>
+      <!-- to start/stop/refresh the service -->
+      <property_group name='general' type='framework'>
+        <propval name='action_authorization' type='astring'
+                 value='solaris.smf.manage.glance' />
+        <propval name='value_authorization' type='astring'
+                 value='solaris.smf.value.glance' />
+      </property_group>
+    </instance>
+
+    <template>
+      <common_name>
+        <loctext xml:lang="C">
+          OpenStack Glance Image Scrubbing Service
+        </loctext>
+      </common_name>
+      <description>
+        <loctext xml:lang="C">
+          glance-scrubber is an utility that cleans up images that have been
+          deleted. The mechanics of this differ depending on the backend store
+          and pending_deletion options chosen.
+        </loctext>
+      </description>
+    </template>
+  </service>
+</service_bundle>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/glance/files/glance.auth_attr	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,2 @@
+solaris.smf.manage.glance:RO::Manage OpenStack Glance Service States::
+solaris.smf.value.glance:RO::Change Values of OpenStack Glance Properties::
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/glance/files/glance.exec_attr	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,11 @@
+OpenStack Image Management:solaris:cmd:RO::/usr/bin/glance-cache-manage:\
+uid=glance;gid=glance
+
+OpenStack Image Management:solaris:cmd:RO::/usr/bin/glance-cache-prefetcher:\
+uid=glance;gid=glance
+
+OpenStack Image Management:solaris:cmd:RO::/usr/bin/glance-manage:\
+uid=glance;gid=glance
+
+OpenStack Image Management:solaris:cmd:RO::/usr/bin/glance-replicator:\
+uid=glance;gid=glance
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/glance/files/glance.prof_attr	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,14 @@
+OpenStack Image Management:RO::\
+Manage OpenStack Glance:\
+auths=solaris.admin.edit/etc/glance/api-paste.ini,\
+solaris.admin.edit/etc/glance/glance-api.conf,\
+solaris.admin.edit/etc/glance/glance-cache.conf,\
+solaris.admin.edit/etc/glance/glance-registry-paste.ini,\
+solaris.admin.edit/etc/glance/glance-registry.conf,\
+solaris.admin.edit/etc/glance/glance-scrubber.conf,\
+solaris.admin.edit/etc/glance/logging.conf,\
+solaris.admin.edit/etc/glance/policy.json,\
+solaris.smf.manage.glance,\
+solaris.smf.value.glance
+
+OpenStack Management:RO:::profiles=OpenStack Image Management
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/glance/glance.license	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,211 @@
+The following applies to all products licensed under the Apache 2.0 License:
+
+You may not use the identified files except in compliance with the Apache License, Version 2.0 (the "License.")
+ 
+You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.  A copy of the license is also reproduced below.
+
+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.
+
+		                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/glance/glance.p5m	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,297 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
+#
+
+set name=pkg.fmri \
+    value=pkg:/cloud/openstack/[email protected]$(IPS_COMPONENT_VERSION),$(BUILD_VERSION)
+set name=pkg.summary value="OpenStack Glance"
+set name=pkg.description \
+    value="OpenStack Glance provides services for discovering, registering, and retrieving virtual machine images. Glance has a RESTful API that allows querying of VM image metadata as well as retrieval of the actual image. VM images made available through Glance can be stored in a variety of locations from simple file systems to object-storage systems like OpenStack Swift."
+set name=pkg.human-version value="Grizzly $(COMPONENT_VERSION)"
+set name=com.oracle.info.description value="Glance, the OpenStack image service"
+set name=com.oracle.info.tpno value=16269
+set name=info.classification \
+    value="org.opensolaris.category.2008:System/Administration and Configuration" \
+    value="org.opensolaris.category.2008:System/Enterprise Management" \
+    value=org.opensolaris.category.2008:System/Virtualization \
+    value="org.opensolaris.category.2008:Web Services/Application and Web Servers"
+set name=info.source-url value=$(COMPONENT_ARCHIVE_URL)
+set name=info.upstream value="OpenStack <[email protected]>"
+set name=info.upstream-url value=$(COMPONENT_PROJECT_URL)
+set name=org.opensolaris.arc-caseid value=PSARC/2013/350 value=PSARC/2014/055
+set name=org.opensolaris.consolidation value=$(CONSOLIDATION)
+dir  path=etc/glance owner=glance group=glance mode=0700
+file etc/glance-api-paste.ini path=etc/glance/glance-api-paste.ini \
+    owner=glance group=glance mode=0644 overlay=allow preserve=true
+file files/glance-api.conf path=etc/glance/glance-api.conf owner=glance \
+    group=glance mode=0644 overlay=allow preserve=true
+file etc/glance-cache.conf path=etc/glance/glance-cache.conf owner=glance \
+    group=glance mode=0644 overlay=allow preserve=true
+file etc/glance-registry-paste.ini path=etc/glance/glance-registry-paste.ini \
+    owner=glance group=glance mode=0644 overlay=allow preserve=true
+file etc/glance-registry.conf path=etc/glance/glance-registry.conf \
+    owner=glance group=glance mode=0644 overlay=allow preserve=true
+file files/glance-scrubber.conf path=etc/glance/glance-scrubber.conf \
+    owner=glance group=glance mode=0644 overlay=allow preserve=true
+file etc/logging.cnf.sample path=etc/glance/logging.conf owner=glance \
+    group=glance mode=0644 overlay=allow preserve=true
+file etc/policy.json path=etc/glance/policy.json owner=glance group=glance \
+    mode=0644 overlay=allow preserve=true
+file etc/schema-image.json path=etc/glance/schema-image.json owner=glance \
+    group=glance
+file files/glance.auth_attr \
+    path=etc/security/auth_attr.d/cloud:openstack:glance group=sys
+file files/glance.exec_attr \
+    path=etc/security/exec_attr.d/cloud:openstack:glance group=sys
+file files/glance.prof_attr \
+    path=etc/security/prof_attr.d/cloud:openstack:glance group=sys
+file path=lib/svc/manifest/application/openstack/glance-api.xml
+file path=lib/svc/manifest/application/openstack/glance-db.xml
+file path=lib/svc/manifest/application/openstack/glance-registry.xml
+file files/glance-scrubber.xml \
+    path=lib/svc/manifest/application/openstack/glance-scrubber.xml
+file files/glance-api path=lib/svc/method/glance-api
+file files/glance-registry path=lib/svc/method/glance-registry
+file files/glance-scrubber path=lib/svc/method/glance-scrubber
+file path=usr/bin/glance-cache-manage
+file path=usr/bin/glance-cache-prefetcher
+file path=usr/bin/glance-manage
+file path=usr/bin/glance-replicator
+file usr/bin/glance-api path=usr/lib/glance/glance-api mode=0555
+file usr/bin/glance-cache-cleaner path=usr/lib/glance/glance-cache-cleaner \
+    mode=0555
+file usr/bin/glance-cache-pruner path=usr/lib/glance/glance-cache-pruner \
+    mode=0555
+file usr/bin/glance-registry path=usr/lib/glance/glance-registry mode=0555
+file usr/bin/glance-scrubber path=usr/lib/glance/glance-scrubber mode=0555
+file path=usr/lib/python$(PYVER)/vendor-packages/glance-$(COMPONENT_VERSION)-py$(PYVER).egg-info/PKG-INFO
+file path=usr/lib/python$(PYVER)/vendor-packages/glance-$(COMPONENT_VERSION)-py$(PYVER).egg-info/SOURCES.txt
+file path=usr/lib/python$(PYVER)/vendor-packages/glance-$(COMPONENT_VERSION)-py$(PYVER).egg-info/dependency_links.txt
+file path=usr/lib/python$(PYVER)/vendor-packages/glance-$(COMPONENT_VERSION)-py$(PYVER).egg-info/requires.txt
+file path=usr/lib/python$(PYVER)/vendor-packages/glance-$(COMPONENT_VERSION)-py$(PYVER).egg-info/top_level.txt
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/authorization.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/cached_images.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/common.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/middleware/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/middleware/cache.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/middleware/cache_manage.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/middleware/context.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/middleware/version_negotiation.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/policy.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v1/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v1/controller.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v1/filters.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v1/images.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v1/members.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v1/router.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/image_data.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/image_members.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/image_tags.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/images.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/router.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/v2/schemas.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/api/versions.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/auth.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/client.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/config.py \
+    pkg.depend.bypass-generate=.*/paste.*
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/crypt.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/exception.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/utils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/common/wsgi.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/context.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/migration.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/simple/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/simple/api.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/api.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/README
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/manage.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/migrate.cfg
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/schema.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/001_add_images_table.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/002_add_image_properties_table.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/003_add_disk_format.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/003_sqlite_downgrade.sql
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/003_sqlite_upgrade.sql
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/004_add_checksum.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/005_size_big_integer.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/006_key_to_name.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/006_mysql_downgrade.sql
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/006_mysql_upgrade.sql
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/006_sqlite_downgrade.sql
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/006_sqlite_upgrade.sql
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/007_add_owner.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/008_add_image_members_table.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/009_add_mindisk_and_minram.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/010_default_update_at.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/011_make_mindisk_and_minram_notnull.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/011_sqlite_downgrade.sql
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/011_sqlite_upgrade.sql
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/012_id_to_uuid.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/013_add_protected.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/013_sqlite_downgrade.sql
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/014_add_image_tags_table.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/015_quote_swift_credentials.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/016_add_status_image_member.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/016_sqlite_downgrade.sql
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/017_quote_encrypted_swift_credentials.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/018_add_image_locations_table.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/019_migrate_image_locations.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/020_drop_images_table_location.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/021_set_engine_mysql_innodb.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/022_image_member_index.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migrate_repo/versions/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/migration.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/db/sqlalchemy/models.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/domain/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/domain/proxy.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/gateway.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/image_cache/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/image_cache/base.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/image_cache/cleaner.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/image_cache/client.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/image_cache/drivers/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/image_cache/drivers/base.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/image_cache/drivers/sqlite.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/image_cache/drivers/xattr.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/image_cache/prefetcher.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/image_cache/pruner.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/bs/LC_MESSAGES/glance.po
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/cs/LC_MESSAGES/glance.po
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/da/LC_MESSAGES/glance.po
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/de/LC_MESSAGES/glance.po
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/en_AU/LC_MESSAGES/glance.po
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/en_GB/LC_MESSAGES/glance.po
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/es/LC_MESSAGES/glance.po
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/fr/LC_MESSAGES/glance.po
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/glance.pot
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/it/LC_MESSAGES/glance.po
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/ja/LC_MESSAGES/glance.po
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/ko/LC_MESSAGES/glance.po
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/pt_BR/LC_MESSAGES/glance.po
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/ru/LC_MESSAGES/glance.po
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/tl/LC_MESSAGES/glance.po
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/tr/LC_MESSAGES/glance.po
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/uk/LC_MESSAGES/glance.po
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/zh_CN/LC_MESSAGES/glance.po
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/locale/zh_TW/LC_MESSAGES/glance.po
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/notifier/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/notifier/notify_kombu.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/notifier/notify_log.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/notifier/notify_noop.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/notifier/notify_qpid.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/notifier/strategy.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/README
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/gettextutils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/importutils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/jsonutils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/local.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/log.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/notifier/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/notifier/api.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/notifier/log_notifier.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/notifier/no_op_notifier.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/notifier/rabbit_notifier.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/notifier/rpc_notifier.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/notifier/rpc_notifier2.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/notifier/test_notifier.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/policy.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/setup.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/strutils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/timeutils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/uuidutils.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/openstack/common/version.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/registry/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/registry/api/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/registry/api/v1/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/registry/api/v1/images.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/registry/api/v1/members.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/registry/client.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/schema.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/store/__init__.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/store/base.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/store/filesystem.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/store/http.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/store/location.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/store/rbd.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/store/s3.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/store/scrubber.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/store/swift.py
+file path=usr/lib/python$(PYVER)/vendor-packages/glance/version.py
+dir  path=var/lib/glance owner=glance group=glance mode=0700
+dir  path=var/log/glance owner=glance group=glance mode=0700
+group groupname=glance gid=82
+user username=glance ftpuser=false gcos-field="Openstack Glance" group=glance \
+    home-dir=/var/lib/glance uid=82
+license glance.license license="Apache v2.0"
+
+# force a group dependency on the optional anyjson; pkgdepend work is needed to
+# flush this out.
+depend type=group fmri=library/python-2/anyjson-26
+
+# force a dependency on boto; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python-2/boto-26
+
+# force a dependency on httplib2; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python-2/httplib2-26
+
+# force a dependency on iso8601; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python-2/iso8601-26
+
+# force a dependency on jsonschema; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python-2/jsonschema-26
+
+# force a dependency on kombu; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python-2/kombu-26
+
+# force a dependency on paste; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python-2/paste-26
+
+# force a dependency on paste.deploy; pkgdepend work is needed to flush this
+# out.
+depend type=require fmri=library/python-2/paste.deploy-26
+
+# force a dependency on routes; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python-2/routes-26
+
+# force a dependency on setuptools; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python-2/setuptools-26
+
+# force a dependency on sqlalchemy; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python-2/sqlalchemy-26
+
+# force a dependency on webob; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python-2/webob-26
+
+# force a dependency on swiftclient; pkgdepend work is needed to flush this out.
+depend type=require fmri=library/python/swiftclient-26
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/glance/patches/01-nopycrypto.patch	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,106 @@
+In-house removal of PyCrypto dependency in Glance.  This patch is
+Solaris-specific and not suitable for upstream.
+
+Convert urlsafe_encrypt() and urlsafe_decrypt() to use M2Crypto instead
+of PyCrypto.
+
+--- glance-2013.1.4/glance.egg-info/requires.txt.orig	Thu Jan 16 22:08:47 2014
++++ glance-2013.1.4/glance.egg-info/requires.txt	Thu Jan 16 22:23:01 2014
[email protected]@ -11,7 +11,7 @@
+ sqlalchemy-migrate>=0.7
+ httplib2
+ kombu
+-pycrypto>=2.1.0alpha1
++M2Crypto>=0.21.1
+ iso8601>=0.1.4
+ oslo.config>=1.1.0
+ python-swiftclient>=1.2,<2
+--- glance-2013.1.4/glance/common/crypt.py.orig	Thu Oct 17 11:22:18 2013
++++ glance-2013.1.4/glance/common/crypt.py	Thu Jan 16 22:42:41 2014
[email protected]@ -4,6 +4,8 @@
+ # Copyright 2011 OpenStack LLC.
+ # All Rights Reserved.
+ #
++# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
++#
+ #    Licensed 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
[email protected]@ -21,12 +23,27 @@
+ """
+ 
+ import base64
++import os
+ 
+-from Crypto.Cipher import AES
+-from Crypto import Random
+-from Crypto.Random import random
++from M2Crypto.EVP import Cipher
+ 
++from glance.common import exception
+ 
++
++def _key_to_alg(key):
++    """Return a M2Crypto-compatible AES-CBC algorithm name given a key."""
++    aes_algs = {
++        128: 'aes_128_cbc',
++        192: 'aes_192_cbc',
++        256: 'aes_256_cbc'
++    }
++
++    keylen = 8 * len(key)
++    if keylen not in aes_algs:
++        msg = ('Invalid AES key length, %d bits') % keylen
++        raise exception.Invalid(msg)
++    return aes_algs[keylen]
++
+ def urlsafe_encrypt(key, plaintext, blocksize=16):
+     """
+     Encrypts plaintext. Resulting ciphertext will contain URL-safe characters
[email protected]@ -36,20 +53,12 @@
+ 
+     :returns : Resulting ciphertext
+     """
+-    def pad(text):
+-        """
+-        Pads text to be encrypted
+-        """
+-        pad_length = (blocksize - len(text) % blocksize)
+-        sr = random.StrongRandom()
+-        pad = ''.join(chr(sr.randint(1, 0xFF)) for i in range(pad_length - 1))
+-        # We use chr(0) as a delimiter between text and padding
+-        return text + chr(0) + pad
+ 
+     # random initial 16 bytes for CBC
+-    init_vector = Random.get_random_bytes(16)
+-    cypher = AES.new(key, AES.MODE_CBC, init_vector)
+-    padded = cypher.encrypt(pad(str(plaintext)))
++    init_vector = os.urandom(16)
++    cipher = Cipher(alg=_key_to_alg(key), key=key, iv=init_vector, op=1)
++    padded = cipher.update(str(plaintext))
++    padded = padded + cipher.final()
+     return base64.urlsafe_b64encode(init_vector + padded)
+ 
+ 
[email protected]@ -63,6 +72,7 @@
+     """
+     # Cast from unicode
+     ciphertext = base64.urlsafe_b64decode(str(ciphertext))
+-    cypher = AES.new(key, AES.MODE_CBC, ciphertext[:16])
+-    padded = cypher.decrypt(ciphertext[16:])
+-    return padded[:padded.rfind(chr(0))]
++    cipher = Cipher(alg=_key_to_alg(key), key=key, iv=ciphertext[:16], op=0)
++    padded = cipher.update(ciphertext[16:])
++    padded = padded + cipher.final()
++    return padded
+--- glance-2013.1.4/tools/pip-requires.orig	Thu Oct 17 11:22:19 2013
++++ glance-2013.1.4/tools/pip-requires	Thu Jan 16 22:22:56 2014
[email protected]@ -15,7 +15,7 @@
+ sqlalchemy-migrate>=0.7
+ httplib2
+ kombu
+-pycrypto>=2.1.0alpha1
++M2Crypto>=0.21.1
+ iso8601>=0.1.4
+ oslo.config>=1.1.0
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/glance/patches/02-zfs-uar-formats.patch	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,40 @@
+In-house patch to add 'uar' and 'zfs' container and disk formats to
+registered image types.  Patch has not yet been submitted upstream.
+
+diff --git a/glance/api/v1/images.py b/glance/api/v1/images.py
+index 4993a28..a4efe16 100644
+--- a/glance/api/v1/images.py
++++ b/glance/api/v1/images.py
[email protected]@ -55,9 +55,9 @@ CONF = cfg.CONF
+ LOG = logging.getLogger(__name__)
+ SUPPORTED_PARAMS = glance.api.v1.SUPPORTED_PARAMS
+ SUPPORTED_FILTERS = glance.api.v1.SUPPORTED_FILTERS
+-CONTAINER_FORMATS = ['ami', 'ari', 'aki', 'bare', 'ovf']
++CONTAINER_FORMATS = ['ami', 'ari', 'aki', 'bare', 'ovf', 'uar']
+ DISK_FORMATS = ['ami', 'ari', 'aki', 'vhd', 'vmdk', 'raw', 'qcow2', 'vdi',
+-                'iso']
++                'iso', 'zfs']
+ 
+ 
+ def validate_image_meta(req, values):
+diff --git a/glance/api/v2/images.py b/glance/api/v2/images.py
+index 3121b25..32090c9 100644
+--- a/glance/api/v2/images.py
++++ b/glance/api/v2/images.py
[email protected]@ -520,14 +520,14 @@ _BASE_PROPERTIES = {
+         'type': 'string',
+         'description': _(''),
+         'type': 'string',
+-        'enum': ['bare', 'ovf', 'ami', 'aki', 'ari'],
++        'enum': ['bare', 'ovf', 'ami', 'aki', 'ari', 'uar'],
+     },
+     'disk_format': {
+         'type': 'string',
+         'description': _(''),
+         'type': 'string',
+         'enum': ['raw', 'vhd', 'vmdk', 'vdi', 'iso', 'qcow2',
+-                 'aki', 'ari', 'ami'],
++                 'aki', 'ari', 'ami', 'zfs'],
+     },
+     'created_at': {
+         'type': 'string',
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/glance/resolve.deps	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,10 @@
+library/python-2/eventlet-26
+library/python-2/m2crypto-26
+library/python-2/oslo.config-26
+library/python-2/sqlalchemy-migrate-26
+library/python/eventlet-26
+library/python/m2crypto-26
+library/python/oslo.config-26
+library/python/sqlalchemy-migrate-26
+runtime/python-26
+system/core-os
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/horizon/Makefile	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,68 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
+#
+include ../../../make-rules/shared-macros.mk
+
+COMPONENT_NAME=		horizon
+COMPONENT_CODENAME=	grizzly
+COMPONENT_VERSION=	2013.1.4
+COMPONENT_SRC=		$(COMPONENT_NAME)-$(COMPONENT_VERSION)
+COMPONENT_ARCHIVE=	$(COMPONENT_SRC).tar.gz
+COMPONENT_ARCHIVE_HASH=	\
+    sha256:fb24b6d8b38d199a8ab0174335df63c7612e74a02e4f0883ee8a3181ce07b4ab
+COMPONENT_ARCHIVE_URL=	http://launchpad.net/$(COMPONENT_NAME)/$(COMPONENT_CODENAME)/$(COMPONENT_VERSION)/+download/$(COMPONENT_ARCHIVE)
+COMPONENT_PROJECT_URL=	http://www.openstack.org/
+COMPONENT_BUGDB=	utility/horizon
+IPS_COMPONENT_VERSION=  0.$(COMPONENT_VERSION)
+
+include $(WS_TOP)/make-rules/prep.mk
+include $(WS_TOP)/make-rules/setup.py.mk
+include $(WS_TOP)/make-rules/ips.mk
+
+ASLR_MODE = $(ASLR_NOT_APPLICABLE)
+
+# Since this is an app, and doesn't provide any public library interfaces, we
+# only need to deliver one version.  The manifest is parameterized, though.
+PYTHON_VERSIONS=	2.6
+
+PKG_MACROS +=		PYVER=$(PYTHON_VERSIONS)
+
+COMPONENT_POST_INSTALL_ACTION += \
+	($(MKDIR) $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/openstack_dashboard/static/solaris/css; \
+	 $(CP) files/branding/css/solaris.css $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/openstack_dashboard/static/solaris/css; \
+	 $(MKDIR) $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/openstack_dashboard/static/solaris/img; \
+	 $(CP) files/branding/img/* $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/openstack_dashboard/static/solaris/img; \
+	 $(MKDIR) $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/openstack_dashboard/static/solaris/theme; \
+	 $(CP) files/branding/theme/_stylesheets.html $(PROTO_DIR)/usr/lib/python2.6/vendor-packages/openstack_dashboard/static/solaris/theme)
+
+# common targets
+build:		$(BUILD_NO_ARCH)
+
+install:	$(INSTALL_NO_ARCH)
+
+test:		$(NO_TESTS)
+
+BUILD_PKG_DEPENDENCIES =	$(BUILD_TOOLS)
+
+include $(WS_TOP)/make-rules/depend.mk
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/openstack/horizon/files/branding/css/solaris.css	Mon Mar 31 16:44:02 2014 -0700
@@ -0,0 +1,5957 @@
+/*!
+ * Bootstrap v2.0.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section {
+  display: block;
+}
+audio,
+canvas,
+video {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+}
+audio:not([controls]) {
+  display: none;
+}
+html {
+  font-size: 100%;
+  -webkit-text-size-adjust: 100%;
+  -ms-text-size-adjust: 100%;
+}
+a:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+a:hover,
+a:active {
+  outline: 0;
+}
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+sup {
+  top: -0.5em;
+}
+sub {
+  bottom: -0.25em;
+}
+img {
+  max-width: 100%;
+  height: auto;
+  border: 0;
+  -ms-interpolation-mode: bicubic;
+}
+button,
+input,
+select,
+textarea {
+  margin: 0;
+  font-size: 100%;
+  vertical-align: middle;
+}
+button,
+input {
+  *overflow: visible;
+  line-height: normal;
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  cursor: pointer;
+  -webkit-appearance: button;
+}
+input[type="search"] {
+  -webkit-appearance: textfield;
+  -webkit-box-sizing: content-box;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+}
+input[type="search"]::-webkit-search-decoration,
+input[type="search"]::-webkit-search-cancel-button {
+  -webkit-appearance: none;
+}
+textarea {
+  overflow: auto;
+  vertical-align: top;
+}
+.clearfix {
+  *zoom: 1;
+}
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  content: "";
+}
+.clearfix:after {
+  clear: both;
+}
+*:focus { outline: 0; }
+
+body {
+  margin: 0;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 13px;
+  line-height: 18px;
+  color: #333333;
+  background-color: #ffffff;
+}
+a {
+  color: #dd4814;
+  text-decoration: none;
+}
+a:hover {
+  color: #dd4814;
+  text-decoration: underline;
+}
+.row {
+  margin-left: -20px;
+  *zoom: 1;
+}
+.row:before,
+.row:after {
+  display: table;
+  content: "";
+}
+.row:after {
+  clear: both;
+}
+[class*="span"] {
+  float: left;
+  margin-left: 20px;
+}
+.span1 {
+  width: 60px;
+}
+.span2 {
+  width: 140px;
+}
+.span3 {
+  width: 220px;
+}
+.span4 {
+  width: 300px;
+}
+.span5 {
+  width: 380px;
+}
+.span6 {
+  width: 460px;
+}
+.span7 {
+  width: 540px;
+}
+.span8 {
+  width: 620px;
+}
+.span9 {
+  width: 700px;
+}
+.span10 {
+  width: 780px;
+}
+.span11 {
+  width: 860px;
+}
+.span12,
+.container {
+  width: 940px;
+}
+.offset1 {
+  margin-left: 100px;
+}
+.offset2 {
+  margin-left: 180px;
+}
+.offset3 {
+  margin-left: 260px;
+}
+.offset4 {
+  margin-left: 340px;
+}
+.offset5 {
+  margin-left: 420px;
+}
+.offset6 {
+  margin-left: 500px;
+}
+.offset7 {
+  margin-left: 580px;
+}
+.offset8 {
+  margin-left: 660px;
+}
+.offset9 {
+  margin-left: 740px;
+}
+.offset10 {
+  margin-left: 820px;
+}
+.offset11 {
+  margin-left: 900px;
+}
+.row-fluid {
+  width: 100%;
+  *zoom: 1;
+}
+.row-fluid:before,
+.row-fluid:after {
+  display: table;
+  content: "";
+}
+.row-fluid:after {
+  clear: both;
+}
+.row-fluid > [class*="span"] {
+  float: left;
+  margin-left: 2.127659574%;
+}
+.row-fluid > [class*="span"]:first-child {
+  margin-left: 0;
+}
+.row-fluid > .span1 {
+  width: 6.382978723%;
+}
+.row-fluid > .span2 {
+  width: 14.89361702%;
+}
+.row-fluid > .span3 {
+  width: 23.404255317%;
+}
+.row-fluid > .span4 {
+  width: 31.914893614%;
+}
+.row-fluid > .span5 {
+  width: 40.425531911%;
+}
+.row-fluid > .span6 {
+  width: 48.93617020799999%;
+}
+.row-fluid > .span7 {
+  width: 57.446808505%;
+}
+.row-fluid > .span8 {
+  width: 65.95744680199999%;
+}
+.row-fluid > .span9 {
+  width: 74.468085099%;
+}
+.row-fluid > .span10 {
+  width: 82.97872339599999%;
+}
+.row-fluid > .span11 {
+  width: 91.489361693%;
+}
+.row-fluid > .span12 {
+  width: 99.99999998999999%;
+}
+.container {
+  width: 940px;
+  margin-left: auto;
+  margin-right: auto;
+  *zoom: 1;
+}
+.container:before,
+.container:after {
+  display: table;
+  content: "";
+}
+.container:after {
+  clear: both;
+}
+.container-fluid {
+  padding-left: 20px;
+  padding-right: 20px;
+  *zoom: 1;
+}
+.container-fluid:before,
+.container-fluid:after {
+  display: table;
+  content: "";
+}
+.container-fluid:after {
+  clear: both;
+}
+p {
+  margin: 0 0 9px;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 13px;
+  line-height: 18px;
+}
+p small {
+  font-size: 11px;
+  color: #999999;
+}
+.lead {
+  margin-bottom: 18px;
+  font-size: 20px;
+  font-weight: 200;
+  line-height: 27px;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  margin: 0;
+  font-weight: bold;
+  color: #333333;
+  text-rendering: optimizelegibility;
+}
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small {
+  font-weight: normal;
+  color: #999999;
+}
+h1 {
+  font-size: 30px;
+  line-height: 36px;
+}
+h1 small {
+  font-size: 18px;
+}
+h2 {
+  font-size: 24px;
+  line-height: 36px;
+}
+h2 small {
+  font-size: 18px;
+}
+h3 {
+  line-height: 27px;
+  font-size: 18px;
+}
+h3 small {
+  font-size: 14px;
+}
+h4,
+h5,
+h6 {
+  line-height: 18px;
+}
+h4 {
+  font-size: 14px;
+}
+h4 small {
+  font-size: 12px;
+}
+h5 {
+  font-size: 12px;
+}
+h6 {
+  font-size: 11px;
+  color: #999999;
+  text-transform: uppercase;
+}
+.page-header {
+  padding-bottom: 17px;
+  margin: 18px 0;
+  border-bottom: 1px solid #eeeeee;
+}
+.page-header h1 {
+  line-height: 1;
+}
+ul,
+ol {
+  padding: 0;
+  margin: 0 0 9px 25px;
+}
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+  margin-bottom: 0;
+}
+ul {
+  list-style: disc;
+}
+ol {
+  list-style: decimal;
+}
+li {
+  line-height: 18px;
+}
+ul.unstyled,
+ol.unstyled {
+  margin-left: 0;
+  list-style: none;
+}
+table ul {
+  margin: 0;
+  list-style-type: none;
+}
+dl {
+  margin-bottom: 18px;
+}
+dt,
+dd {
+  line-height: 18px;
+}
+dt {
+  font-weight: bold;
+}
+dd {
+  margin-left: 9px;
+}
+hr {
+  margin: 18px 0;
+  border: 0;
+  border-top: 1px solid #eeeeee;
+  border-bottom: 1px solid #ffffff;
+}
+strong {
+  font-weight: bold;
+}
+em {
+  font-style: italic;
+}
+.muted {
+  color: #999999;
+}
+abbr {
+  font-size: 90%;
+  text-transform: uppercase;
+  border-bottom: 1px dotted #ddd;
+  cursor: help;
+}
+blockquote {
+  padding: 0 0 0 15px;
+  margin: 0 0 18px;
+  border-left: 5px solid #eeeeee;
+}
+blockquote p {
+  margin-bottom: 0;
+  font-size: 16px;
+  font-weight: 300;
+  line-height: 22.5px;
+}
+blockquote small {
+  display: block;
+  line-height: 18px;
+  color: #999999;
+}
+blockquote small:before {
+  content: '\2014 \00A0';
+}
+blockquote.pull-right {
+  float: right;
+  padding-left: 0;
+  padding-right: 15px;
+  border-left: 0;
+  border-right: 5px solid #eeeeee;
+}
+blockquote.pull-right p,
+blockquote.pull-right small {
+  text-align: right;
+}
+q:before,
+q:after,
+blockquote:before,
+blockquote:after {
+  content: "";
+}
+address {
+  display: block;
+  margin-bottom: 18px;
+  line-height: 18px;
+  font-style: normal;
+}
+small {
+  font-size: 100%;
+}
+cite {
+  font-style: normal;
+}
+code,
+pre {
+  padding: 0 3px 2px;
+  font-family: Menlo, Monaco, "Courier New", monospace;
+  font-size: 12px;
+  color: #333333;
+  -webkit-border-radius: 0px;
+  -moz-border-radius: 0px;
+  border-radius: 0px;
+}
+code {
+  padding: 3px 4px;
+  color: #d14;
+  background-color: #f7f7f9;
+  border: 1px solid #e1e1e8;
+}
+pre {
+  display: block;
+  padding: 8.5px;
+  margin: 0 0 9px;
+  font-size: 12px;
+  line-height: 18px;
+  background-color: #f5f5f5;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  -webkit-border-radius: 0px;
+  -moz-border-radius: 0px;
+  border-radius: 0px;
+  white-space: pre;
+  white-space: pre-wrap;
+  word-break: break-all;
+  word-wrap: break-word;
+}
+pre.prettyprint {
+  margin-bottom: 18px;
+}
+pre code {
+  padding: 0;
+  color: inherit;
+  background-color: transparent;
+  border: 0;
+}
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
+form {
+  margin: 0 0 18px;
+}
+fieldset {
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 27px;
+  font-size: 19.5px;
+  line-height: 36px;
+  color: #333333;
+  border: 0;
+  border-bottom: 1px solid #eee;
+}
+legend small {
+  font-size: 13.5px;
+  color: #999999;
+}
+label,
+input,
+button,
+select,
+textarea {
+  font-size: 13px;
+  font-weight: normal;
+  line-height: 18px;
+}
+input,
+button,
+select,
+textarea {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+label {
+  display: block;
+  margin-bottom: 5px;
+  color: #333333;
+}
+input,
+textarea,
+select,
+.uneditable-input {
+  display: inline-block;
+  width: 210px;
+  height: 18px;
+  padding: 4px;
+  margin-bottom: 9px;
+  font-size: 13px;
+  line-height: 18px;
+  color: #555555;
+  border: 1px solid #ccc;
+  -webkit-border-radius: 0px;
+  -moz-border-radius: 0px;
+  border-radius: 0px;
+}
+.uneditable-textarea {
+  width: auto;
+  height: auto;
+}
+label input,
+label textarea,
+label select {
+  display: block;
+}
+input[type="image"],
+input[type="checkbox"],
+input[type="radio"] {
+  width: auto;
+  height: auto;
+  padding: 0;
+  margin: 3px 0;
+  *margin-top: 0;
+  /* IE7 */
+
+  line-height: normal;
+  cursor: pointer;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+  border: 0 \9;
+  /* IE9 and down */
+
+}
+input[type="image"] {
+  border: 0;
+}
+input[type="file"] {
+  width: auto;
+  padding: initial;
+  line-height: initial;
+  border: initial;
+  background-color: #ffffff;
+  background-color: initial;
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+}
+input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  width: auto;
+  height: auto;
+}
+select,
+input[type="file"] {
+  height: 28px;
+  /* In IE7, the height of the select element cannot be changed by height, only font-size */
+
+  *margin-top: 4px;
+  /* For IE7, add top margin to align select with labels */
+
+  line-height: 28px;
+}
+input[type="file"] {
+  line-height: 18px \9;
+}
+select {
+  width: 220px;
+  background-color: #ffffff;
+}
+select[multiple],
+select[size] {
+  height: auto;
+}
+input[type="image"] {
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+}
+textarea {
+  height: auto;
+}
+input[type="hidden"] {
+  display: none;
+}
+.radio,
+.checkbox {
+  padding-left: 18px;
+}
+.radio input[type="radio"],
+.checkbox input[type="checkbox"] {
+  float: left;
+  margin-left: -18px;
+}
+.controls > .radio:first-child,
+.controls > .checkbox:first-child {
+  padding-top: 5px;
+}
+.radio.inline,
+.checkbox.inline {
+  display: inline-block;
+  padding-top: 5px;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+.radio.inline + .radio.inline,
+.checkbox.inline + .checkbox.inline {
+  margin-left: 10px;
+}
+input,
+textarea {
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
+  -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
+  -ms-transition: border linear 0.2s, box-shadow linear 0.2s;
+  -o-transition: border linear 0.2s, box-shadow linear 0.2s;
+  transition: border linear 0.2s, box-shadow linear 0.2s;
+}
+input:focus,
+textarea:focus {
+  border-color: rgba(82, 168, 236, 0.8);
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+  outline: 0;
+  outline: thin dotted \9;
+  /* IE6-9 */
+
+}
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus,
+select:focus {
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.input-mini {
+  width: 60px;
+}
+.input-small {
+  width: 90px;
+}
+.input-medium {
+  width: 150px;
+}
+.input-large {
+  width: 210px;
+}
+.input-xlarge {
+  width: 270px;
+}
+.input-xxlarge {
+  width: 530px;
+}
+input[class*="span"],
+select[class*="span"],
+textarea[class*="span"],
+.uneditable-input {
+  float: none;
+  margin-left: 0;
+}
+input.span1,
+textarea.span1,
+.uneditable-input.span1 {
+  width: 50px;
+}
+input.span2,
+textarea.span2,
+.uneditable-input.span2 {
+  width: 130px;
+}
+input.span3,
+textarea.span3,
+.uneditable-input.span3 {
+  width: 210px;
+}
+input.span4,
+textarea.span4,
+.uneditable-input.span4 {
+  width: 290px;
+}
+input.span5,
+textarea.span5,
+.uneditable-input.span5 {
+  width: 370px;
+}
+input.span6,
+textarea.span6,
+.uneditable-input.span6 {
+  width: 450px;
+}
+input.span7,
+textarea.span7,
+.uneditable-input.span7 {
+  width: 530px;
+}
+input.span8,
+textarea.span8,
+.uneditable-input.span8 {
+  width: 610px;
+}
+input.span9,
+textarea.span9,
+.uneditable-input.span9 {
+  width: 690px;
+}
+input.span10,
+textarea.span10,
+.uneditable-input.span10 {
+  width: 770px;
+}
+input.span11,
+textarea.span11,
+.uneditable-input.span11 {
+  width: 850px;
+}
+input.span12,
+textarea.span12,
+.uneditable-input.span12 {
+  width: 930px;
+}
+input[disabled],
+select[disabled],
+textarea[disabled],
+input[readonly],
+select[readonly],
+textarea[readonly] {
+  background-color: #f5f5f5;
+  border-color: #ddd;
+  cursor: not-allowed;
+}
+.control-group.warning > label,
+.control-group.warning .help-block,
+.control-group.warning .help-inline {
+  color: #c09853;
+}
+.control-group.warning input,
+.control-group.warning select,
+.control-group.warning textarea {
+  color: #c09853;
+  border-color: #c09853;
+}
+.control-group.warning input:focus,
+.control-group.warning select:focus,
+.control-group.warning textarea:focus {
+  border-color: #a47e3c;
+  -webkit-box-shadow: 0 0 6px #dbc59e;
+  -moz-box-shadow: 0 0 6px #dbc59e;
+  box-shadow: 0 0 6px #dbc59e;
+}
+.control-group.warning .input-prepend .add-on,
+.control-group.warning .input-append .add-on {
+  color: #c09853;
+  background-color: #fcf8e3;
+  border-color: #c09853;
+}
+.control-group.error > label,
+.control-group.error .help-block,
+.control-group.error .help-inline {
+  color: #b94a48;
+}
+.control-group.error input,
+.control-group.error select,
+.control-group.error textarea {
+  color: #b94a48;
+  border-color: #b94a48;
+}
+.control-group.error input:focus,
+.control-group.error select:focus,
+.control-group.error textarea:focus {
+  border-color: #953b39;
+  -webkit-box-shadow: 0 0 6px #d59392;
+  -moz-box-shadow: 0 0 6px #d59392;
+  box-shadow: 0 0 6px #d59392;
+}
+.control-group.error .input-prepend .add-on,
+.control-group.error .input-append .add-on {
+  color: #b94a48;
+  background-color: #f2dede;
+  border-color: #b94a48;
+}
+.control-group.success > label,
+.control-group.success .help-block,
+.control-group.success .help-inline {
+  color: #468847;
+}
+.control-group.success input,
+.control-group.success select,
+.control-group.success textarea {
+  color: #468847;
+  border-color: #468847;
+}
+.control-group.success input:focus,
+.control-group.success select:focus,
+.control-group.success textarea:focus {
+  border-color: #356635;
+  -webkit-box-shadow: 0 0 6px #7aba7b;
+  -moz-box-shadow: 0 0 6px #7aba7b;
+  box-shadow: 0 0 6px #7aba7b;
+}
+.control-group.success .input-prepend .add-on,
+.control-group.success .input-append .add-on {
+  color: #468847;
+  background-color: #dff0d8;
+  border-color: #468847;
+}
+input:focus:required:invalid,
+textarea:focus:required:invalid,
+select:focus:required:invalid {
+  color: #b94a48;
+  border-color: #ee5f5b;
+}
+input:focus:required:invalid:focus,
+textarea:focus:required:invalid:focus,
+select:focus:required:invalid:focus {
+  border-color: #e9322d;
+  -webkit-box-shadow: 0 0 6px #f8b9b7;
+  -moz-box-shadow: 0 0 6px #f8b9b7;
+  box-shadow: 0 0 6px #f8b9b7;
+}
+.form-actions {
+  padding: 17px 20px 18px;
+  margin-top: 18px;
+  margin-bottom: 18px;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+}
+.uneditable-input {
+  display: block;
+  background-color: #ffffff;
+  border-color: #eee;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+  cursor: not-allowed;
+}
+:-moz-placeholder {
+  color: #999999;
+}
+::-webkit-input-placeholder {
+  color: #999999;
+}
+.help-block {
+  display: block;
+  margin-top: 5px;
+  margin-bottom: 0;
+  color: #999999;
+}
+.help-inline {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+  margin-bottom: 9px;
+  vertical-align: middle;
+  padding-left: 5px;
+}
+.input-prepend,
+.input-append {
+  margin-bottom: 5px;
+  *zoom: 1;
+}
+.input-prepend:before,
+.input-append:before,
+.input-prepend:after,
+.input-append:after {
+  display: table;
+  content: "";
+}
+.input-prepend:after,
+.input-append:after {
+  clear: both;
+}
+.input-prepend input,
+.input-append input,
+.input-prepend .uneditable-input,
+.input-append .uneditable-input {
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+.input-prepend input:focus,
+.input-append input:focus,
+.input-prepend .uneditable-input:focus,
+.input-append .uneditable-input:focus {
+  position: relative;
+  z-index: 2;
+}
+.input-prepend .uneditable-input,
+.input-append .uneditable-input {
+  border-left-color: #ccc;
+}
+.input-prepend .add-on,
+.input-append .add-on {
+  float: left;
+  display: block;
+  width: auto;
+  min-width: 16px;
+  height: 18px;
+  margin-right: -1px;
+  padding: 4px 5px;
+  font-weight: normal;
+  line-height: 18px;
+  color: #999999;
+  text-align: center;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #f5f5f5;
+  border: 1px solid #ccc;
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.input-prepend .active,
+.input-append .active {
+  background-color: #a9dba9;
+  border-color: #46a546;
+}
+.input-prepend .add-on {
+  *margin-top: 1px;
+  /* IE6-7 */
+
+}
+.input-append input,
+.input-append .uneditable-input {
+  float: left;
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.input-append .uneditable-input {
+  border-left-color: #eee;
+  border-right-color: #ccc;
+}
+.input-append .add-on {
+  margin-right: 0;
+  margin-left: -1px;
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+.input-append input:first-child {
+  *margin-left: -160px;
+}
+.input-append input:first-child + .add-on {
+  *margin-left: -21px;
+}
+.search-query {
+  padding-left: 14px;
+  padding-right: 14px;
+  margin-bottom: 0;
+  -webkit-border-radius: 14px;
+  -moz-border-radius: 14px;
+  border-radius: 14px;
+}
+.form-search input,
+.form-inline input,
+.form-horizontal input,
+.form-search textarea,
+.form-inline textarea,
+.form-horizontal textarea,
+.form-search select,
+.form-inline select,
+.form-horizontal select,
+.form-search .help-inline,
+.form-inline .help-inline,
+.form-horizontal .help-inline,
+.form-search .uneditable-input,
+.form-inline .uneditable-input,
+.form-horizontal .uneditable-input {
+  display: inline-block;
+  margin-bottom: 0;
+}
+.form-search .hide,
+.form-inline .hide,
+.form-horizontal .hide {
+  display: none;
+}
+.form-search label,
+.form-inline label,
+.form-search .input-append,
+.form-inline .input-append,
+.form-search .input-prepend,
+.form-inline .input-prepend {
+  display: inline-block;
+}
+.form-search .input-append .add-on,
+.form-inline .input-prepend .add-on,
+.form-search .input-append .add-on,
+.form-inline .input-prepend .add-on {
+  vertical-align: middle;
+}
+.form-search .radio,
+.form-inline .radio,
+.form-search .checkbox,
+.form-inline .checkbox {
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+.control-group {
+  margin-bottom: 9px;
+}
+legend + .control-group {
+  margin-top: 18px;
+  -webkit-margin-top-collapse: separate;
+}
+.form-horizontal .control-group {
+  margin-bottom: 18px;
+  *zoom: 1;
+}
+.form-horizontal .control-group:before,
+.form-horizontal .control-group:after {
+  display: table;
+  content: "";
+}
+.form-horizontal .control-group:after {
+  clear: both;
+}
+.form-horizontal .control-label {
+  float: left;
+  width: 140px;
+  padding-top: 5px;
+  text-align: right;
+}
+.form-horizontal .controls {
+  margin-left: 160px;
+}
+.form-horizontal .form-actions {
+  padding-left: 160px;
+}
+table {
+  max-width: 100%;
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+.table {
+  width: 100%;
+  margin-bottom: 18px;
+}
+.table th,
+.table td {
+  padding: 8px;
+  line-height: 18px;
+  text-align: left;
+  vertical-align: top;
+  border-bottom: 1px solid #EEEEEE;
+}
+.table th {
+  font-weight: bold;
+}
+.table thead th {
+  vertical-align: bottom;
+}
+.table thead:first-child tr th,
+.table thead:first-child tr td {
+  border-top: 0;
+}
+.table tbody + tbody {
+  border-top: 2px solid #C4CED8;
+}
+.table-condensed th,
+.table-condensed td {
+  padding: 4px 5px;
+}
+.table-bordered {
+  border: 1px solid #ddd;
+  border-collapse: separate;
+  *border-collapse: collapsed;
+  -webkit-border-radius: 0px;
+  -moz-border-radius: 0px;
+  border-radius: 0px;
+}
+.table-bordered th + th,
+.table-bordered td + td,
+.table-bordered th + td,
+.table-bordered td + th {
+  /*border-left: 1px solid #D5DFE6;*/
+}
+.table-bordered thead:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child td {
+  border-top: 0;
+}
+.table-bordered thead:first-child tr:first-child th:first-child,
+.table-bordered tbody:first-child tr:first-child td:first-child {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.table-bordered thead:first-child tr:first-child th:last-child,
+.table-bordered tbody:first-child tr:first-child td:last-child {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.table-bordered thead:last-child tr:last-child th:first-child,
+.table-bordered tbody:last-child tr:last-child td:first-child {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.table-bordered thead:last-child tr:last-child th:last-child,
+.table-bordered tbody:last-child tr:last-child td:last-child {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.table-striped tbody tr:nth-child(odd) td,
+.table-striped tbody tr:nth-child(odd) th {
+  background-color: #f9f9f9;
+}
+.table tbody tr:hover td,
+.table tbody tr:hover th {
+  background-color: #EBECED;
+}
+table .span1 {
+  float: none;
+  width: 44px;
+  margin-left: 0;
+}
+table .span2 {
+  float: none;
+  width: 124px;
+  margin-left: 0;
+}
+table .span3 {
+  float: none;
+  width: 204px;
+  margin-left: 0;
+}
+table .span4 {
+  float: none;
+  width: 284px;
+  margin-left: 0;
+}
+table .span5 {
+  float: none;
+  width: 364px;
+  margin-left: 0;
+}
+table .span6 {
+  float: none;
+  width: 444px;
+  margin-left: 0;
+}
+table .span7 {
+  float: none;
+  width: 524px;
+  margin-left: 0;
+}
+table .span8 {
+  float: none;
+  width: 604px;
+  margin-left: 0;
+}
+table .span9 {
+  float: none;
+  width: 684px;
+  margin-left: 0;
+}
+table .span10 {
+  float: none;
+  width: 764px;
+  margin-left: 0;
+}
+table .span11 {
+  float: none;
+  width: 844px;
+  margin-left: 0;
+}
+table .span12 {
+  float: none;
+  width: 924px;
+  margin-left: 0;
+}
+[class^="icon-"],
+[class*=" icon-"] {
+  display: inline-block;
+  width: 14px;
+  height: 14px;
+  line-height: 14px;
+  vertical-align: text-top;
+  xbackground-image: url('/static/bootstrap/img/glyphicons-halflings.png?531d4b607365');
+  background-position: 14px 14px;
+  background-repeat: no-repeat;
+  *margin-right: .3em;
+}
+[class^="icon-"]:last-child,
+[class*=" icon-"]:last-child {
+  *margin-left: 0;
+}
+.icon-white {
+  xbackground-image: url('/static/bootstrap/img/glyphicons-halflings-white.png?11118ae8db79');
+}
+.icon-glass {
+  background-position: 0      0;
+}
+.icon-music {
+  background-position: -24px 0;
+}
+.icon-search {
+  background-position: -48px 0;
+}
+.icon-envelope {
+  background-position: -72px 0;
+}
+.icon-heart {
+  background-position: -96px 0;
+}
+.icon-star {
+  background-position: -120px 0;
+}
+.icon-star-empty {
+  background-position: -144px 0;
+}
+.icon-user {
+  background-position: -168px 0;
+}
+.icon-film {
+  background-position: -192px 0;
+}
+.icon-th-large {
+  background-position: -216px 0;
+}
+.icon-th {
+  background-position: -240px 0;
+}
+.icon-th-list {
+  background-position: -264px 0;
+}
+.icon-ok {
+  background-position: -288px 0;
+}
+.icon-remove {
+  background-position: -312px 0;
+}
+.icon-zoom-in {
+  background-position: -336px 0;
+}
+.icon-zoom-out {
+  background-position: -360px 0;
+}
+.icon-off {
+  background-position: -384px 0;
+}
+.icon-signal {
+  background-position: -408px 0;
+}
+.icon-cog {
+  background-position: -432px 0;
+}
+.icon-trash {
+  background-position: -456px 0;
+}
+.icon-home {
+  background-position: 0 -24px;
+}
+.icon-file {
+  background-position: -24px -24px;
+}
+.icon-time {
+  background-position: -48px -24px;
+}
+.icon-road {
+  background-position: -72px -24px;
+}
+.icon-download-alt {
+  background-position: -96px -24px;
+}
+.icon-download {
+  background-position: -120px -24px;
+}
+.icon-upload {
+  background-position: -144px -24px;
+}
+.icon-inbox {
+  background-position: -168px -24px;
+}
+.icon-play-circle {
+  background-position: -192px -24px;
+}
+.icon-repeat {
+  background-position: -216px -24px;
+}
+.icon-refresh {
+  background-position: -240px -24px;
+}
+.icon-list-alt {
+  background-position: -264px -24px;
+}
+.icon-lock {
+  background-position: -287px -24px;
+}
+.icon-flag {
+  background-position: -312px -24px;
+}
+.icon-headphones {
+  background-position: -336px -24px;
+}
+.icon-volume-off {
+  background-position: -360px -24px;
+}
+.icon-volume-down {
+  background-position: -384px -24px;
+}
+.icon-volume-up {
+  background-position: -408px -24px;
+}
+.icon-qrcode {
+  background-position: -432px -24px;
+}
+.icon-barcode {
+  background-position: -456px -24px;
+}
+.icon-tag {
+  background-position: 0 -48px;
+}
+.icon-tags {
+  background-position: -25px -48px;
+}
+.icon-book {
+  background-position: -48px -48px;
+}
+.icon-bookmark {
+  background-position: -72px -48px;
+}
+.icon-print {
+  background-position: -96px -48px;
+}
+.icon-camera {
+  background-position: -120px -48px;
+}
+.icon-font {
+  background-position: -144px -48px;
+}
+.icon-bold {
+  background-position: -167px -48px;
+}
+.icon-italic {
+  background-position: -192px -48px;
+}
+.icon-text-height {
+  background-position: -216px -48px;
+}
+.icon-text-width {
+  background-position: -240px -48px;
+}
+.icon-align-left {
+  background-position: -264px -48px;
+}
+.icon-align-center {
+  background-position: -288px -48px;
+}
+.icon-align-right {
+  background-position: -312px -48px;
+}
+.icon-align-justify {
+  background-position: -336px -48px;
+}
+.icon-list {
+  background-position: -360px -48px;
+}
+.icon-indent-left {
+  background-position: -384px -48px;
+}
+.icon-indent-right {
+  background-position: -408px -48px;
+}
+.icon-facetime-video {
+  background-position: -432px -48px;
+}
+.icon-picture {
+  background-position: -456px -48px;
+}
+.icon-pencil {
+  background-position: 0 -72px;
+}
+.icon-map-marker {
+  background-position: -24px -72px;
+}
+.icon-adjust {
+  background-position: -48px -72px;
+}
+.icon-tint {
+  background-position: -72px -72px;
+}
+.icon-edit {
+  background-position: -96px -72px;
+}
+.icon-share {
+  background-position: -120px -72px;
+}
+.icon-check {
+  background-position: -144px -72px;
+}
+.icon-move {
+  background-position: -168px -72px;
+}
+.icon-step-backward {
+  background-position: -192px -72px;
+}
+.icon-fast-backward {
+  background-position: -216px -72px;
+}
+.icon-backward {
+  background-position: -240px -72px;
+}
+.icon-play {
+  background-position: -264px -72px;
+}
+.icon-pause {
+  background-position: -288px -72px;
+}
+.icon-stop {
+  background-position: -312px -72px;
+}
+.icon-forward {
+  background-position: -336px -72px;
+}
+.icon-fast-forward {
+  background-position: -360px -72px;
+}
+.icon-step-forward {
+  background-position: -384px -72px;
+}
+.icon-eject {
+  background-position: -408px -72px;
+}
+.icon-chevron-left {
+  background-position: -432px -72px;
+}
+.icon-chevron-right {
+  background-position: -456px -72px;
+}
+.icon-plus-sign {
+  background-position: 0 -96px;
+}
+.icon-minus-sign {
+  background-position: -24px -96px;
+}
+.icon-remove-sign {
+  background-position: -48px -96px;
+}
+.icon-ok-sign {
+  background-position: -72px -96px;
+}
+.icon-question-sign {
+  background-position: -96px -96px;
+}
+.icon-info-sign {
+  background-position: -120px -96px;
+}
+.icon-screenshot {
+  background-position: -144px -96px;
+}
+.icon-remove-circle {
+  background-position: -168px -96px;
+}
+.icon-ok-circle {
+  background-position: -192px -96px;
+}
+.icon-ban-circle {
+  background-position: -216px -96px;
+}
+.icon-arrow-left {
+  background-position: -240px -96px;
+}
+.icon-arrow-right {
+  background-position: -264px -96px;
+}
+.icon-arrow-up {
+  background-position: -289px -96px;
+}
+.icon-arrow-down {
+  background-position: -312px -96px;
+}
+.icon-share-alt {
+  background-position: -336px -96px;
+}
+.icon-resize-full {
+  background-position: -360px -96px;
+}
+.icon-resize-small {
+  background-position: -384px -96px;
+}
+.icon-plus {
+  background-position: -408px -96px;
+}
+.icon-minus {
+  background-position: -433px -96px;
+}
+.icon-asterisk {
+  background-position: -456px -96px;
+}
+.icon-exclamation-sign {
+  background-position: 0 -120px;
+}
+.icon-gift {
+  background-position: -24px -120px;
+}
+.icon-leaf {
+  background-position: -48px -120px;
+}
+.icon-fire {
+  background-position: -72px -120px;
+}
+.icon-eye-open {
+  background-position: -96px -120px;
+}
+.icon-eye-close {
+  background-position: -120px -120px;
+}
+.icon-warning-sign {
+  background-position: -144px -120px;
+}
+.icon-plane {
+  background-position: -168px -120px;
+}
+.icon-calendar {
+  background-position: -192px -120px;
+}
+.icon-random {
+  background-position: -216px -120px;
+}
+.icon-comment {
+  background-position: -240px -120px;
+}
+.icon-magnet {
+  background-position: -264px -120px;
+}
+.icon-chevron-up {
+  background-position: -288px -120px;
+}
+.icon-chevron-down {
+  background-position: -313px -119px;
+}
+.icon-retweet {
+  background-position: -336px -120px;
+}
+.icon-shopping-cart {
+  background-position: -360px -120px;
+}
+.icon-folder-close {
+  background-position: -384px -120px;
+}
+.icon-folder-open {
+  background-position: -408px -120px;
+}
+.icon-resize-vertical {
+  background-position: -432px -119px;
+}
+.icon-resize-horizontal {
+  background-position: -456px -118px;
+}
+.dropdown {
+  position: relative;
+}
+.dropdown-toggle {
+  *margin-bottom: -3px;
+}
+.dropdown-toggle:active,
+.open .dropdown-toggle {
+  outline: 0;
+}
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  text-indent: -99999px;
+  *text-indent: 0;
+  vertical-align: top;
+  border-left: 4px solid transparent;
+  border-right: 4px solid transparent;
+  border-top: 4px solid #000000;
+  opacity: 0.3;
+  filter: alpha(opacity=30);
+  content: "\2193";
+}
+.dropdown .caret {
+  margin-top: 8px;
+  margin-left: 2px;
+}
+.dropdown:hover .caret,
+.open.dropdown .caret {
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  float: left;
+  display: none;
+  min-width: 145px;
+  _width: 145px;
+  padding: 4px 0;
+  margin: 0;
+  list-style: none;
+  background-color: #ffffff;
+  border-color: #C3CED7;
+  /*border-color: rgba(0, 0, 0, 0.2);*/
+  border-style: solid;
+  border-width: 1px;
+  /*-webkit-border-radius: 0 0 5px 5px;
+  -moz-border-radius: 0 0 5px 5px;
+  border-radius: 0 0 5px 5px;*/
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -webkit-background-clip: padding-box;
+  -moz-background-clip: padding;
+  background-clip: padding-box;
+  *border-right-width: 2px;
+  *border-bottom-width: 2px;
+}
+.dropdown-menu.bottom-up {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 2px;
+}
+.dropdown-menu .divider {
+  height: 1px;
+  margin: 5px 1px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #ffffff;
+  *width: 100%;
+  *margin: -5px 0 5px;
+}
+.dropdown-menu a {
+  display: block;
+  padding: 3px 15px;
+  clear: both;
+  font-weight: normal;
+  line-height: 18px;
+  color: #555555;
+  white-space: nowrap;
+}
+.dropdown-menu li > a:hover,
+.dropdown-menu .active > a,
+.dropdown-menu .active > a:hover {
+  color: #ffffff;
+  text-decoration: none;
+  background-color: #0088cc;
+}
+.dropdown.open {
+  *z-index: 1000;
+}
+.dropdown.open .dropdown-toggle {
+  color: #ffffff;
+  background: #ccc;
+  background: rgba(0, 0, 0, 0.3);
+}
+.dropdown.open .dropdown-menu {
+  display: block;
+}
+.typeahead {
+  margin-top: 2px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #eee;
+  border: 1px solid rgba(0, 0, 0, 0.05);
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+.well blockquote {
+  border-color: #ddd;
+  border-color: rgba(0, 0, 0, 0.15);
+}
+.fade {
+  -webkit-transition: opacity 0.15s linear;
+  -moz-transition: opacity 0.15s linear;
+  -ms-transition: opacity 0.15s linear;
+  -o-transition: opacity 0.15s linear;
+  transition: opacity 0.15s linear;
+  opacity: 0;
+}
+.fade.in {
+  opacity: 1;
+}
+.collapse {
+  -webkit-transition: height 0.35s ease;
+  -moz-transition: height 0.35s ease;
+  -ms-transition: height 0.35s ease;
+  -o-transition: height 0.35s ease;
+  transition: height 0.35s ease;
+  position: relative;
+  overflow: hidden;
+  height: 0;
+}
+.collapse.in {
+  height: auto;
+}
+.close {
+  float: right;
+  font-size: 20px;
+  font-weight: bold;
+  line-height: 18px;
+  color: #000000;
+  text-shadow: 0 1px 0 #ffffff;
+  opacity: 0.2;
+  filter: alpha(opacity=20);
+}
+.close:hover {
+  color: #000000;
+  text-decoration: none;
+  opacity: 0.4;
+  filter: alpha(opacity=40);
+  cursor: pointer;
+}
+.btn {
+  display: inline-block;
+  padding: 7px 10px 5px 10px;
+  margin-bottom: 0;
+  font-size: 12px !important;
+  line-height: 18px;
+  color: #000000;
+  /*text-align: center;
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+  vertical-align: middle;
+  background-color: #f5f5f5;*/
+  background: -moz-linear-gradient(top, #f1f3f4, #e3e8ea);
+  background: -ms-linear-gradient(top, #f1f3f4, #e3e8ea);
+  background: -webkit-gradient(linear, 0 0, 0 100%, from(#f1f3f4), to(#e3e8ea));
+  background: -webkit-linear-gradient(top, #f1f3f4, #e3e8ea);
+  background: -o-linear-gradient(top, #f1f3f4, #e3e8ea);
+  background: linear-gradient(top, #f1f3f4, #e3e8ea);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);
+  /*border-color: #e6e6e6 #e6e6e6 #bfbfbf;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);*/
+  border: 1px solid #C3CED7;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+  /*-webkit-box-shadow: inset 0 1px 1px rgba(251, 252, 252, 1), 0 1px 2px rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: inset 0 1px 1px rgba(251, 252, 252, 1), 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 0 1px 1px rgba(251, 252, 252, 1), 0 1px 2px rgba(0, 0, 0, 0.05);*/
+  cursor: pointer;
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  /**margin-left: .3em;*/
+}
+.btn:hover,
+.btn:active,
+.btn.active {
+  background: -moz-linear-gradient(top, #F8F9FA, #F1F4F5);
+  background: -ms-linear-gradient(top, #F8F9FA, #F1F4F5);
+  background: -webkit-gradient(linear, 0 0, 0 100%, from(#F8F9FA), to(#F1F4F5));
+  background: -webkit-linear-gradient(top, #F8F9FA, #F1F4F5);
+  background: -o-linear-gradient(top, #F8F9FA, #F1F4F5);
+  background: linear-gradient(top, #F8F9FA, #F1F4F5);  
+  text-decoration: none;
+}
+
+.btn.disabled,
+.btn[disabled] {
+  background: #F4F6F7;
+  color: #999999;
+  border: 1px solid #DFE6EB;
+}
+
+.btn:active,
+.btn.active {
+  background-color: #cccccc \9;
+}
+.btn:first-child {
+  *margin-left: 0;
+}
+.btn:hover {
+  color: #000000;
+  text-decoration: none;
+  background: -moz-linear-gradient(top, #f8f9fa, #f1f4f5);
+  background: -ms-linear-gradient(top, #f8f9fa, #f1f4f5);
+  background: -webkit-gradient(linear, 0 0, 0 100%, from(#f8f9fa), to(#f1f4f5));
+  background: -webkit-linear-gradient(top, #f8f9fa, #f1f4f5);
+  background: -o-linear-gradient(top, #f8f9fa, #f1f4f5);
+  background: linear-gradient(top, #f8f9fa, #f1f4f5);  
+  /*background-color: #e6e6e6;
+  background-position: 0 -15px;
+  -webkit-transition: background-position 0.1s linear;
+  -moz-transition: background-position 0.1s linear;
+  -ms-transition: background-position 0.1s linear;
+  -o-transition: background-position 0.1s linear;
+  transition: background-position 0.1s linear;*/
+}
+.btn:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.btn.active,
+.btn:active {
+  background-image: none;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+  background-color: #e6e6e6;
+  background-color: #d9d9d9 \9;
+  outline: 0;
+}
+.btn.disabled,
+.btn[disabled] {
+  cursor: default;
+  background-image: none;
+  background-color: #e6e6e6;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+}
+.btn-large {
+  padding: 9px 14px;
+  font-size: 15px;
+  line-height: normal;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.btn-large [class^="icon-"] {
+  margin-top: 1px;
+}
+.btn-small {
+  padding: 5px 9px;
+  font-size: 11px;
+  line-height: 16px;
+}
+.btn-small [class^="icon-"] {
+  margin-top: -1px;
+}
+.btn-mini {
+  padding: 2px 6px;
+  font-size: 11px;
+  line-height: 14px;
+}
+.btn-primary,
+.btn-primary:hover,
+.btn-warning,
+.btn-warning:hover,
+.btn-danger,
+.btn-danger:hover,
+.btn-success,
+.btn-success:hover,
+.btn-info,
+.btn-info:hover,
+.btn-inverse,
+.btn-inverse:hover {
+  /*text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);*/
+  color: #fff;
+}
+.btn-primary.active,
+.btn-warning.active,
+.btn-danger.active,
+.btn-success.active,
+.btn-info.active,
+.btn-dark.active {
+  color: #fff;
+  background-color: #c44012;
+
+}
+
+.btn-primary {
+    color: #fff;
+    border: 1px solid #0074CD;
+    background: #0074CD;
+    font-weight: bold;
+    /*background-image: linear-gradient(bottom, rgb(199,66,18) 0%, rgb(221,74,20) 100%);
+    background-image: -o-linear-gradient(bottom, rgb(199,66,18) 0%, rgb(221,74,20) 100%);
+    background-image: -moz-linear-gradient(bottom, rgb(199,66,18) 0%, rgb(221,74,20) 100%);
+    background-image: -webkit-linear-gradient(bottom, rgb(199,66,18) 0%, rgb(221,74,20) 100%);
+    background-image: -ms-linear-gradient(bottom, rgb(199,66,18) 0%, rgb(221,74,20) 100%);
+    -webkit-box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.2);
+    box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.2);*/
+}
+.btn-primary:hover,
+.btn-primary:active,
+.btn-primary.active,
+.btn-primary.disabled,
+.btn-primary[disabled] {
+  border: 1px solid #0160C1;
+  background: #0160C1;
+}
+/*.btn-primary.active {
+  background-color: #c44012 \9;
+}*/
+$.btn-primary:active,
+.btn-primary:active {
+    background-color: #DD4814;
+    background-image: linear-gradient(bottom, rgb(199,66,18) 0%, rgb(236,94,43) 100%);
+    background-image: -o-linear-gradient(bottom, rgb(199,66,18) 0%, rgb(236,94,43) 100%);
+    background-image: -moz-linear-gradient(bottom, rgb(199,66,18) 0%, rgb(236,94,43) 100%);
+    background-image: -webkit-linear-gradient(bottom, rgb(199,66,18) 0%, rgb(236,94,43) 100%);
+    background-image: -ms-linear-gradient(bottom, rgb(199,66,18) 0%, rgb(236,94,43) 100%);
+    text-decoration: none;
+}
+
+.btn-warning {
+  background-color: #faa732;
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-image: -ms-linear-gradient(top, #fbb450, #f89406);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(top, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);
+  border-color: #f89406 #f89406 #ad6704;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-warning:hover,
+.btn-warning:active,
+.btn-warning.active,
+.btn-warning.disabled,
+.btn-warning[disabled] {
+  background-color: #f89406;
+}
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #c67605 \9;
+}
+.btn-danger {
+  background: #0074CD;
+  font-weight: bold;
+  /*background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: linear-gradient(top, #ee5f5b, #bd362f);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);
+  border-color: #bd362f #bd362f #802420;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);*/
+ border: 1px solid #0074CD;
+ color: #FFFFFF
+}
+
+.btn-danger.active,
+.btn-danger.disabled,
+.btn-danger[disabled], 
+.btn-danger.disabled:hover,
+.btn-danger[disabled]:hover {
+  background-color: #dde7ee;
+  color: #8193a1;
+  font-weight: bold;
+  font-size: 12px !important;
+  border: 1px solid #cedae2;
+}
+
+.btn-danger:hover,
+.btn-danger:active {
+	background: #0160c1;
+	border: 1px solid #0160c1;
+	color: #FFFFFF;
+}
+
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #942a25 \9;
+}
+.btn-success {
+  background-color: #5bb75b;
+  background-image: -moz-linear-gradient(top, #62c462, #51a351);
+  background-image: -ms-linear-gradient(top, #62c462, #51a351);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
+  background-image: -webkit-linear-gradient(top, #62c462, #51a351);
+  background-image: -o-linear-gradient(top, #62c462, #51a351);
+  background-image: linear-gradient(top, #62c462, #51a351);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);
+  border-color: #51a351 #51a351 #387038;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-success:hover,
+.btn-success:active,
+.btn-success.active,
+.btn-success.disabled,
+.btn-success[disabled] {
+  background-color: #51a351;
+}
+.btn-success:active,
+.btn-success.active {
+  background-color: #408140 \9;
+}
+.btn-info {
+  background-color: #49afcd;
+  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: linear-gradient(top, #5bc0de, #2f96b4);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);
+  border-color: #2f96b4 #2f96b4 #1f6377;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-info:hover,
+.btn-info:active,
+.btn-info.active,
+.btn-info.disabled,
+.btn-info[disabled] {
+  background-color: #2f96b4;
+}
+.btn-info:active,
+.btn-info.active {
+  background-color: #24748c \9;
+}
+.btn-inverse {
+  background-color: #393939;
+  background-image: -moz-linear-gradient(top, #454545, #262626);
+  background-image: -ms-linear-gradient(top, #454545, #262626);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#454545), to(#262626));
+  background-image: -webkit-linear-gradient(top, #454545, #262626);
+  background-image: -o-linear-gradient(top, #454545, #262626);
+  background-image: linear-gradient(top, #454545, #262626);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#454545', endColorstr='#262626', GradientType=0);
+  border-color: #262626 #262626 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-inverse:hover,
+.btn-inverse:active,
+.btn-inverse.active,
+.btn-inverse.disabled,
+.btn-inverse[disabled] {
+  background-color: #262626;
+}
+.btn-inverse:active,
+.btn-inverse.active {
+  background-color: #0c0c0c \9;
+}
+
+.btn-search {
+	margin-left: 0px !important;
+}
+
+button.btn,
+input[type="submit"].btn {
+  *padding-top: 2px;
+  *padding-bottom: 2px;
+}
+button.btn::-moz-focus-inner,
+input[type="submit"].btn::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+button.btn.large,
+input[type="submit"].btn.large {
+  *padding-top: 7px;
+  *padding-bottom: 7px;
+}
+button.btn.small,
+input[type="submit"].btn.small {
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+}
+.btn-group {
+  position: relative;
+  *zoom: 1;
+  margin: 0px;
+}
+.btn-group:before,
+.btn-group:after {
+  display: table;
+  content: "";
+}
+.btn-group:after {
+  clear: both;
+}
+.btn-group:first-child {
+  *margin-left: 0;
+}
+.btn-group + .btn-group {
+  margin-left: 5px;
+}
+.btn-toolbar {
+  margin-top: 9px;
+  margin-bottom: 9px;
+}
+.btn-toolbar .btn-group {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+}
+.btn-group .btn {
+  position: relative;
+  float: left;
+  margin-left: -1px;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.btn-group .btn:first-child {
+  margin-left: 0;
+  -webkit-border-top-left-radius: 3px;
+  -moz-border-radius-topleft: 3px;
+  border-top-left-radius: 3px;
+  -webkit-border-bottom-left-radius: 3px;
+  -moz-border-radius-bottomleft: 3px;
+  border-bottom-left-radius: 3px;
+}
+.btn-group .btn:last-child,
+.btn-group .dropdown-toggle {
+  -webkit-border-top-right-radius: 3px;
+  -moz-border-radius-topright: 3px;
+  border-top-right-radius: 3px;
+  -webkit-border-bottom-right-radius: 3px;
+  -moz-border-radius-bottomright: 3px;
+  border-bottom-right-radius: 3px;
+}
+.btn-group .btn.large:first-child {
+  margin-left: 0;
+  /*-webkit-border-top-left-radius: 6px;
+  -moz-border-radius-topleft: 6px;
+  border-top-left-radius: 6px;
+  -webkit-border-bottom-left-radius: 6px;
+  -moz-border-radius-bottomleft: 6px;
+  border-bottom-left-radius: 6px;*/
+}
+.btn-group .btn.large:last-child,
+.btn-group .large.dropdown-toggle {
+  /*-webkit-border-top-right-radius: 6px;
+  -moz-border-radius-topright: 6px;
+  border-top-right-radius: 6px;
+  -webkit-border-bottom-right-radius: 6px;
+  -moz-border-radius-bottomright: 6px;
+  border-bottom-right-radius: 6px;*/
+}
+.btn-group .btn:hover,
+.btn-group .btn:focus,
+.btn-group .btn:active,
+.btn-group .btn.active {
+  z-index: 2;
+}
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+.btn-group .dropdown-toggle {
+  padding-left: 8px;
+  padding-right: 8px;
+  -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+  *padding-top: 5px;
+  *padding-bottom: 5px;
+}
+.btn-group.open {
+  *z-index: 1000;
+}
+.btn-group.open .dropdown-menu {
+  display: block;
+  margin-top: 1px;
+  /*-webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;*/
+}
+.btn-group.open .dropdown-toggle {
+  background-image: none;
+  -webkit-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+.btn .caret {
+  margin-top: 7px;
+  margin-left: 0;
+}
+.btn:hover .caret,
+.open.btn-group .caret {
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+.btn-primary .caret,
+.btn-danger .caret,
+.btn-info .caret,
+.btn-success .caret,
+.btn-inverse .caret {
+  border-top-color: #ffffff;
+  opacity: 0.75;
+  filter: alpha(opacity=75);
+}
+.btn-small .caret {
+  margin-top: 4px;
+}
+.alert {
+  padding: 8px 35px 8px 14px;
+  margin-bottom: 18px;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  background-color: #fcf8e3;
+  border: 1px solid #fbeed5;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.alert,
+.alert-heading {
+  color: #c09853;
+}
+.alert .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  line-height: 18px;
+}
+.alert-success {
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+}
+.alert-success,
+.alert-success .alert-heading {
+  color: #468847;
+}
+.alert-danger,
+.alert-error {
+  background-color: #f2dede;
+  border-color: #eed3d7;
+}
+.alert-danger,
+.alert-error,
+.alert-danger .alert-heading,
+.alert-error .alert-heading {
+  color: #b94a48;
+}
+.alert-info {
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+}
+.alert-info,
+.alert-info .alert-heading {
+  color: #3a87ad;
+}
+.alert-block {
+  padding-top: 14px;
+  padding-bottom: 14px;
+}
+.alert-block > p,
+.alert-block > ul {
+  margin-bottom: 0;
+}
+.alert-block p + p {
+  margin-top: 5px;
+}
+.nav {
+  margin-left: 0;
+  margin-bottom: 18px;
+  list-style: none;
+}
+.nav > li > a {
+  display: block;
+}
+.nav > li > a:hover {
+  text-decoration: none;
+  background-color: #ebeced;
+}
+.nav .nav-header {
+  display: block;
+  padding: 3px 15px;
+  font-size: 11px;
+  font-weight: bold;
+  line-height: 18px;
+  color: #999999;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  text-transform: uppercase;
+}
+.nav li + .nav-header {
+  margin-top: 9px;
+}
+.nav-list {
+  padding-left: 14px;
+  padding-right: 14px;
+  margin-bottom: 0;
+}
+.nav-list > li > a,
+.nav-list .nav-header {
+  margin-left: -15px;
+  margin-right: -15px;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+.nav-list > li > a {
+  padding: 3px 15px;
+}
+.nav-list .active > a,
+.nav-list .active > a:hover {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
+  background-color: #0088cc;
+}
+.nav-list [class^="icon-"] {
+  margin-right: 2px;
+}
+.nav-tabs,
+.nav-pills {
+  *zoom: 1;
+}
+.nav-tabs:before,
+.nav-pills:before,
+.nav-tabs:after,
+.nav-pills:after {
+  display: table;
+  content: "";
+}
+.nav-tabs:after,
+.nav-pills:after {
+  clear: both;
+}
+.nav-tabs > li,
+.nav-pills > li {
+  float: left;
+}
+.nav-tabs > li > a,
+.nav-pills > li > a {
+  line-height: 33px;
+  text-align: center;
+}
+
+.nav-tabs > li {
+  margin-bottom: -1px;
+  margin-left: -1px;
+
+}
+.nav-tabs > li > a {
+  border: 1px solid #c4ced8;
+  border-top: none;
+  border-right: none;
+  width: 113px;
+}
+.nav-tabs > li > a:hover {
+}
+.nav-tabs > .active > a,
+.nav-tabs > .active > a:hover {
+  border: 1px solid #ddd;
+  border-top: none;
+  cursor: default;
+}
+.nav-pills > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  margin-top: 2px;
+  margin-bottom: 2px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.nav-pills .active > a,
+.nav-pills .active > a:hover {
+  color: #ffffff;
+  background-color: #0088cc;
+}
+.nav-stacked > li {
+  float: none;
+}
+.nav-stacked > li > a {
+  margin-right: 0;
+}
+.nav-tabs.nav-stacked {
+  border-bottom: 0;
+}
+.nav-tabs.nav-stacked > li > a {
+  border: 1px solid #ddd;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.nav-tabs.nav-stacked > li:first-child > a {
+  -webkit-border-radius: 4px 4px 0 0;
+  -moz-border-radius: 4px 4px 0 0;
+  border-radius: 4px 4px 0 0;
+}
+.nav-tabs.nav-stacked > li:last-child > a {
+  -webkit-border-radius: 0 0 4px 4px;
+  -moz-border-radius: 0 0 4px 4px;
+  border-radius: 0 0 4px 4px;
+}
+.nav-tabs.nav-stacked > li > a:hover {
+  border-color: #ddd;
+  z-index: 2;
+}
+.nav-pills.nav-stacked > li > a {
+  margin-bottom: 3px;
+}
+.nav-pills.nav-stacked > li:last-child > a {
+  margin-bottom: 1px;
+}
+.nav-tabs .dropdown-menu,
+.nav-pills .dropdown-menu {
+  margin-top: 1px;
+  border-width: 1px;
+}
+.nav-pills .dropdown-menu {
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.nav-tabs .dropdown-toggle .caret,
+.nav-pills .dropdown-toggle .caret {
+  border-top-color: #0088cc;
+  margin-top: 6px;
+}
+.nav-tabs .dropdown-toggle:hover .caret,
+.nav-pills .dropdown-toggle:hover .caret {
+  border-top-color: #005580;
+}
+.nav-tabs .active .dropdown-toggle .caret,
+.nav-pills .active .dropdown-toggle .caret {
+  border-top-color: #333333;
+}
+.nav > .dropdown.active > a:hover {
+  color: #000000;
+  cursor: pointer;
+}
+.nav-tabs .open .dropdown-toggle,
+.nav-pills .open .dropdown-toggle,
+.nav > .open.active > a:hover {
+  color: #ffffff;
+  background-color: #999999;
+  border-color: #999999;
+}
+.nav .open .caret,
+.nav .open.active .caret,
+.nav .open a:hover .caret {
+  border-top-color: #ffffff;
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+.tabs-stacked .open > a:hover {
+  border-color: #999999;
+}
+.tabbable {
+  *zoom: 1;
+}
+.tabbable:before,
+.tabbable:after {
+  display: table;
+  content: "";
+}
+.tabbable:after {
+  clear: both;
+}
+.tab-content {
+  overflow: hidden;
+}
+.tabs-below .nav-tabs,
+.tabs-right .nav-tabs,
+.tabs-left .nav-tabs {
+  border-bottom: 0;
+}
+.tab-content > .tab-pane,
+.pill-content > .pill-pane {
+  display: none;
+}
+.tab-content > .active,
+.pill-content > .active {
+  display: block;
+}
+.tabs-below .nav-tabs {
+  border-top: 1px solid #ddd;
+}
+.tabs-below .nav-tabs > li {
+  margin-top: -1px;
+  margin-bottom: 0;
+}
+.tabs-below .nav-tabs > li > a {
+  -webkit-border-radius: 0 0 4px 4px;
+  -moz-border-radius: 0 0 4px 4px;
+  border-radius: 0 0 4px 4px;
+}
+.tabs-below .nav-tabs > li > a:hover {
+  border-bottom-color: transparent;
+  border-top-color: #ddd;
+}
+.tabs-below .nav-tabs .active > a,
+.tabs-below .nav-tabs .active > a:hover {
+  border-color: transparent #ddd #ddd #ddd;
+}
+.tabs-left .nav-tabs > li,
+.tabs-right .nav-tabs > li {
+  float: none;
+}
+.tabs-left .nav-tabs > li > a,
+.tabs-right .nav-tabs > li > a {
+  min-width: 74px;
+  margin-right: 0;
+  margin-bottom: 3px;
+}
+.tabs-left .nav-tabs {
+  float: left;
+  margin-right: 19px;
+  border-right: 1px solid #ddd;
+}
+.tabs-left .nav-tabs > li > a {
+  margin-right: -1px;
+  -webkit-border-radius: 4px 0 0 4px;
+  -moz-border-radius: 4px 0 0 4px;
+  border-radius: 4px 0 0 4px;
+}
+.tabs-left .nav-tabs > li > a:hover {
+  border-color: #eeeeee #dddddd #eeeeee #eeeeee;
+}
+.tabs-left .nav-tabs .active > a,
+.tabs-left .nav-tabs .active > a:hover {
+  border-color: #ddd transparent #ddd #ddd;
+  *border-right-color: #ffffff;
+}
+.tabs-right .nav-tabs {
+  float: right;
+  margin-left: 19px;
+  border-left: 1px solid #ddd;
+}
+.tabs-right .nav-tabs > li > a {
+  margin-left: -1px;
+  -webkit-border-radius: 0 4px 4px 0;
+  -moz-border-radius: 0 4px 4px 0;
+  border-radius: 0 4px 4px 0;
+}
+.tabs-right .nav-tabs > li > a:hover {
+  border-color: #eeeeee #eeeeee #eeeeee #dddddd;
+}
+.tabs-right .nav-tabs .active > a,
+.tabs-right .nav-tabs .active > a:hover {
+  border-color: #ddd #ddd #ddd transparent;
+  *border-left-color: #ffffff;
+}
+.navbar {
+  overflow: visible;
+  margin-bottom: 18px;
+}
+.navbar-inner {
+  padding-left: 20px;
+  padding-right: 20px;
+  background-color: #2c2c2c;
+  background-image: -moz-linear-gradient(top, #333333, #222222);
+  background-image: -ms-linear-gradient(top, #333333, #222222);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));
+  background-image: -webkit-linear-gradient(top, #333333, #222222);
+  background-image: -o-linear-gradient(top, #333333, #222222);
+  background-image: linear-gradient(top, #333333, #222222);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
+  -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
+}
+.btn-navbar {
+  display: none;
+  float: right;
+  padding: 7px 10px;
+  margin-left: 5px;
+  margin-right: 5px;
+  background-color: #2c2c2c;
+  background-image: -moz-linear-gradient(top, #333333, #222222);
+  background-image: -ms-linear-gradient(top, #333333, #222222);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));
+  background-image: -webkit-linear-gradient(top, #333333, #222222);
+  background-image: -o-linear-gradient(top, #333333, #222222);
+  background-image: linear-gradient(top, #333333, #222222);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);
+  border-color: #222222 #222222 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+  -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+}
+.btn-navbar:hover,
+.btn-navbar:active,
+.btn-navbar.active,
+.btn-navbar.disabled,
+.btn-navbar[disabled] {
+  background-color: #222222;
+}
+.btn-navbar:active,
+.btn-navbar.active {
+  background-color: #080808 \9;
+}
+.btn-navbar .icon-bar {
+  display: block;
+  width: 18px;
+  height: 2px;
+  background-color: #f5f5f5;
+  -webkit-border-radius: 1px;
+  -moz-border-radius: 1px;
+  border-radius: 1px;
+  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+  -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+}
+.btn-navbar .icon-bar + .icon-bar {
+  margin-top: 3px;
+}
+.nav-collapse.collapse {
+  height: auto;
+}
+.navbar .brand:hover {
+  text-decoration: none;
+}
+.navbar .brand {
+  float: left;
+  display: block;
+  padding: 8px 20px 12px;
+  margin-left: -20px;
+  font-size: 20px;
+  font-weight: 200;
+  line-height: 1;
+  color: #ffffff;
+}
+.navbar .navbar-text {
+  margin-bottom: 0;
+  line-height: 40px;
+  color: #999999;
+}
+.navbar .navbar-text a:hover {
+  color: #ffffff;
+  background-color: transparent;
+}
+.navbar .btn,
+.navbar .btn-group {
+  margin-top: 5px;
+}
+.navbar .btn-group .btn {
+  margin-top: 0;
+}
+.navbar-form {
+  margin-bottom: 0;
+  *zoom: 1;
+}
+.navbar-form:before,
+.navbar-form:after {
+  display: table;
+  content: "";
+}
+.navbar-form:after {
+  clear: both;
+}
+.navbar-form input,
+.navbar-form select {
+  display: inline-block;
+  margin-top: 5px;
+  margin-bottom: 0;
+}
+.navbar-form .radio,
+.navbar-form .checkbox {
+  margin-top: 5px;
+}
+.navbar-form input[type="image"],
+.navbar-form input[type="checkbox"],
+.navbar-form input[type="radio"] {
+  margin-top: 3px;
+}
+.navbar-form .input-append,
+.navbar-form .input-prepend {
+  margin-top: 6px;
+  white-space: nowrap;
+}
+.navbar-form .input-append input,
+.navbar-form .input-prepend input {
+  margin-top: 0;
+}
+.navbar-search {
+  position: relative;
+  float: left;
+  margin-top: 6px;
+  margin-bottom: 0;
+}
+.navbar-search .search-query {
+  padding: 4px 9px;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 13px;
+  font-weight: normal;
+  line-height: 1;
+  color: #ffffff;
+  color: rgba(255, 255, 255, 0.75);
+  background: #666;
+  background: rgba(255, 255, 255, 0.3);
+  border: 1px solid #111;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+  -webkit-transition: none;
+  -moz-transition: none;
+  -ms-transition: none;
+  -o-transition: none;
+  transition: none;
+}
+.navbar-search .search-query :-moz-placeholder {
+  color: #eeeeee;
+}
+.navbar-search .search-query ::-webkit-input-placeholder {
+  color: #eeeeee;
+}
+.navbar-search .search-query:hover {
+  color: #ffffff;
+  background-color: #999999;
+  background-color: rgba(255, 255, 255, 0.5);
+}
+.navbar-search .search-query:focus,
+.navbar-search .search-query.focused {
+  padding: 5px 10px;
+  color: #333333;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #ffffff;
+  border: 0;
+  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+  -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+  box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+  outline: 0;
+}
+.navbar-fixed-top {
+  position: fixed;
+  top: 0;
+  right: 0;
+  left: 0;
+  z-index: 1030;
+}
+.navbar-fixed-top .navbar-inner {
+  padding-left: 0;
+  padding-right: 0;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.navbar .nav {
+  position: relative;
+  left: 0;
+  display: block;
+  float: left;
+  margin: 0 10px 0 0;
+}
+.navbar .nav.pull-right {
+  float: right;
+}
+.navbar .nav > li {
+  display: block;
+  float: left;
+}
+.navbar .nav > li > a {
+  float: none;
+  padding: 10px 10px 11px;
+  line-height: 19px;
+  color: #999999;
+  text-decoration: none;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.navbar .nav > li > a:hover {
+  background-color: transparent;
+  color: #ffffff;
+  text-decoration: none;
+}
+.navbar .nav .active > a,
+.navbar .nav .active > a:hover {
+  color: #ffffff;
+  text-decoration: none;
+  background-color: #222222;
+}
+.navbar .divider-vertical {
+  height: 40px;
+  width: 1px;
+  margin: 0 9px;
+  overflow: hidden;
+  background-color: #222222;
+  border-right: 1px solid #333333;
+}
+.navbar .nav.pull-right {
+  margin-left: 10px;
+  margin-right: 0;
+}
+.navbar .dropdown-menu {
+  margin-top: 1px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.navbar .dropdown-menu:before {
+  content: '';
+  display: inline-block;
+  border-left: 7px solid transparent;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #ccc;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  position: absolute;
+  top: -7px;
+  left: 9px;
+}
+.navbar .dropdown-menu:after {
+  content: '';
+  display: inline-block;
+  border-left: 6px solid transparent;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #ffffff;
+  position: absolute;
+  top: -6px;
+  left: 10px;
+}
+.navbar .nav .dropdown-toggle .caret,
+.navbar .nav .open.dropdown .caret {
+  border-top-color: #ffffff;
+}
+.navbar .nav .active .caret {
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+.navbar .nav .open > .dropdown-toggle,
+.navbar .nav .active > .dropdown-toggle,
+.navbar .nav .open.active > .dropdown-toggle {
+  background-color: transparent;
+}
+.navbar .nav .active > .dropdown-toggle:hover {
+  color: #ffffff;
+}
+.navbar .nav.pull-right .dropdown-menu {
+  left: auto;
+  right: 0;
+}
+.navbar .nav.pull-right .dropdown-menu:before {
+  left: auto;
+  right: 12px;
+}
+.navbar .nav.pull-right .dropdown-menu:after {
+  left: auto;
+  right: 13px;
+}
+.breadcrumb {
+  padding: 7px 14px;
+  margin: 0 0 18px;
+  background-color: #fbfbfb;
+  background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5);
+  background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));
+  background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5);
+  background-image: -o-linear-gradient(top, #ffffff, #f5f5f5);
+  background-image: linear-gradient(top, #ffffff, #f5f5f5);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);
+  border: 1px solid #ddd;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+  -webkit-box-shadow: inset 0 1px 0 #ffffff;
+  -moz-box-shadow: inset 0 1px 0 #ffffff;
+  box-shadow: inset 0 1px 0 #ffffff;
+}
+.breadcrumb li {
+  display: inline-block;
+  text-shadow: 0 1px 0 #ffffff;
+}
+.breadcrumb .divider {
+  padding: 0 5px;
+  color: #999999;
+}
+.breadcrumb .active a {
+  color: #333333;
+}
+.pagination {
+  height: 36px;
+  margin: 18px 0;
+}
+.pagination ul {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+  margin-left: 0;
+  margin-bottom: 0;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+.pagination li {
+  display: inline;
+}
+.pagination a {
+  float: left;
+  padding: 0 14px;
+  line-height: 34px;
+  text-decoration: none;
+  border: 1px solid #ddd;
+  border-left-width: 0;
+}
+.pagination a:hover,
+.pagination .active a {
+  background-color: #f5f5f5;
+}
+.pagination .active a {
+  color: #999999;
+  cursor: default;
+}
+.pagination .disabled a,
+.pagination .disabled a:hover {
+  color: #999999;
+  background-color: transparent;
+  cursor: default;
+}
+.pagination li:first-child a {
+  border-left-width: 1px;
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.pagination li:last-child a {
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+.pagination-centered {
+  text-align: center;
+}
+.pagination-right {
+  text-align: right;
+}
+.pager {
+  margin-left: 0;
+  margin-bottom: 18px;
+  list-style: non