Merge lp:~blake-rouse/maas/fix-1484696-2-1.8 into lp:maas/trunk

Proposed by Blake Rouse on 2015-09-25
Status: Superseded
Proposed branch: lp:~blake-rouse/maas/fix-1484696-2-1.8
Merge into: lp:maas/trunk
Diff against target: 4031 lines (+3119/-47) (has conflicts)
40 files modified
Makefile (+7/-0)
docs/changelog.rst (+72/-0)
docs/conf.py (+1/-1)
docs/index.rst (+1/-0)
docs/os-support.rst (+124/-0)
src/maasserver/api/tests/test_maas.py (+78/-0)
src/maasserver/clusterrpc/boot_images.py (+59/-0)
src/maasserver/clusterrpc/tests/test_boot_images.py (+62/-0)
src/maasserver/dns/tests/test_config.py (+4/-3)
src/maasserver/fields.py (+30/-0)
src/maasserver/migrations/0139_power_parameters_and_state_updated_field.py (+453/-0)
src/maasserver/models/tests/test_node.py (+5/-0)
src/maasserver/node_action.py (+13/-0)
src/maasserver/plugin.py (+14/-0)
src/maasserver/rpc/nodes.py (+31/-0)
src/maasserver/rpc/tests/test_nodes.py (+12/-1)
src/maasserver/rpc/tests/test_regionservice.py (+15/-0)
src/maasserver/static/css/maas-styles.css (+4/-0)
src/maasserver/static/img/icons/tag-close.svg (+18/-0)
src/maasserver/static/partials/node-details.html (+67/-0)
src/maasserver/static/partials/node-events.html (+4/-0)
src/maasserver/static/partials/nodes-list.html (+10/-0)
src/maasserver/static/scss/maas/components/_placeholders.scss (+4/-0)
src/maasserver/testing/factory.py (+17/-0)
src/maasserver/tests/test_fields.py (+38/-0)
src/maasserver/tests/test_node_action.py (+88/-32)
src/maasserver/tests/test_plugin.py (+22/-0)
src/maasserver/utils/osystems.py (+27/-0)
src/maasserver/utils/tests/test_osystems.py (+47/-0)
src/maasserver/views/tests/test_rpc.py (+13/-2)
src/maasserver/websockets/handlers/node.py (+32/-0)
src/provisioningserver/drivers/power/__init__.py (+4/-0)
src/provisioningserver/plugin.py (+7/-0)
src/provisioningserver/power/__init__.py (+170/-0)
src/provisioningserver/power/tests/test_power.py (+1001/-0)
src/provisioningserver/tests/test_plugin.py (+20/-8)
src/provisioningserver/utils/fs.py (+4/-0)
src/provisioningserver/utils/tests/test_fs.py (+14/-0)
src/provisioningserver/utils/tests/test_isc.py (+279/-0)
utilities/maas-region-support-dump (+248/-0)
Text conflict in Makefile
Text conflict in docs/changelog.rst
Text conflict in docs/os-support.rst
Text conflict in src/maasserver/api/tests/test_maas.py
Text conflict in src/maasserver/clusterrpc/boot_images.py
Text conflict in src/maasserver/clusterrpc/tests/test_boot_images.py
Text conflict in src/maasserver/fields.py
Conflict adding file src/maasserver/migrations/0139_power_parameters_and_state_updated_field.py.  Moved existing file to src/maasserver/migrations/0139_power_parameters_and_state_updated_field.py.moved.
Text conflict in src/maasserver/models/tests/test_node.py
Text conflict in src/maasserver/node_action.py
Text conflict in src/maasserver/rpc/nodes.py
Text conflict in src/maasserver/rpc/tests/test_nodes.py
Text conflict in src/maasserver/rpc/tests/test_regionservice.py
Text conflict in src/maasserver/static/css/maas-styles.css
Text conflict in src/maasserver/static/partials/node-details.html
Text conflict in src/maasserver/static/partials/node-events.html
Text conflict in src/maasserver/static/partials/nodes-list.html
Text conflict in src/maasserver/static/scss/maas/components/_placeholders.scss
Text conflict in src/maasserver/testing/factory.py
Text conflict in src/maasserver/tests/test_fields.py
Text conflict in src/maasserver/tests/test_node_action.py
Text conflict in src/maasserver/tests/test_plugin.py
Text conflict in src/maasserver/utils/osystems.py
Text conflict in src/maasserver/utils/tests/test_osystems.py
Text conflict in src/maasserver/views/tests/test_rpc.py
Text conflict in src/maasserver/websockets/handlers/node.py
Text conflict in src/provisioningserver/drivers/power/__init__.py
Text conflict in src/provisioningserver/plugin.py
Text conflict in src/provisioningserver/power/__init__.py
Text conflict in src/provisioningserver/power/tests/test_power.py
Text conflict in src/provisioningserver/tests/test_plugin.py
Text conflict in src/provisioningserver/utils/fs.py
Text conflict in src/provisioningserver/utils/tests/test_fs.py
Text conflict in src/provisioningserver/utils/tests/test_isc.py
Conflict adding file utilities/maas-region-support-dump.  Moved existing file to utilities/maas-region-support-dump.moved.
To merge this branch: bzr merge lp:~blake-rouse/maas/fix-1484696-2-1.8
Reviewer Review Type Date Requested Status
MAAS Maintainers 2015-09-25 Pending
Review via email: mp+272406@code.launchpad.net

This proposal has been superseded by a proposal from 2015-09-25.

Commit message

Only include the ':' in _buildUrl if a port is defined.

This fixes an issue where if the ':' is included apache will not proxy the connection.

To post a comment you must log in.

Unmerged revisions

4046. By Blake Rouse on 2015-09-25

Link bug.

4045. By Blake Rouse on 2015-09-25

Backport bug-1484696.

4044. By Mike Pontillo on 2015-09-18

[r=blake-rouse][bug=1491898][author=mpontillo] Backport HPDSA drivers.yaml change from trunk to 1.8.

4043. By Mike Pontillo on 2015-09-14

[r=allenap][bug=][author=mpontillo] Backport support dump utility for use with MAAS 1.8.

4042. By Gavin Panella on 2015-09-04

[r=allenap][bug=1491822][author=allenap] Backport r4236 from trunk: In the system monitor, decode output from the init system as UTF-8.

Always invoke the init system using the C.UTF-8 locale. Previously LANG=en_US.UTF-8 and LC_CTYPE=C was used.

4041. By Andres Rodriguez on 2015-08-25

[r=andreserl][bug=][author=andreserl] Update 1.8.2 Changelog

4040. By Blake Rouse on 2015-08-25

[r=allenap][bug=1484696][author=blake-rouse] Regenerate the connection URL on websocket client reconnect.

4039. By Blake Rouse on 2015-08-19

[r=blake-rouse][bug=1445942][author=blake-rouse] Validate the osystem and distro_series when using the deploy action. Strip the ending '*' on releases that accept a license key.

4038. By Blake Rouse on 2015-08-17

[r=blake-rouse][bug=][author=blake-rouse] Delete the dhcpd.conf and dhcpd6.conf when not in use.

4037. By Andres Rodriguez on 2015-08-12

[r=andreserl][bug=1459865][author=andreserl] Backport rev4182: Fix enlistment by ensuring correct kernel parameters are being passed & update changelog.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'HACKING.txt'
2=== modified file 'Makefile'
3--- Makefile 2015-09-17 21:15:12 +0000
4+++ Makefile 2015-09-25 14:32:35 +0000
5@@ -500,6 +500,7 @@
6
7 # This ought to be as simple as using bzr builddeb --export-upstream but it
8 # has a bug and always considers apt-source tarballs before the specified
9+<<<<<<< TREE
10 # branch. Instead, export to a local tarball which is always found. Make sure
11 # the packages listed in `required-packages/build` are installed before using
12 # this.
13@@ -507,6 +508,12 @@
14 # Old names.
15 PACKAGING := $(abspath ../packaging.trunk)
16 PACKAGING_BRANCH := lp:~maas-maintainers/maas/packaging
17+=======
18+# branch. So instead, export to a local tarball which is always found.
19+# Make sure debhelper and dh-apport packages are installed before using this.
20+PACKAGING := $(CURDIR)/../packaging-1.8
21+PACKAGING_BRANCH := lp:~maas-maintainers/maas/packaging-1.8
22+>>>>>>> MERGE-SOURCE
23
24 packaging-tree = $(PACKAGING)
25 packaging-branch = $(PACKAGING_BRANCH)
26
27=== modified file 'buildout.cfg'
28=== modified file 'docs/changelog.rst'
29--- docs/changelog.rst 2015-09-24 17:19:06 +0000
30+++ docs/changelog.rst 2015-09-25 14:32:35 +0000
31@@ -2,6 +2,7 @@
32 Changelog
33 =========
34
35+<<<<<<< TREE
36
37 1.9.0 (alpha2)
38 ==============
39@@ -220,6 +221,77 @@
40 #1459710 [UI] "Set zone" label oddly placed on node listing page
41
42
43+=======
44+
45+1.8.2
46+=====
47+
48+See https://launchpad.net/maas/+milestone/1.8.2 for full details.
49+
50+Bug Fix Update
51+--------------
52+
53+#1484696 Regenerate the connection URL on websocket client reconnect, to fix
54+ CSRF after upgrade to 1.8.1.
55+
56+#1445942 Validate the osystem and distro_series when using the deploy action,
57+ which fixes win2012r2 deployment issues.
58+
59+#1481940 Fix failure in MAAS startup messages by not generating dhcpd config
60+ files when they are not in use.
61+
62+#1459865 Fix enlistment to always use the correct kernel parameters.
63+
64+
65+1.8.1
66+=====
67+
68+See https://launchpad.net/maas/+milestone/1.8.1 for full details.
69+
70+Bug Fix Update
71+--------------
72+
73+#1481118 Add --username to maas-region-admin apikey command docs.
74+
75+#1472707 Add ListBootImagesV2 RPC command. Fallback to using ListBootImages RPC
76+ when the ListBootImagesV2 is not handled on the cluster.
77+
78+#1470591 Fix setting the default_distro_series over the API.
79+
80+#1413388 Fix upgrade issue where it would remove custom DNS config, potentially breaking DNS
81+
82+#1317705 Commissioning x86_64 node never completes, sitting at grub prompt, pserv py tbs
83+
84+#1389007 Power monitor service hits amp.TooLong errors with > ~600 nodes to a cluster
85+
86+#1436279 Websocket server accessed over port 5240
87+
88+#1469305 If hostname not set, sudo warning make maas throw 500
89+
90+#1470585 Can't set a list of forwarders (BIND config)
91+
92+#1469846 UCS chassis enlist Failed to probe and enlist UCS nodes: list index out of range
93+
94+#1470276 Add cisco snic to 3rd party driver
95+
96+#1402042 console= parameters need to be added before -- on kernel cmdline
97+
98+#1465722 [UI] Machine details styling
99+
100+#1465737 [UI] Actions design styles
101+
102+#1465740 [UI] Replace close "X" with correct versions
103+
104+#1465742 [UI] Table design styles
105+
106+#1470389 [UI] Make table heading hover consistant with nodes/devices tabs
107+
108+#1470395 [UI] adding between node name and save button inconsistent
109+
110+#1459710 [UI] "Set zone" label oddly placed on node listing page
111+
112+
113+>>>>>>> MERGE-SOURCE
114 1.8.0
115 =====
116
117
118=== modified file 'docs/conf.py'
119--- docs/conf.py 2015-05-28 14:48:15 +0000
120+++ docs/conf.py 2015-09-25 14:32:35 +0000
121@@ -100,7 +100,7 @@
122 # built documents.
123 #
124 # The short X.Y version.
125-version = doc_versions.items()[0][0]
126+version = '1.8'
127 # The full version, including alpha/beta/rc tags.
128 release = version
129
130
131=== modified file 'docs/index.rst'
132--- docs/index.rst 2015-09-15 18:14:16 +0000
133+++ docs/index.rst 2015-09-25 14:32:35 +0000
134@@ -67,6 +67,7 @@
135 storage
136 networking
137 devices
138+ os-support
139
140
141 ******************
142
143=== modified file 'docs/os-support.rst'
144--- docs/os-support.rst 2015-09-08 18:41:57 +0000
145+++ docs/os-support.rst 2015-09-25 14:32:35 +0000
146@@ -1,3 +1,4 @@
147+<<<<<<< TREE
148 .. -*- mode: rst -*-
149
150 .. _os-support:
151@@ -119,3 +120,126 @@
152
153 $ maas admin boot-resources create name=centos/centos7
154 architecture=amd64/generic content@=./build-output/centos7-amd64-root-tgz
155+=======
156+.. -*- mode: rst -*-
157+
158+.. _os-support:
159+
160+=========================
161+Operating Systems Support
162+=========================
163+
164+.. note::
165+
166+ This feature is available in MAAS versions 1.7 and above.
167+
168+Besides Ubuntu, MAAS allows users to deploy different operating
169+systems, such as CentOS. Ubuntu Advantage customers can
170+additionally deploy Redhat Enterprise Linux (RHEL), OpenSUSE, SLES,
171+Window Server and Windows HyperV.
172+
173+
174+Generated Images vs. Custom Images
175+----------------------------------
176+
177+MAAS supports two different classes of OS images, `Generated images`
178+and `Custom images`.
179+
180+`Generated images` are images of the OS' that MAAS team fully
181+supports. Currently supported OS' are CentOS and Windows.
182+
183+`Custom images` are images that MAAS can deploy, but may have been
184+customized and differ from those that the MAAS team supports. Custom
185+images can include any Ubuntu, CentOS or Windows image. Additionally,
186+Redhat Enterprise Linux (RHEL), OpenSUSE and SLES images also fall
187+under this category.
188+
189+
190+Installing MAAS Images
191+----------------------
192+
193+Installing Generated Images
194+^^^^^^^^^^^^^^^^^^^^^^^^^^^
195+
196+Installing MAAS Generated Images (CentOS or Windows) can be done with
197+the command::
198+
199+ $ maas admin boot-resources create name=<os/series>
200+ architecture=<architecture> [filetype=ddtgz]
201+ content@=<image-name>
202+
203+The list of supported Operating Systems under `Generated Images` is:
204+
205+ * CentOS 6.5 (centos/centos65)
206+ * CentOS 7 (centos/centos7)
207+ * Windows Server 2012 (windows/win2012)
208+ * Windows Server 2012 R2 (windows/win2012r2)
209+ * Windows Hyper-V (windows/win2012hv)
210+ * Windows Hyper-V R2 (windows/win2012hvr2)
211+
212+Examples::
213+
214+ $ maas admin boot-resources create name=centos/centos7
215+ architecture=amd64/generic content@=centos7-amd64-root-tgz
216+
217+ $ maas admin boot-resources create name=windows/win2012
218+ architecture=amd64/generic filetype=ddtgz
219+ content@=win2012-amd64-ddtgz
220+
221+Installing Custom Images
222+^^^^^^^^^^^^^^^^^^^^^^^^
223+
224+Installing custom images require the user to specify a unique
225+identifier for the OS and Release, as well as the title of the
226+Image::
227+
228+ $ maas admin boot-resources create name=custom/<os-release-id>
229+ title=<title> architecture=amd64/generic content@=<image-name>
230+
231+Examples::
232+
233+ $ maas admin boot-resources create name=custom/rhel7
234+ title="RedHat Enterprise Linux 7" architecture=amd64/generic
235+ content@=rhel7-amd64-root-tgz
236+
237+The list of tested Operating Systems under `Custom Images` is:
238+
239+ * OpenSUSE
240+ * SLES 11 and SLES 12
241+ * Redhat Enterprise Linux 7 (RHEL7)
242+
243+
244+MAAS Image Builder
245+------------------
246+
247+The MAAS Image Builder is a script that allows users to generate their
248+own images. However, ``maas-image-builder`` only supports the generation
249+of CentOS and RHEL images. To install ``maas-image-builder``, please
250+follow the instructions::
251+
252+ $ sudo apt-get add-apt-repository ppa:maas-maintainers/stable
253+ $ sudo apt-get install maas-image-builder
254+
255+
256+Creating and Installing CentOS MAAS Images
257+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
258+
259+.. note::
260+
261+ Supported CentOS versions are CentOS 6.5 (centos65) and CentOS 7 (centos7).
262+
263+
264+To create a MAAS CentOS image, no ISO is needed as all of the required
265+software to create the image is downloaded (from CentOS repositories) as part
266+of the image generation process. To create the MAAS CentOS image,
267+``maas-image-builder`` can be used as::
268+
269+ $ maas-image-builder -a amd64 -o centos7-amd64-root-tgz centos --edition 7
270+
271+The created image, ``centos7-amd64-root-tgz``, needs to be uploaded into the
272+MAAS Region Controller. This image will be listed under the `Generated` Image
273+Section in the `MAAS Image` page. This image can be uploaded with::
274+
275+ $ maas admin boot-resources create name=centos/centos7
276+ architecture=amd64/generic content@=./build-output/centos7-amd64-root-tgz
277+>>>>>>> MERGE-SOURCE
278
279=== modified file 'required-packages/base'
280=== modified file 'src/maasserver/api/nodegroups.py'
281=== modified file 'src/maasserver/api/nodes.py'
282=== modified file 'src/maasserver/api/tests/test_events.py'
283=== modified file 'src/maasserver/api/tests/test_maas.py'
284--- src/maasserver/api/tests/test_maas.py 2015-09-24 19:54:30 +0000
285+++ src/maasserver/api/tests/test_maas.py 2015-09-25 14:32:35 +0000
286@@ -1,3 +1,4 @@
287+<<<<<<< TREE
288 # Copyright 2015 Canonical Ltd. This software is licensed under the
289 # GNU Affero General Public License version 3 (see the file LICENSE).
290
291@@ -73,3 +74,80 @@
292 })
293 self.assertEquals(
294 httplib.BAD_REQUEST, response.status_code, response.content)
295+=======
296+# Copyright 2013-2015 Canonical Ltd. This software is licensed under the
297+# GNU Affero General Public License version 3 (see the file LICENSE).
298+
299+"""Tests for maas endpoint in the API."""
300+
301+from __future__ import (
302+ absolute_import,
303+ print_function,
304+ unicode_literals,
305+ )
306+
307+str = None
308+
309+__metaclass__ = type
310+__all__ = []
311+
312+import httplib
313+
314+from django.core.urlresolvers import reverse
315+from maasserver.models.config import Config
316+from maasserver.testing.api import APITestCase
317+from maasserver.testing.factory import factory
318+from maasserver.testing.osystems import (
319+ make_osystem_with_releases,
320+ make_usable_osystem,
321+ patch_usable_osystems,
322+)
323+
324+
325+class MAASHandlerAPITest(APITestCase):
326+
327+ def test_get_config_default_distro_series(self):
328+ self.become_admin()
329+ default_distro_series = factory.make_name("distro_series")
330+ Config.objects.set_config(
331+ "default_distro_series", default_distro_series)
332+ response = self.client.get(
333+ reverse('maas_handler'), {
334+ "op": "get_config",
335+ "name": "default_distro_series",
336+ })
337+ self.assertEquals(httplib.OK, response.status_code, response.content)
338+ self.assertEquals('"%s"' % default_distro_series, response.content)
339+
340+ def test_set_config_default_distro_series(self):
341+ self.become_admin()
342+ osystem = make_usable_osystem(self)
343+ Config.objects.set_config("default_osystem", osystem['name'])
344+ selected_release = osystem['releases'][0]['name']
345+ response = self.client.post(
346+ reverse('maas_handler'), {
347+ "op": "set_config",
348+ "name": "default_distro_series",
349+ "value": selected_release,
350+ })
351+ self.assertEquals(httplib.OK, response.status_code, response.content)
352+ self.assertEquals(
353+ selected_release,
354+ Config.objects.get_config("default_distro_series"))
355+
356+ def test_set_config_only_default_osystem_are_valid_for_distro_series(self):
357+ self.become_admin()
358+ default_osystem = make_osystem_with_releases(self)
359+ other_osystem = make_osystem_with_releases(self)
360+ patch_usable_osystems(self, [default_osystem, other_osystem])
361+ Config.objects.set_config("default_osystem", default_osystem['name'])
362+ invalid_release = other_osystem['releases'][0]['name']
363+ response = self.client.post(
364+ reverse('maas_handler'), {
365+ "op": "set_config",
366+ "name": "default_distro_series",
367+ "value": invalid_release,
368+ })
369+ self.assertEquals(
370+ httplib.BAD_REQUEST, response.status_code, response.content)
371+>>>>>>> MERGE-SOURCE
372
373=== modified file 'src/maasserver/api/tests/test_nodegroup.py'
374=== modified file 'src/maasserver/clusterrpc/boot_images.py'
375--- src/maasserver/clusterrpc/boot_images.py 2015-09-24 19:48:38 +0000
376+++ src/maasserver/clusterrpc/boot_images.py 2015-09-25 14:32:35 +0000
377@@ -24,6 +24,7 @@
378
379 from collections import Sequence
380 from functools import partial
381+<<<<<<< TREE
382 from itertools import (
383 imap,
384 izip,
385@@ -32,6 +33,9 @@
386 ParseResult,
387 urlparse,
388 )
389+=======
390+from itertools import imap
391+>>>>>>> MERGE-SOURCE
392
393 from maasserver.rpc import (
394 getAllClients,
395@@ -44,6 +48,7 @@
396 ImportBootImages,
397 IsImportBootImagesRunning,
398 ListBootImages,
399+<<<<<<< TREE
400 ListBootImagesV2,
401 )
402 from provisioningserver.rpc.exceptions import NoConnectionsAvailable
403@@ -59,6 +64,12 @@
404 )
405 from twisted.protocols.amp import UnhandledCommand
406 from twisted.python import log
407+=======
408+ ListBootImagesV2,
409+)
410+from provisioningserver.utils.twisted import synchronous
411+from twisted.protocols.amp import UnhandledCommand
412+>>>>>>> MERGE-SOURCE
413 from twisted.python.failure import Failure
414
415
416@@ -116,6 +127,7 @@
417 30 seconds.
418 """
419 client = getClientFor(nodegroup.uuid, timeout=1)
420+<<<<<<< TREE
421 try:
422 call = client(ListBootImagesV2)
423 return call.wait(30).get("images")
424@@ -173,6 +185,53 @@
425 images = frozenset()
426 # Return using the same format as get_boot_images.
427 return list(dict(image) for image in images)
428+=======
429+ try:
430+ call = client(ListBootImagesV2)
431+ return call.wait(30).get("images")
432+ except UnhandledCommand:
433+ call = client(ListBootImages)
434+ return call.wait(30).get("images")
435+
436+
437+@synchronous
438+def _get_available_boot_images():
439+ """Obtain boot images available on connected clusters."""
440+ listimages_v1 = lambda client: partial(client, ListBootImages)
441+ listimages_v2 = lambda client: partial(client, ListBootImagesV2)
442+ clients_v2 = getAllClients()
443+ responses_v2 = async.gather(imap(listimages_v2, clients_v2))
444+ clients_v1 = []
445+ for i, response in enumerate(responses_v2):
446+ if (isinstance(response, Failure) and
447+ response.check(UnhandledCommand) is not None):
448+ clients_v1.append(clients_v2[i])
449+ elif not isinstance(response, Failure):
450+ # Convert each image to a frozenset of its items.
451+ yield frozenset(
452+ frozenset(image.viewitems())
453+ for image in response["images"]
454+ )
455+ responses_v1 = async.gather(imap(listimages_v1, clients_v1))
456+ for response in suppress_failures(responses_v1):
457+ # Convert each image to a frozenset of its items.
458+ yield frozenset(
459+ frozenset(image.viewitems())
460+ for image in response["images"]
461+ )
462+
463+
464+@synchronous
465+def get_available_boot_images():
466+ """Obtain boot images that are available on all clusters."""
467+ image_sets = list(_get_available_boot_images())
468+ if len(image_sets) > 0:
469+ images = frozenset.intersection(*image_sets)
470+ else:
471+ images = frozenset()
472+ # Return using the same format as get_boot_images.
473+ return list(dict(image) for image in images)
474+>>>>>>> MERGE-SOURCE
475
476
477 @synchronous
478
479=== modified file 'src/maasserver/clusterrpc/tests/test_boot_images.py'
480--- src/maasserver/clusterrpc/tests/test_boot_images.py 2015-09-24 19:48:38 +0000
481+++ src/maasserver/clusterrpc/tests/test_boot_images.py 2015-09-25 14:32:35 +0000
482@@ -17,8 +17,12 @@
483 import os
484 import random
485
486+<<<<<<< TREE
487 from maasserver.bootresources import get_simplestream_endpoint
488 from maasserver.clusterrpc import boot_images as boot_images_module
489+=======
490+from maasserver.clusterrpc import boot_images as boot_images_module
491+>>>>>>> MERGE-SOURCE
492 from maasserver.clusterrpc.boot_images import (
493 get_all_available_boot_images,
494 get_boot_images,
495@@ -44,6 +48,7 @@
496 )
497 from maasserver.testing.factory import factory
498 from maasserver.testing.testcase import MAASServerTestCase
499+<<<<<<< TREE
500 from maastesting.matchers import (
501 MockCalledOnceWith,
502 MockCallsMatch,
503@@ -56,6 +61,16 @@
504 call,
505 MagicMock,
506 )
507+=======
508+from maastesting.matchers import (
509+ MockCalledOnceWith,
510+ MockCallsMatch,
511+)
512+from mock import (
513+ call,
514+ MagicMock,
515+)
516+>>>>>>> MERGE-SOURCE
517 from provisioningserver.boot.tests import test_tftppath
518 from provisioningserver.boot.tftppath import (
519 compose_image_path,
520@@ -65,16 +80,24 @@
521 boot_images,
522 clusterservice,
523 )
524+<<<<<<< TREE
525 from provisioningserver.rpc.cluster import (
526 ImportBootImages,
527 ListBootImages,
528 ListBootImagesV2,
529 )
530 from provisioningserver.rpc.exceptions import NoConnectionsAvailable
531+=======
532+from provisioningserver.rpc.cluster import (
533+ ListBootImages,
534+ ListBootImagesV2,
535+)
536+>>>>>>> MERGE-SOURCE
537 from provisioningserver.testing.boot_images import (
538 make_boot_image_storage_params,
539 make_image,
540 )
541+<<<<<<< TREE
542 from provisioningserver.testing.config import ClusterConfigurationFixture
543 from testtools.matchers import (
544 IsInstance,
545@@ -94,6 +117,14 @@
546
547 def make_image_dir(image_params, tftp_root):
548 """Fake a boot image matching `image_params` under `tftp_root`."""
549+=======
550+from twisted.internet.defer import succeed
551+from twisted.protocols.amp import UnhandledCommand
552+
553+
554+def make_image_dir(image_params, tftproot):
555+ """Fake a boot image matching `image_params` under `tftproot`."""
556+>>>>>>> MERGE-SOURCE
557 image_dir = locate_tftp_path(
558 compose_image_path(
559 osystem=image_params['osystem'],
560@@ -346,6 +377,37 @@
561
562 self.assertItemsEqual(images, self.get())
563
564+ def test_fallback_to_ListBootImages_on_old_clusters(self):
565+ nodegroup_1 = factory.make_NodeGroup()
566+ nodegroup_1.accept()
567+ nodegroup_2 = factory.make_NodeGroup()
568+ nodegroup_2.accept()
569+ nodegroup_3 = factory.make_NodeGroup()
570+ nodegroup_3.accept()
571+
572+ images = [make_rpc_boot_image() for _ in range(3)]
573+
574+ # Limit the region's event loop to only the "rpc" service.
575+ self.useFixture(RegionEventLoopFixture("rpc"))
576+ # Now start the region's event loop.
577+ self.useFixture(RunningEventLoopFixture())
578+ # This fixture allows us to simulate mock clusters.
579+ rpc = self.useFixture(MockLiveRegionToClusterRPCFixture())
580+
581+ # This simulates an older cluster, one without ListBootImagesV2.
582+ cluster_1 = rpc.makeCluster(nodegroup_1, ListBootImages)
583+ cluster_1.ListBootImages.return_value = succeed({'images': images})
584+
585+ # This simulates a newer cluster, one with ListBootImagesV2.
586+ cluster_2 = rpc.makeCluster(nodegroup_2, ListBootImagesV2)
587+ cluster_2.ListBootImagesV2.return_value = succeed({'images': images})
588+
589+ # This simulates a broken cluster.
590+ cluster_3 = rpc.makeCluster(nodegroup_3, ListBootImagesV2)
591+ cluster_3.ListBootImagesV2.side_effect = ZeroDivisionError
592+
593+ self.assertItemsEqual(images, get_available_boot_images())
594+
595 def test_returns_empty_list_when_all_clusters_fail(self):
596 factory.make_NodeGroup().accept()
597 factory.make_NodeGroup().accept()
598
599=== modified file 'src/maasserver/dns/tests/test_config.py'
600--- src/maasserver/dns/tests/test_config.py 2015-09-14 21:26:38 +0000
601+++ src/maasserver/dns/tests/test_config.py 2015-09-25 14:32:35 +0000
602@@ -493,15 +493,16 @@
603 def test_dns_update_all_zones_now_passes_upstream_dns_parameter(self):
604 self.patch(settings, 'DNS_CONNECT', True)
605 self.create_managed_nodegroup()
606- random_ip = factory.make_ipv4_address()
607- Config.objects.set_config("upstream_dns", random_ip)
608+ ips = [factory.make_ipv4_address() for _ in range(3)]
609+ input_ips = " ".join(ips)
610+ Config.objects.set_config("upstream_dns", input_ips)
611 bind_write_options = self.patch_autospec(
612 dns_config_module, "bind_write_options")
613 dns_update_all_zones_now()
614 self.assertThat(
615 bind_write_options,
616 MockCalledOnceWith(
617- dnssec_validation='auto', upstream_dns=[random_ip]))
618+ dnssec_validation='auto', upstream_dns=ips))
619
620 def test_dns_update_all_zones_now_writes_trusted_networks_parameter(self):
621 self.patch(settings, 'DNS_CONNECT', True)
622
623=== modified file 'src/maasserver/fields.py'
624--- src/maasserver/fields.py 2015-09-21 20:29:36 +0000
625+++ src/maasserver/fields.py 2015-09-25 14:32:35 +0000
626@@ -15,8 +15,12 @@
627 __all__ = [
628 "CIDRField",
629 "EditableBinaryField",
630+<<<<<<< TREE
631 "IPListFormField",
632 "IPv4CIDRField",
633+=======
634+ "IPListFormField",
635+>>>>>>> MERGE-SOURCE
636 "MAASIPAddressField",
637 "MAC",
638 "MACAddressField",
639@@ -542,6 +546,7 @@
640 raise AssertionError(
641 "Invalid LargeObjectField value (expected integer): '%s'"
642 % repr(value))
643+<<<<<<< TREE
644
645
646 def parse_cidr(value):
647@@ -629,3 +634,28 @@
648 if value not in self.empty_values:
649 value = value.lower()
650 return super(CaseInsensitiveChoiceField, self).to_python(value)
651+=======
652+
653+
654+class IPListFormField(CharField):
655+ """Accepts a space/comma separated list of IP addresses.
656+
657+ This field normalizes the list to a space-separated list.
658+ """
659+ separators = re.compile('[,\s]+')
660+
661+ def clean(self, value):
662+ if value is None:
663+ return None
664+ else:
665+ ips = re.split(self.separators, value)
666+ ips = [ip.strip() for ip in ips if ip != '']
667+ for ip in ips:
668+ try:
669+ GenericIPAddressField().clean(ip, model_instance=None)
670+ except ValidationError:
671+ raise ValidationError(
672+ "Invalid IP address: %s; provide a list of "
673+ "space-separated IP addresses" % ip)
674+ return ' '.join(ips)
675+>>>>>>> MERGE-SOURCE
676
677=== modified file 'src/maasserver/forms.py'
678=== modified file 'src/maasserver/forms_settings.py'
679=== added file 'src/maasserver/migrations/0139_power_parameters_and_state_updated_field.py'
680--- src/maasserver/migrations/0139_power_parameters_and_state_updated_field.py 1970-01-01 00:00:00 +0000
681+++ src/maasserver/migrations/0139_power_parameters_and_state_updated_field.py 2015-09-25 14:32:35 +0000
682@@ -0,0 +1,453 @@
683+# -*- coding: utf-8 -*-
684+from django.db import models
685+from south.db import db
686+from south.utils import datetime_utils as datetime
687+from south.v2 import SchemaMigration
688+
689+
690+class Migration(SchemaMigration):
691+
692+ def forwards(self, orm):
693+ # Adding field 'Node.power_state_updated'
694+ db.add_column(u'maasserver_node', 'power_state_updated',
695+ self.gf('django.db.models.fields.DateTimeField')(default=None, null=True),
696+ keep_default=False)
697+
698+
699+ # Changing field 'Node.power_parameters'
700+ db.alter_column(u'maasserver_node', 'power_parameters', self.gf('maasserver.fields.JSONObjectField')(max_length=32768))
701+
702+ def backwards(self, orm):
703+ # Deleting field 'Node.power_state_updated'
704+ db.delete_column(u'maasserver_node', 'power_state_updated')
705+
706+
707+ # Changing field 'Node.power_parameters'
708+ db.alter_column(u'maasserver_node', 'power_parameters', self.gf('maasserver.fields.JSONObjectField')())
709+
710+ models = {
711+ u'auth.group': {
712+ 'Meta': {'object_name': 'Group'},
713+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
714+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
715+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
716+ },
717+ u'auth.permission': {
718+ 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
719+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
720+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
721+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
722+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
723+ },
724+ u'auth.user': {
725+ 'Meta': {'object_name': 'User'},
726+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
727+ 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '75', 'blank': 'True'}),
728+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
729+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
730+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
731+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
732+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
733+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
734+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
735+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
736+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
737+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
738+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
739+ },
740+ u'contenttypes.contenttype': {
741+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
742+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
743+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
744+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
745+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
746+ },
747+ u'maasserver.blockdevice': {
748+ 'Meta': {'ordering': "[u'id']", 'unique_together': "((u'node', u'path'),)", 'object_name': 'BlockDevice'},
749+ 'block_size': ('django.db.models.fields.IntegerField', [], {}),
750+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
751+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
752+ 'id_path': ('django.db.models.fields.FilePathField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
753+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
754+ 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}),
755+ 'path': ('django.db.models.fields.FilePathField', [], {'max_length': '100'}),
756+ 'size': ('django.db.models.fields.BigIntegerField', [], {}),
757+ 'tags': ('djorm_pgarray.fields.ArrayField', [], {'default': '[]', 'dbtype': "u'text'", 'blank': 'True'}),
758+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
759+ },
760+ u'maasserver.bootresource': {
761+ 'Meta': {'unique_together': "((u'name', u'architecture'),)", 'object_name': 'BootResource'},
762+ 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
763+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
764+ 'extra': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
765+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
766+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
767+ 'rtype': ('django.db.models.fields.IntegerField', [], {'max_length': '10'}),
768+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
769+ },
770+ u'maasserver.bootresourcefile': {
771+ 'Meta': {'unique_together': "((u'resource_set', u'filetype'),)", 'object_name': 'BootResourceFile'},
772+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
773+ 'extra': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'blank': 'True'}),
774+ 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
775+ 'filetype': ('django.db.models.fields.CharField', [], {'default': "u'root-tgz'", 'max_length': '20'}),
776+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
777+ 'largefile': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.LargeFile']"}),
778+ 'resource_set': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'files'", 'to': u"orm['maasserver.BootResourceSet']"}),
779+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
780+ },
781+ u'maasserver.bootresourceset': {
782+ 'Meta': {'unique_together': "((u'resource', u'version'),)", 'object_name': 'BootResourceSet'},
783+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
784+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
785+ 'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
786+ 'resource': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'sets'", 'to': u"orm['maasserver.BootResource']"}),
787+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
788+ 'version': ('django.db.models.fields.CharField', [], {'max_length': '255'})
789+ },
790+ u'maasserver.bootsource': {
791+ 'Meta': {'object_name': 'BootSource'},
792+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
793+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
794+ 'keyring_data': ('maasserver.fields.EditableBinaryField', [], {'blank': 'True'}),
795+ 'keyring_filename': ('django.db.models.fields.FilePathField', [], {'max_length': '100', 'blank': 'True'}),
796+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
797+ 'url': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '200'})
798+ },
799+ u'maasserver.bootsourcecache': {
800+ 'Meta': {'object_name': 'BootSourceCache'},
801+ 'arch': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
802+ 'boot_source': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BootSource']"}),
803+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
804+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
805+ 'label': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
806+ 'os': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
807+ 'release': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
808+ 'subarch': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
809+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
810+ },
811+ u'maasserver.bootsourceselection': {
812+ 'Meta': {'unique_together': "((u'boot_source', u'os', u'release'),)", 'object_name': 'BootSourceSelection'},
813+ 'arches': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}),
814+ 'boot_source': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BootSource']"}),
815+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
816+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
817+ 'labels': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}),
818+ 'os': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}),
819+ 'release': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}),
820+ 'subarches': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'text'", 'null': 'True', 'blank': 'True'}),
821+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
822+ },
823+ u'maasserver.candidatename': {
824+ 'Meta': {'unique_together': "((u'name', u'position'),)", 'object_name': 'CandidateName'},
825+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
826+ 'name': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
827+ 'position': ('django.db.models.fields.IntegerField', [], {})
828+ },
829+ u'maasserver.componenterror': {
830+ 'Meta': {'object_name': 'ComponentError'},
831+ 'component': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '40'}),
832+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
833+ 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000'}),
834+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
835+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
836+ },
837+ u'maasserver.config': {
838+ 'Meta': {'object_name': 'Config'},
839+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
840+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
841+ 'value': ('maasserver.fields.JSONObjectField', [], {'null': 'True'})
842+ },
843+ u'maasserver.dhcplease': {
844+ 'Meta': {'object_name': 'DHCPLease'},
845+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
846+ 'ip': ('maasserver.fields.MAASIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
847+ 'mac': ('maasserver.fields.MACAddressField', [], {}),
848+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"})
849+ },
850+ u'maasserver.downloadprogress': {
851+ 'Meta': {'object_name': 'DownloadProgress'},
852+ 'bytes_downloaded': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
853+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
854+ 'error': ('django.db.models.fields.CharField', [], {'max_length': '1000', 'blank': 'True'}),
855+ 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
856+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
857+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
858+ 'size': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
859+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
860+ },
861+ u'maasserver.event': {
862+ 'Meta': {'object_name': 'Event'},
863+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
864+ 'description': ('django.db.models.fields.TextField', [], {'default': "u''", 'blank': 'True'}),
865+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
866+ 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']"}),
867+ 'type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.EventType']"}),
868+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
869+ },
870+ u'maasserver.eventtype': {
871+ 'Meta': {'object_name': 'EventType'},
872+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
873+ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
874+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
875+ 'level': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
876+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
877+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
878+ },
879+ u'maasserver.filestorage': {
880+ 'Meta': {'unique_together': "((u'filename', u'owner'),)", 'object_name': 'FileStorage'},
881+ 'content': ('metadataserver.fields.BinaryField', [], {'blank': 'True'}),
882+ 'filename': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
883+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
884+ 'key': ('django.db.models.fields.CharField', [], {'default': "u'c4af88bc-2ae9-11e5-9139-00163edfc3e6'", 'unique': 'True', 'max_length': '36'}),
885+ 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
886+ },
887+ u'maasserver.filesystem': {
888+ 'Meta': {'object_name': 'Filesystem'},
889+ 'block_device': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BlockDevice']", 'null': 'True', 'blank': 'True'}),
890+ 'create_params': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
891+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
892+ 'filesystem_group': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "u'filesystems'", 'null': 'True', 'to': u"orm['maasserver.FilesystemGroup']"}),
893+ 'fstype': ('django.db.models.fields.CharField', [], {'default': "u'ext4'", 'max_length': '20'}),
894+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
895+ 'mount_params': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
896+ 'mount_point': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
897+ 'partition': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Partition']", 'null': 'True', 'blank': 'True'}),
898+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
899+ 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'})
900+ },
901+ u'maasserver.filesystemgroup': {
902+ 'Meta': {'object_name': 'FilesystemGroup'},
903+ 'create_params': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
904+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
905+ 'group_type': ('django.db.models.fields.CharField', [], {'max_length': '20'}),
906+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
907+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
908+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
909+ 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'})
910+ },
911+ u'maasserver.largefile': {
912+ 'Meta': {'object_name': 'LargeFile'},
913+ 'content': ('maasserver.fields.LargeObjectField', [], {}),
914+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
915+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
916+ 'sha256': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'}),
917+ 'total_size': ('django.db.models.fields.BigIntegerField', [], {}),
918+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
919+ },
920+ u'maasserver.licensekey': {
921+ 'Meta': {'unique_together': "((u'osystem', u'distro_series'),)", 'object_name': 'LicenseKey'},
922+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
923+ 'distro_series': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
924+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
925+ 'license_key': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
926+ 'osystem': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
927+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
928+ },
929+ u'maasserver.macaddress': {
930+ 'Meta': {'ordering': "(u'created',)", 'object_name': 'MACAddress'},
931+ 'cluster_interface': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['maasserver.NodeGroupInterface']", 'null': 'True', 'on_delete': 'models.SET_NULL', 'blank': 'True'}),
932+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
933+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
934+ 'ip_addresses': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.StaticIPAddress']", 'symmetrical': 'False', 'through': u"orm['maasserver.MACStaticIPAddressLink']", 'blank': 'True'}),
935+ 'mac_address': ('maasserver.fields.MACAddressField', [], {'unique': 'True'}),
936+ 'networks': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.Network']", 'symmetrical': 'False', 'blank': 'True'}),
937+ 'node': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Node']", 'null': 'True', 'blank': 'True'}),
938+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
939+ },
940+ u'maasserver.macstaticipaddresslink': {
941+ 'Meta': {'unique_together': "((u'ip_address', u'mac_address'),)", 'object_name': 'MACStaticIPAddressLink'},
942+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
943+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
944+ 'ip_address': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.StaticIPAddress']", 'unique': 'True'}),
945+ 'mac_address': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.MACAddress']"}),
946+ 'nic_alias': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
947+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
948+ },
949+ u'maasserver.network': {
950+ 'Meta': {'object_name': 'Network'},
951+ 'default_gateway': ('maasserver.fields.MAASIPAddressField', [], {'max_length': '39', 'null': 'True', 'blank': 'True'}),
952+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
953+ 'dns_servers': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
954+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
955+ 'ip': ('maasserver.fields.MAASIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
956+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
957+ 'netmask': ('maasserver.fields.MAASIPAddressField', [], {'max_length': '39'}),
958+ 'vlan_tag': ('django.db.models.fields.PositiveSmallIntegerField', [], {'unique': 'True', 'null': 'True', 'blank': 'True'})
959+ },
960+ u'maasserver.node': {
961+ 'Meta': {'object_name': 'Node'},
962+ 'agent_name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'null': 'True', 'blank': 'True'}),
963+ 'architecture': ('django.db.models.fields.CharField', [], {'max_length': '31', 'null': 'True', 'blank': 'True'}),
964+ 'boot_type': ('django.db.models.fields.CharField', [], {'default': "u'fastpath'", 'max_length': '20'}),
965+ 'cpu_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
966+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
967+ 'disable_ipv4': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
968+ 'distro_series': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}),
969+ 'error': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
970+ 'error_description': ('django.db.models.fields.TextField', [], {'default': "u''", 'blank': 'True'}),
971+ 'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'unique': 'True', 'max_length': '255', 'blank': 'True'}),
972+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
973+ 'installable': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'db_index': 'True'}),
974+ 'license_key': ('django.db.models.fields.CharField', [], {'max_length': '30', 'null': 'True', 'blank': 'True'}),
975+ 'memory': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
976+ 'netboot': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
977+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']", 'null': 'True'}),
978+ 'osystem': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '20', 'blank': 'True'}),
979+ 'owner': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'}),
980+ 'parent': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "u'children'", 'null': 'True', 'blank': 'True', 'to': u"orm['maasserver.Node']"}),
981+ 'power_parameters': ('maasserver.fields.JSONObjectField', [], {'default': "u''", 'max_length': '32768', 'blank': 'True'}),
982+ 'power_state': ('django.db.models.fields.CharField', [], {'default': "u'unknown'", 'max_length': '10'}),
983+ 'power_state_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}),
984+ 'power_type': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '10', 'blank': 'True'}),
985+ 'pxe_mac': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'+'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': u"orm['maasserver.MACAddress']", 'blank': 'True', 'null': 'True'}),
986+ 'routers': ('djorm_pgarray.fields.ArrayField', [], {'default': 'None', 'dbtype': "u'macaddr'", 'null': 'True', 'blank': 'True'}),
987+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '0', 'max_length': '10'}),
988+ 'swap_size': ('django.db.models.fields.BigIntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
989+ 'system_id': ('django.db.models.fields.CharField', [], {'default': "u'node-c4b17d70-2ae9-11e5-9139-00163edfc3e6'", 'unique': 'True', 'max_length': '41'}),
990+ 'tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['maasserver.Tag']", 'symmetrical': 'False'}),
991+ 'token': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Token']", 'null': 'True'}),
992+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
993+ 'zone': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.Zone']", 'on_delete': 'models.SET_DEFAULT'})
994+ },
995+ u'maasserver.nodegroup': {
996+ 'Meta': {'object_name': 'NodeGroup'},
997+ 'api_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '18'}),
998+ 'api_token': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Token']", 'unique': 'True'}),
999+ 'cluster_name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '100', 'blank': 'True'}),
1000+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
1001+ 'default_disable_ipv4': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
1002+ 'dhcp_key': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
1003+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1004+ 'maas_url': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
1005+ 'name': ('maasserver.models.nodegroup.DomainNameField', [], {'max_length': '80', 'blank': 'True'}),
1006+ 'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
1007+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
1008+ 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'})
1009+ },
1010+ u'maasserver.nodegroupinterface': {
1011+ 'Meta': {'unique_together': "((u'nodegroup', u'name'),)", 'object_name': 'NodeGroupInterface'},
1012+ 'broadcast_ip': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
1013+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
1014+ 'foreign_dhcp_ip': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
1015+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1016+ 'interface': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
1017+ 'ip': ('maasserver.fields.MAASIPAddressField', [], {'max_length': '39'}),
1018+ 'ip_range_high': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
1019+ 'ip_range_low': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
1020+ 'management': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
1021+ 'name': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'blank': 'True'}),
1022+ 'nodegroup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.NodeGroup']"}),
1023+ 'router_ip': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
1024+ 'static_ip_range_high': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
1025+ 'static_ip_range_low': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
1026+ 'subnet_mask': ('maasserver.fields.MAASIPAddressField', [], {'default': 'None', 'max_length': '39', 'null': 'True', 'blank': 'True'}),
1027+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
1028+ },
1029+ u'maasserver.partition': {
1030+ 'Meta': {'object_name': 'Partition'},
1031+ 'bootable': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
1032+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
1033+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1034+ 'partition_table': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'partitions'", 'to': u"orm['maasserver.PartitionTable']"}),
1035+ 'size': ('django.db.models.fields.BigIntegerField', [], {}),
1036+ 'start_offset': ('django.db.models.fields.BigIntegerField', [], {}),
1037+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
1038+ 'uuid': ('django.db.models.fields.CharField', [], {'max_length': '36', 'unique': 'True', 'null': 'True', 'blank': 'True'})
1039+ },
1040+ u'maasserver.partitiontable': {
1041+ 'Meta': {'object_name': 'PartitionTable'},
1042+ 'block_device': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['maasserver.BlockDevice']"}),
1043+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
1044+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1045+ 'table_type': ('django.db.models.fields.CharField', [], {'default': "u'GPT'", 'max_length': '20'}),
1046+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
1047+ },
1048+ u'maasserver.physicalblockdevice': {
1049+ 'Meta': {'ordering': "[u'id']", 'object_name': 'PhysicalBlockDevice', '_ormbases': [u'maasserver.BlockDevice']},
1050+ u'blockdevice_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['maasserver.BlockDevice']", 'unique': 'True', 'primary_key': 'True'}),
1051+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
1052+ 'serial': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
1053+ },
1054+ u'maasserver.sshkey': {
1055+ 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSHKey'},
1056+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
1057+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1058+ 'key': ('django.db.models.fields.TextField', [], {}),
1059+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
1060+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
1061+ },
1062+ u'maasserver.sslkey': {
1063+ 'Meta': {'unique_together': "((u'user', u'key'),)", 'object_name': 'SSLKey'},
1064+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
1065+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1066+ 'key': ('django.db.models.fields.TextField', [], {}),
1067+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
1068+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
1069+ },
1070+ u'maasserver.staticipaddress': {
1071+ 'Meta': {'object_name': 'StaticIPAddress'},
1072+ 'alloc_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
1073+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
1074+ 'hostname': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'null': 'True', 'blank': 'True'}),
1075+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1076+ 'ip': ('maasserver.fields.MAASIPAddressField', [], {'unique': 'True', 'max_length': '39'}),
1077+ 'updated': ('django.db.models.fields.DateTimeField', [], {}),
1078+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
1079+ },
1080+ u'maasserver.tag': {
1081+ 'Meta': {'object_name': 'Tag'},
1082+ 'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
1083+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
1084+ 'definition': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
1085+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1086+ 'kernel_opts': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
1087+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
1088+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
1089+ },
1090+ u'maasserver.userprofile': {
1091+ 'Meta': {'object_name': 'UserProfile'},
1092+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1093+ 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'})
1094+ },
1095+ u'maasserver.virtualblockdevice': {
1096+ 'Meta': {'ordering': "[u'id']", 'object_name': 'VirtualBlockDevice', '_ormbases': [u'maasserver.BlockDevice']},
1097+ u'blockdevice_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['maasserver.BlockDevice']", 'unique': 'True', 'primary_key': 'True'}),
1098+ 'filesystem_group': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "u'virtual_devices'", 'to': u"orm['maasserver.FilesystemGroup']"}),
1099+ 'uuid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '36'})
1100+ },
1101+ u'maasserver.zone': {
1102+ 'Meta': {'ordering': "[u'name']", 'object_name': 'Zone'},
1103+ 'created': ('django.db.models.fields.DateTimeField', [], {}),
1104+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
1105+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1106+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '256'}),
1107+ 'updated': ('django.db.models.fields.DateTimeField', [], {})
1108+ },
1109+ u'piston.consumer': {
1110+ 'Meta': {'object_name': 'Consumer'},
1111+ 'description': ('django.db.models.fields.TextField', [], {}),
1112+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1113+ 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
1114+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
1115+ 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
1116+ 'status': ('django.db.models.fields.CharField', [], {'default': "'pending'", 'max_length': '16'}),
1117+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'consumers'", 'null': 'True', 'to': u"orm['auth.User']"})
1118+ },
1119+ u'piston.token': {
1120+ 'Meta': {'object_name': 'Token'},
1121+ 'callback': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
1122+ 'callback_confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
1123+ 'consumer': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['piston.Consumer']"}),
1124+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
1125+ 'is_approved': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
1126+ 'key': ('django.db.models.fields.CharField', [], {'max_length': '18'}),
1127+ 'secret': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
1128+ 'timestamp': ('django.db.models.fields.IntegerField', [], {'default': '1436961921L'}),
1129+ 'token_type': ('django.db.models.fields.IntegerField', [], {}),
1130+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'tokens'", 'null': 'True', 'to': u"orm['auth.User']"}),
1131+ 'verifier': ('django.db.models.fields.CharField', [], {'max_length': '10'})
1132+ }
1133+ }
1134+
1135+ complete_apps = ['maasserver']
1136
1137=== renamed file 'src/maasserver/migrations/0139_power_parameters_and_state_updated_field.py' => 'src/maasserver/migrations/0139_power_parameters_and_state_updated_field.py.moved'
1138=== modified file 'src/maasserver/models/node.py'
1139=== modified file 'src/maasserver/models/tests/test_node.py'
1140--- src/maasserver/models/tests/test_node.py 2015-09-24 15:01:52 +0000
1141+++ src/maasserver/models/tests/test_node.py 2015-09-25 14:32:35 +0000
1142@@ -59,8 +59,13 @@
1143 )
1144 from maasserver.models.event import Event
1145 from maasserver.models.node import PowerInfo
1146+<<<<<<< TREE
1147 from maasserver.models.signals import power as node_query
1148 from maasserver.models.timestampedmodel import now
1149+=======
1150+from maasserver.models.staticipaddress import StaticIPAddress
1151+from maasserver.models.timestampedmodel import now
1152+>>>>>>> MERGE-SOURCE
1153 from maasserver.models.user import create_auth_token
1154 from maasserver.node_status import (
1155 get_failed_status,
1156
1157=== modified file 'src/maasserver/node_action.py'
1158--- src/maasserver/node_action.py 2015-09-23 20:33:01 +0000
1159+++ src/maasserver/node_action.py 2015-09-25 14:32:35 +0000
1160@@ -50,10 +50,14 @@
1161 is_failed_status,
1162 NON_MONITORED_STATUSES,
1163 )
1164+<<<<<<< TREE
1165 from maasserver.utils.osystems import (
1166 validate_hwe_kernel,
1167 validate_osystem_and_distro_series,
1168 )
1169+=======
1170+from maasserver.utils.osystems import validate_osystem_and_distro_series
1171+>>>>>>> MERGE-SOURCE
1172 from metadataserver.enum import RESULT_TYPE
1173 from metadataserver.models.noderesult import NodeResult
1174 from provisioningserver.rpc.exceptions import (
1175@@ -310,6 +314,7 @@
1176 self.node.acquire(self.user, token=None)
1177
1178 if osystem and distro_series:
1179+<<<<<<< TREE
1180 try:
1181 self.node.osystem, self.node.distro_series = (
1182 validate_osystem_and_distro_series(osystem, distro_series))
1183@@ -325,6 +330,14 @@
1184 self.node.save()
1185 except ValidationError as e:
1186 raise NodeActionError(e.message)
1187+=======
1188+ try:
1189+ self.node.osystem, self.node.distro_series = (
1190+ validate_osystem_and_distro_series(osystem, distro_series))
1191+ self.node.save()
1192+ except ValidationError as e:
1193+ raise NodeActionError(e.message)
1194+>>>>>>> MERGE-SOURCE
1195
1196 try:
1197 self.node.start(self.user)
1198
1199=== modified file 'src/maasserver/plugin.py'
1200--- src/maasserver/plugin.py 2015-09-15 13:52:51 +0000
1201+++ src/maasserver/plugin.py 2015-09-25 14:32:35 +0000
1202@@ -28,6 +28,7 @@
1203 from twisted.python import usage
1204 from twisted.python.threadable import isInIOThread
1205 from zope.interface import implementer
1206+from twisted.internet import reactor
1207
1208
1209 def serverFromString(description):
1210@@ -49,6 +50,14 @@
1211 ]
1212
1213
1214+# The maximum number of threads used by the default twisted thread pool.
1215+# This value is a trade-off between a small value (such as the default: 10)
1216+# which can create deadlocks (see 1470013) and a huge value which can cause
1217+# MAAS to hit other limitations such as the number of open files or the
1218+# number of concurrent database connexions.
1219+MAX_THREADS = 100
1220+
1221+
1222 @implementer(IServiceMaker, IPlugin)
1223 class RegionServiceMaker:
1224 """Create a service for the Twisted plugin."""
1225@@ -131,6 +140,10 @@
1226 import crochet
1227 crochet.no_setup()
1228
1229+ def _configurePoolSize(self):
1230+ threadpool = reactor.getThreadPool()
1231+ threadpool.adjustPoolsize(10, MAX_THREADS)
1232+
1233 def _makeIntrospectionService(self, endpoint):
1234 from provisioningserver.utils import introspect
1235 introspect_service = (
1236@@ -149,6 +162,7 @@
1237 self._checkDatabase()
1238 self._configureReactor()
1239 self._configureCrochet()
1240+ self._configurePoolSize()
1241
1242 # Populate the region's event-loop with services.
1243 from maasserver import eventloop
1244
1245=== modified file 'src/maasserver/rpc/nodes.py'
1246--- src/maasserver/rpc/nodes.py 2015-09-15 21:05:28 +0000
1247+++ src/maasserver/rpc/nodes.py 2015-09-25 14:32:35 +0000
1248@@ -71,6 +71,7 @@
1249
1250 :return: A generator yielding `dict`s.
1251 """
1252+<<<<<<< TREE
1253 five_minutes_ago = now() - timedelta(minutes=5)
1254
1255 # This is meant to be temporary until all the power types support querying
1256@@ -99,6 +100,36 @@
1257 power_info = node.get_effective_power_info()
1258 if power_info.power_type is not None:
1259 yield {
1260+=======
1261+ five_minutes_ago = now() - timedelta(minutes=5)
1262+
1263+ # This is meant to be temporary until all the power types support querying
1264+ # the power state of a node. See the definition of QUERY_POWER_TYPES for
1265+ # more information.
1266+ from provisioningserver.rpc.power import QUERY_POWER_TYPES
1267+
1268+ nodes_unchecked = (
1269+ nodes
1270+ .filter(power_state_updated=None)
1271+ .filter(power_type__in=QUERY_POWER_TYPES)
1272+ .exclude(status=NODE_STATUS.BROKEN)
1273+ .exclude(installable=False)
1274+ )
1275+ nodes_checked = (
1276+ nodes
1277+ .exclude(power_state_updated=None)
1278+ .exclude(power_state_updated__gt=five_minutes_ago)
1279+ .filter(power_type__in=QUERY_POWER_TYPES)
1280+ .exclude(status=NODE_STATUS.BROKEN)
1281+ .exclude(installable=False)
1282+ .order_by("power_state_updated", "system_id")
1283+ )
1284+
1285+ for node in chain(nodes_unchecked, nodes_checked):
1286+ power_info = node.get_effective_power_info()
1287+ if power_info.power_type is not None:
1288+ yield {
1289+>>>>>>> MERGE-SOURCE
1290 'system_id': node.system_id,
1291 'hostname': node.hostname,
1292 'power_state': node.power_state,
1293
1294=== modified file 'src/maasserver/rpc/tests/test_nodes.py'
1295--- src/maasserver/rpc/tests/test_nodes.py 2015-08-29 01:42:44 +0000
1296+++ src/maasserver/rpc/tests/test_nodes.py 2015-09-25 14:32:35 +0000
1297@@ -22,11 +22,16 @@
1298 from random import randint
1299
1300 from django.core.exceptions import ValidationError
1301+<<<<<<< TREE
1302 from maasserver.enum import (
1303 INTERFACE_TYPE,
1304 NODE_STATUS,
1305 )
1306 from maasserver.models.timestampedmodel import now
1307+=======
1308+from maasserver.enum import NODE_STATUS
1309+from maasserver.models.timestampedmodel import now
1310+>>>>>>> MERGE-SOURCE
1311 from maasserver.rpc.nodes import (
1312 commission_node,
1313 create_node,
1314@@ -57,11 +62,17 @@
1315 NodeStateViolation,
1316 NoSuchNode,
1317 )
1318+from provisioningserver.rpc.power import QUERY_POWER_TYPES
1319 from simplejson import dumps
1320 from testtools import ExpectedException
1321 from testtools.matchers import (
1322 Contains,
1323- GreaterThan,
1324+<<<<<<< TREE
1325+ GreaterThan,
1326+=======
1327+ Equals,
1328+ GreaterThan,
1329+>>>>>>> MERGE-SOURCE
1330 Is,
1331 LessThan,
1332 Not,
1333
1334=== modified file 'src/maasserver/rpc/tests/test_regionservice.py'
1335--- src/maasserver/rpc/tests/test_regionservice.py 2015-09-16 11:18:09 +0000
1336+++ src/maasserver/rpc/tests/test_regionservice.py 2015-09-25 14:32:35 +0000
1337@@ -112,6 +112,7 @@
1338 NoSuchNode,
1339 )
1340 from provisioningserver.rpc.interfaces import IConnection
1341+from provisioningserver.rpc.power import QUERY_POWER_TYPES
1342 from provisioningserver.rpc.region import (
1343 Authenticate,
1344 CommissionNode,
1345@@ -663,11 +664,19 @@
1346 nodegroup = yield deferToDatabase(self.create_nodegroup)
1347 nodes = []
1348 for _ in range(3):
1349+<<<<<<< TREE
1350 node = yield deferToDatabase(
1351 self.create_node, nodegroup,
1352 power_type=random.choice(QUERY_POWER_TYPES),
1353 power_state_updated=None)
1354 power_params = yield deferToDatabase(
1355+=======
1356+ node = yield deferToThread(
1357+ self.create_node, nodegroup,
1358+ power_type=random.choice(QUERY_POWER_TYPES),
1359+ power_state_updated=None)
1360+ power_params = yield deferToThread(
1361+>>>>>>> MERGE-SOURCE
1362 self.get_node_power_parameters, node)
1363 nodes.append({
1364 'system_id': node.system_id,
1365@@ -679,9 +688,15 @@
1366
1367 # Create a node with an invalid power type (i.e. the empty string).
1368 # This will not be reported by the call to ListNodePowerParameters.
1369+<<<<<<< TREE
1370 yield deferToDatabase(
1371 self.create_node, nodegroup, power_type="",
1372 power_state_updated=None)
1373+=======
1374+ yield deferToThread(
1375+ self.create_node, nodegroup, power_type="",
1376+ power_state_updated=None)
1377+>>>>>>> MERGE-SOURCE
1378
1379 response = yield call_responder(
1380 Region(), ListNodePowerParameters,
1381
1382=== modified file 'src/maasserver/static/css/maas-styles.css'
1383--- src/maasserver/static/css/maas-styles.css 2015-09-23 22:21:35 +0000
1384+++ src/maasserver/static/css/maas-styles.css 2015-09-25 14:32:35 +0000
1385@@ -1,1 +1,5 @@
1386+<<<<<<< TREE
1387 .fake{display:none}body{font-size:14px}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col,.col{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;clear:none;display:inline-block;float:none;margin-right:2.12766%;margin-bottom:20px;position:relative;width:100%}.twelve-col .one-col,.twelve-col .two-col,.twelve-col .three-col,.twelve-col .four-col,.twelve-col .five-col,.twelve-col .six-col,.twelve-col .seven-col,.twelve-col .eight-col,.twelve-col .nine-col,.twelve-col .ten-col,.twelve-col .eleven-col{width:100%}.last-col,.last{margin-right:0}.clearfix:after,.container:after{clear:both;content:"\0020";display:block;height:0;overflow:hidden;visibility:hidden}.clear{clear:both}.clearfix{display:block}@media only screen and (min-width: 768px){body{font-size:15px}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col,.col{float:left}.one-col{width:6.38297%}.two-col{width:14.89361%}.three-col{width:23.40425%}.four-col{width:31.91489%}.five-col{width:40.42553%}.six-col{width:48.93617%}.seven-col{width:57.4468%}.eight-col{width:65.95744%}.nine-col{width:74.46808%}.ten-col{width:82.97872%}.eleven-col{width:91.48936%}.twelve-col{width:100%;margin-right:0}.twelve-col .one-col{width:6.3053%;margin-right:2.21238%}.twelve-col .two-col{width:14.823%;margin-right:2.21238%}.twelve-col .three-col{width:23.3407%;margin-right:2.21238%}.twelve-col .three-col{width:48.8938%;margin-right:2.21238%}.twelve-col .four-col{width:31.8584%;margin-right:2.21238%}.twelve-col .five-col{width:40.3761%;margin-right:2.21238%}.twelve-col .six-col{width:48.8938%;margin-right:2.21238%}.twelve-col .seven-col{width:57.4115%;margin-right:2.21238%}.twelve-col .eight-col{width:65.9292%;margin-right:2.21238%}.twelve-col .nine-col{width:74.4469%;margin-right:2.21238%}.twelve-col .ten-col{width:82.9646%;margin-right:2.21238%}.twelve-col .eleven-col{width:91.4823%;margin-right:2.21238%}.twelve-col .twelve-col{width:100%;margin-right:0}.eleven-col .one-col{width:6.89238%;margin-right:2.41837%}.eleven-col .two-col{width:16.20314%;margin-right:2.41837%}.eleven-col .three-col{width:25.5139%;margin-right:2.41837%}.eleven-col .four-col{width:34.82466%;margin-right:2.41837%}.eleven-col .five-col{width:44.13542%;margin-right:2.41837%}.eleven-col .six-col{width:53.44619%;margin-right:2.41837%}.eleven-col .seven-col{width:62.75695%;margin-right:2.41837%}.eleven-col .eight-col{width:72.06771%;margin-right:2.41837%}.eleven-col .nine-col{width:81.37847%;margin-right:2.41837%}.eleven-col .ten-col{width:90.68923%;margin-right:2.41837%}.eleven-col .eleven-col{width:100%;margin-right:0}.ten-col .one-col{width:7.6%;margin-right:2.66666%}.ten-col .two-col{width:17.86666%;margin-right:2.66666%}.ten-col .three-col{width:28.13333%;margin-right:2.66666%}.ten-col .four-col{width:38.4%;margin-right:2.66666%}.ten-col .five-col{width:48.66666%;margin-right:2.66666%}.ten-col .six-col{width:58.93333%;margin-right:2.66666%}.ten-col .seven-col{width:69.19999%;margin-right:2.66666%}.ten-col .eight-col{width:79.46666%;margin-right:2.66666%}.ten-col .nine-col{width:89.73333%;margin-right:2.66666%}.ten-col .ten-col{width:100%;margin-right:0}.nine-col .one-col{width:8.46953%;margin-right:2.97176%}.nine-col .two-col{width:19.91084%;margin-right:2.97176%}.nine-col .three-col{width:31.35215%;margin-right:2.97176%}.nine-col .four-col{width:42.79346%;margin-right:2.97176%}.nine-col .five-col{width:54.23476%;margin-right:2.97176%}.nine-col .six-col{width:65.67607%;margin-right:2.97176%}.nine-col .seven-col{width:77.11738%;margin-right:2.97176%}.nine-col .eight-col{width:88.55869%;margin-right:2.97176%}.nine-col .nine-col{width:100%;margin-right:0}.eight-col .one-col{width:9.56375%;margin-right:3.3557%}.eight-col .two-col{width:22.48322%;margin-right:3.3557%}.eight-col .three-col{width:35.40268%;margin-right:3.3557%}.eight-col .four-col{width:48.32214%;margin-right:3.3557%}.eight-col .five-col{width:61.24161%;margin-right:3.3557%}.eight-col .six-col{width:74.16107%;margin-right:3.3557%}.eight-col .seven-col{width:87.08053%;margin-right:3.3557%}.eight-col .eight-col{width:100%;margin-right:0}.seven-col .one-col{width:10.98265%;margin-right:3.85356%}.seven-col .two-col{width:25.81888%;margin-right:3.85356%}.seven-col .three-col{width:40.6551%;margin-right:3.85356%}.seven-col .four-col{width:55.49132%;margin-right:3.85356%}.seven-col .five-col{width:70.32755%;margin-right:3.85356%}.seven-col .six-col{width:85.16377%;margin-right:3.85356%}.seven-col .seven-col{width:100%;margin-right:0}.six-col .one-col{width:12.89592%;margin-right:4.52488%}.six-col .two-col{width:30.31674%;margin-right:4.52488%}.six-col .three-col{width:47.73755%;margin-right:4.52488%}.six-col .four-col{width:65.15837%;margin-right:4.52488%}.six-col .five-col{width:82.57918%;margin-right:4.52488%}.six-col .six-col{width:100%;margin-right:0}.five-col .one-col{width:15.61643%;margin-right:5.47945%}.five-col .two-col{width:36.71232%;margin-right:5.47945%}.five-col .three-col{width:57.80821%;margin-right:5.47945%}.five-col .four-col{width:78.9041%;margin-right:5.47945%}.five-col .five-col{width:100%;margin-right:0}.four-col .one-col{width:19.79166%;margin-right:6.94444%}.four-col .two-col{width:46.52777%;margin-right:6.94444%}.four-col .three-col{width:73.26388%;margin-right:6.94444%}.four-col .four-col{width:100%;margin-right:0}.three-col .one-col{width:27.01421%;margin-right:9.47867%}.three-col .two-col{width:63.5071%;margin-right:9.47867%}.three-col .three-col{width:100%;margin-right:0}.two-col .one-col{width:42.53731%;margin-right:14.92537%}.two-col .two-col{width:100%;margin-right:0}.one-col .one-col{width:100%;margin-right:0}.twelve-col .last-col{margin-right:0}.eleven-col .last-col{margin-right:0}.ten-col .last-col{margin-right:0}.nine-col .last-col{margin-right:0}.eight-col .last-col{margin-right:0}.seven-col .last-col{margin-right:0}.six-col .last-col{margin-right:0}.five-col .last-col{margin-right:0}.four-col .last-col{margin-right:0}.three-col .last-col{margin-right:0}.two-col .last-col{margin-right:0}.one-col .last-col{margin-right:0}.row,#context-footer{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;margin:0;padding:40px 40px 20px}.row:after{content:".";visibility:hidden;display:block;height:0;clear:both}.row-feature{background:none}.container{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:20px 20px 0;width:100%}.append-one{margin-right:8.51063%}.append-two{margin-right:17.02127%}.append-three{margin-right:25.53191%}.append-four{margin-right:34.04255%}.append-five{margin-right:42.55319%}.append-six{margin-right:51.06383%}.append-seven{margin-right:59.57446%}.append-eight{margin-right:68.0851%}.append-nine{margin-right:76.59574%}.append-ten{margin-right:85.10638%}.append-eleven{margin-right:93.61702%}.prepend-one{margin-left:8.51063%}.prepend-two{margin-left:17.02127%}.prepend-three{margin-left:25.53191%}.prepend-four{margin-left:34.04255%}.prepend-five{margin-left:42.55319%}.prepend-six{margin-left:51.06383%}.prepend-seven{margin-left:59.57446%}.prepend-eight{margin-left:68.0851%}.prepend-nine{margin-left:76.59574%}.prepend-ten{margin-left:85.10638%}.prepend-eleven{margin-left:93.61702%}.push-one{margin-left:57px}.pull-one,.pull-two,.pull-three,.pull-four,.pull-five,.pull-six,.pull-seven,.pull-eight,.pull-nine,.pull-ten,.pull-eleven{float:left;position:relative}.pull-one{margin-left:-6.38297%}.pull-two{margin-left:-17.02127%}.pull-three{margin-left:-25.53191%}.pull-four{margin-left:-34.04255%}.pull-five{margin-left:-34.04255%}.pull-six{margin-left:-51.06383%}.pull-seven{margin-left:-59.57446%}.pull-eight{margin-left:-68.0851%}.pull-nine{margin-left:-76.59574%}.pull-ten{margin-left:-85.10638%}.pull-eleven{margin-left:-93.61702%}.push-1,.push-two,.push-three,.push-four,.push-five,.push-six,.push-seven,.push-eight,.push-nine,.push-ten,.push-eleven{float:left;position:relative}.push-one{margin:0 -8.51063% 0 8.51063%}.push-two{margin:0 -19.14893% 0 19.14893%}.push-three{margin:0 -27.65957% 0 27.65957%}.push-four{margin:0 -36.17021% 0 36.17021%}.push-five{margin:0 -36.17021% 0 36.17021%}.push-six{margin:0 -53.19149% 0 53.19149%}.push-seven{margin:0 -61.70212% 0 61.70212%}.push-eight{margin:0 -70.21276% 0 70.21276%}.push-nine{margin:0 -78.7234% 0 78.7234%}.push-ten{margin:0 -87.23404% 0 87.23404%}.push-eleven{margin:0 -95.74468% 0 95.74468%}}@media only screen and (min-width: 984px){body{font-size:16px}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col,.col{float:left}.one-col{width:6.38297%}.two-col{width:14.89361%}.three-col{width:23.40425%}.four-col{width:31.91489%}.five-col{width:40.42553%}.six-col{width:48.93617%}.seven-col{width:57.4468%}.eight-col{width:65.95744%}.nine-col{width:74.46808%}.ten-col{width:82.97872%}.eleven-col{width:91.48936%}.three-col:nth-child(1):nth-last-child(4),.three-col:nth-child(2):nth-last-child(3),.three-col:nth-child(3):nth-last-child(2),.three-col:nth-child(4):nth-last-child(1){width:23.36%}.three-col:nth-of-type(2){margin-right:2.21238%}.twelve-col{width:100%;margin-right:0}.twelve-col .one-col{width:6.3053%;margin-right:2.21238%}.twelve-col .two-col{width:14.823%;margin-right:2.21238%}.twelve-col .three-col{width:23.3407%;margin-right:2.21238%}.twelve-col .three-col:nth-child(1):nth-last-child(4),.twelve-col .three-col:nth-child(2):nth-last-child(3),.twelve-col .three-col:nth-child(3):nth-last-child(2),.twelve-col .three-col:nth-child(4):nth-last-child(1){width:23.3407%}.twelve-col .three-col:nth-of-type(2){margin-right:2.21238%}.twelve-col .four-col{width:31.8584%;margin-right:2.21238%}.twelve-col .five-col{width:40.3761%;margin-right:2.21238%}.twelve-col .six-col{width:48.8938%;margin-right:2.21238%}.twelve-col .seven-col{width:57.4115%;margin-right:2.21238%}.twelve-col .eight-col{width:65.9292%;margin-right:2.21238%}.twelve-col .nine-col{width:74.4469%;margin-right:2.21238%}.twelve-col .ten-col{width:82.9646%;margin-right:2.21238%}.twelve-col .eleven-col{width:91.4823%;margin-right:2.21238%}.twelve-col .twelve-col{width:100%;margin-right:0}.eleven-col .one-col{width:6.89238%;margin-right:2.41837%}.eleven-col .two-col{width:16.20314%;margin-right:2.41837%}.eleven-col .three-col{width:25.5139%;margin-right:2.41837%}.eleven-col .four-col{width:34.82466%;margin-right:2.41837%}.eleven-col .five-col{width:44.13542%;margin-right:2.41837%}.eleven-col .six-col{width:53.44619%;margin-right:2.41837%}.eleven-col .seven-col{width:62.75695%;margin-right:2.41837%}.eleven-col .eight-col{width:72.06771%;margin-right:2.41837%}.eleven-col .nine-col{width:81.37847%;margin-right:2.41837%}.eleven-col .ten-col{width:90.68923%;margin-right:2.41837%}.eleven-col .eleven-col{width:100%;margin-right:0}.ten-col .one-col{width:7.6%;margin-right:2.66666%}.ten-col .two-col{width:17.86666%;margin-right:2.66666%}.ten-col .three-col{width:28.13333%;margin-right:2.66666%}.ten-col .four-col{width:38.4%;margin-right:2.66666%}.ten-col .five-col{width:48.66666%;margin-right:2.66666%}.ten-col .six-col{width:58.93333%;margin-right:2.66666%}.ten-col .seven-col{width:69.19999%;margin-right:2.66666%}.ten-col .eight-col{width:79.46666%;margin-right:2.66666%}.ten-col .nine-col{width:89.73333%;margin-right:2.66666%}.ten-col .ten-col{width:100%;margin-right:0}.nine-col .one-col{width:8.46953%;margin-right:2.97176%}.nine-col .two-col{width:19.91084%;margin-right:2.97176%}.nine-col .three-col{width:31.35215%;margin-right:2.97176%}.nine-col .four-col{width:42.79346%;margin-right:2.97176%}.nine-col .five-col{width:54.23476%;margin-right:2.97176%}.nine-col .six-col{width:65.67607%;margin-right:2.97176%}.nine-col .seven-col{width:77.11738%;margin-right:2.97176%}.nine-col .eight-col{width:88.55869%;margin-right:2.97176%}.nine-col .nine-col{width:100%;margin-right:0}.eight-col .one-col{width:9.56375%;margin-right:3.3557%}.eight-col .two-col{width:22.48322%;margin-right:3.3557%}.eight-col .three-col{width:35.40268%;margin-right:3.3557%}.eight-col .four-col{width:48.32214%;margin-right:3.3557%}.eight-col .five-col{width:61.24161%;margin-right:3.3557%}.eight-col .six-col{width:74.16107%;margin-right:3.3557%}.eight-col .seven-col{width:87.08053%;margin-right:3.3557%}.eight-col .eight-col{width:100%;margin-right:0}.seven-col .one-col{width:10.98265%;margin-right:3.85356%}.seven-col .two-col{width:25.81888%;margin-right:3.85356%}.seven-col .three-col{width:40.6551%;margin-right:3.85356%}.seven-col .four-col{width:55.49132%;margin-right:3.85356%}.seven-col .five-col{width:70.32755%;margin-right:3.85356%}.seven-col .six-col{width:85.16377%;margin-right:3.85356%}.seven-col .seven-col{width:100%;margin-right:0}.six-col .one-col{width:12.89592%;margin-right:4.52488%}.six-col .two-col{width:30.31674%;margin-right:4.52488%}.six-col .three-col{width:47.73755%;margin-right:4.52488%}.six-col .four-col{width:65.15837%;margin-right:4.52488%}.six-col .five-col{width:82.57918%;margin-right:4.52488%}.six-col .six-col{width:100%;margin-right:0}.five-col .one-col{width:15.61643%;margin-right:5.47945%}.five-col .two-col{width:36.71232%;margin-right:5.47945%}.five-col .three-col{width:57.80821%;margin-right:5.47945%}.five-col .four-col{width:78.9041%;margin-right:5.47945%}.five-col .five-col{width:100%;margin-right:0}.four-col .one-col{width:19.79166%;margin-right:6.94444%}.four-col .two-col{width:46.52777%;margin-right:6.94444%}.four-col .three-col{width:73.26388%;margin-right:6.94444%}.four-col .four-col{width:100%;margin-right:0}.three-col .one-col{width:27.01421%;margin-right:9.47867%}.three-col .two-col{width:63.5071%;margin-right:9.47867%}.three-col .three-col{width:100%;margin-right:0}.two-col .one-col{width:42.53731%;margin-right:14.92537%}.two-col .two-col{width:100%;margin-right:0}.one-col .one-col{width:100%;margin-right:0}.twelve-col .last-col{margin-right:0}.eleven-col .last-col{margin-right:0}.ten-col .last-col{margin-right:0}.nine-col .last-col{margin-right:0}.eight-col .last-col{margin-right:0}.seven-col .last-col{margin-right:0}.six-col .last-col{margin-right:0}.five-col .last-col{margin-right:0}.four-col .last-col{margin-right:0}.three-col .last-col{margin-right:0}.two-col .last-col{margin-right:0}.one-col .last-col{margin-right:0}.row,#context-footer{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;margin:0;padding:40px 40px 20px}.row:after{content:".";visibility:hidden;display:block;height:0;clear:both}.row-feature{background:none}.container{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:20px 20px 0;width:100%}.append-one{margin-right:8.51063%}.append-two{margin-right:17.02127%}.append-three{margin-right:25.53191%}.append-four{margin-right:34.04255%}.append-five{margin-right:42.55319%}.append-six{margin-right:51.06383%}.append-seven{margin-right:59.57446%}.append-eight{margin-right:68.0851%}.append-nine{margin-right:76.59574%}.append-ten{margin-right:85.10638%}.append-eleven{margin-right:93.61702%}.prepend-one{margin-left:8.51063%}.prepend-two{margin-left:17.02127%}.prepend-three{margin-left:25.53191%}.prepend-four{margin-left:34.04255%}.prepend-five{margin-left:42.55319%}.prepend-six{margin-left:51.06383%}.prepend-seven{margin-left:59.57446%}.prepend-eight{margin-left:68.0851%}.prepend-nine{margin-left:76.59574%}.prepend-ten{margin-left:85.10638%}.prepend-eleven{margin-left:93.61702%}.push-one{margin-left:57px}.pull-one,.pull-two,.pull-three,.pull-four,.pull-five,.pull-six,.pull-seven,.pull-eight,.pull-nine,.pull-ten,.pull-eleven{float:left;position:relative}.pull-one{margin-left:-6.38297%}.pull-two{margin-left:-17.02127%}.pull-three{margin-left:-25.53191%}.pull-four{margin-left:-34.04255%}.pull-five{margin-left:-34.04255%}.pull-six{margin-left:-51.06383%}.pull-seven{margin-left:-59.57446%}.pull-eight{margin-left:-68.0851%}.pull-nine{margin-left:-76.59574%}.pull-ten{margin-left:-85.10638%}.pull-eleven{margin-left:-93.61702%}.push-1,.push-two,.push-three,.push-four,.push-five,.push-six,.push-seven,.push-eight,.push-nine,.push-ten,.push-eleven{float:left;position:relative}.push-one{margin:0 -8.51063% 0 8.51063%}.push-two{margin:0 -19.14893% 0 19.14893%}.push-three{margin:0 -27.65957% 0 27.65957%}.push-four{margin:0 -36.17021% 0 36.17021%}.push-five{margin:0 -36.17021% 0 36.17021%}.push-six{margin:0 -53.19149% 0 53.19149%}.push-seven{margin:0 -61.70212% 0 61.70212%}.push-eight{margin:0 -70.21276% 0 70.21276%}.push-nine{margin:0 -78.7234% 0 78.7234%}.push-ten{margin:0 -87.23404% 0 87.23404%}.push-eleven{margin:0 -95.74468% 0 95.74468%}}html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,ol,ul,li,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,menu,nav,output,ruby,section,summary,time,mark,audio,video{border:0;margin:0;padding:0;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:300;src:url("../fonts/ubuntu-l-webfont.eot");src:url("../fonts/ubuntu-l-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-l-webfont.woff") format("woff"),url("../fonts/ubuntu-l-webfont.ttf") format("truetype"),url("../fonts/ubuntu-l-webfont.svg#ubuntulight") format("svg")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:400;src:local("Ubuntu");src:url("../fonts/ubuntu-r-webfont.eot");src:url("../fonts/ubuntu-r-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-r-webfont.woff") format("woff"),url("../fonts/ubuntu-r-webfont.ttf") format("truetype"),url("../fonts/ubuntu-r-webfont.svg#ubunturegular") format("svg")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:500;src:url("../fonts/ubuntu-m-webfont.eot");src:local("Ubuntu Medium"),local("Ubuntu-Medium"),url("../fonts/ubuntu-m-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-m-webfont.woff") format("woff"),url("../fonts/ubuntu-m-webfont.ttf") format("truetype"),url("../fonts/ubuntu-m-webfont.svg#ubuntumedium") format("svg")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:700;src:url("../fonts/ubuntu-b-webfont.eot");src:local("Ubuntu Bold"),local("Ubuntu-Bold"),url("../fonts/ubuntu-b-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-b-webfont.woff") format("woff"),url("../fonts/ubuntu-b-webfont.ttf") format("truetype"),url("../fonts/ubuntu-b-webfont.svg#ubuntubold") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:300;src:url("../fonts/ubuntu-li-webfont.eot");src:local("Ubuntu Light Italic"),local("Ubuntu-LightItalic"),url("../fonts/ubuntu-li-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-li-webfont.woff") format("woff"),url("../fonts/ubuntu-li-webfont.ttf") format("truetype"),url("../fonts/ubuntu-li-webfont.svg#ubuntulight_italic") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:400;src:local("Ubuntu Italic"),local("Ubuntu-Italic"),url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/GZMdC02DTXXx8AdUvU2etw.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:500;src:url("../fonts/ubuntu-mi-webfont.eot");src:local("Ubuntu Medium Italic"),local("Ubuntu-MediumItalic"),url("../fonts/ubuntu-mi-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-mi-webfont.woff") format("woff"),url("../fonts/ubuntu-mi-webfont.ttf") format("truetype"),url("../fonts/ubuntu-mi-webfont.svg#ubuntumedium_italic") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:700;src:local("Ubuntu Bold Italic"),local("Ubuntu-BoldItalic"),url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/pqisLQoeO9YTDCNnlQ9bfz8E0i7KZn-EPnyo3HZu7kw.woff") format("woff")}html{font-size:100%}body{color:#333;font-family:Ubuntu, Arial, "libra sans", sans-serif;font-weight:300}blockquote,q{quotes:none}blockquote{margin:28px 20px}blockquote:before,blockquote:after,q:before,q:after{content:"";content:none}legend{border:0;*margin-left:-7px}figure{margin:0}abbr,acronym{cursor:help}a:focus{outline:thin dotted}a:hover,a:active{outline:0}a:link,a:visited{color:#dd4814;text-decoration:none}a:hover,a:active,a:focus{text-decoration:underline}a.link-arrow:after{content:"\0000a0›"}nav ul li h2 a:after{content:"\0000a0›"}nav ul li a:after,.carousel ul li a:after,ul li p a:after{content:""}ol,ul{margin-left:20px;margin-bottom:20px}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}nav ul,nav ol{list-style:none;list-style-image:none}svg:not(:root){overflow:hidden}img{border:0;height:auto;max-width:100%}img.left{margin-right:20px}img.right{margin-left:20px}.middle img{vertical-align:middle;margin-top:4em}h1,h2,h3,h4,h5,h6{font-weight:300;line-height:1.3}h1{font-size:1.625em;margin-bottom:.5em}h2{font-size:1.438em;margin-bottom:.5em}h3{font-size:1.219em;margin-bottom:.522em}h4{font-size:1.25em;font-weight:400;margin-bottom:.615em}h5{font-size:1em;font-weight:700;margin-bottom:1em}h6{font-size:.723em;font-weight:400;margin-bottom:1em;letter-spacing:.1em;text-transform:uppercase}p,li{font-size:1em;line-height:1.5;margin:0;margin-bottom:.75em;padding:0}h2 span,h1 span{display:block}p+h2,ul+h2,ol+h2,pre+h2{margin-top:0.5625em}header nav a:link{font-weight:normal}p+h3,ul+h3,ol+h3,pre+h3{margin-top:0.78261em}p+h4,ul+h4,ol+h4,pre+h4{margin-top:1.39286em}ol+h2,p+h2,pre+h2,ul+h2{margin-top:.563em}ol+h3,p+h3,pre+h3,ul+h3{margin-top:.783em}ol+h4,p+h4,pre+h4,ul+h4{margin-top:1.219em}li{margin-bottom:.4em}li:last-of-type{margin-bottom:0}ins{background:#fffbeb;text-decoration:none}small,.smaller{font-size:13px}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{vertical-align:text-top}sub{vertical-align:text-bottom}dfn{font-style:italic}mark{background:#ff0;color:#000}code,pre{font-family:"Ubuntu Mono", "Consolas", "Monaco", "Lucida Console", "Courier New", Courier, monospace}pre{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fdf6f2;padding:0.6em 1em;white-space:pre-wrap;word-wrap:break-word}blockquote{margin:0}blockquote>p{font-size:0.92857em;margin-bottom:0.92308em;font-weight:100;margin:0 0 0.4em 0}blockquote small{font-size:.813em;line-height:1.4}button,input,select,textarea{font-family:Ubuntu,Arial,"libra sans",sans-serif;margin:0;vertical-align:baseline;*vertical-align:middle}select{font-size:1em;font-weight:300}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="search"]{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-moz-box-sizing:content-box;-webkit-appearance:none;-webkit-box-sizing:content-box;box-sizing:content-box;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-weight:300;outline:none;padding:0.69565em 0.86957em}input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}form fieldset{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-repeat:no-repeat;background-color:#EFEEEC;background-position:-15px -15px;border:0;margin-bottom:8px;padding:15px 20px}form fieldset h3{border-bottom:1px dotted #dfdcd9;margin-bottom:9px;padding-bottom:10px}form fieldset li:first-child{margin-top:0}form input[type="text"],form input[type="email"],form input[type="tel"],form textarea{-webkit-appearance:none;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background:#fff;border:1px solid #999;display:block;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-size:1em;font-weight:300;padding:0.69565em 0.86957em}form input:focus,form textarea:focus{border:1px solid #dd4814}form textarea[readonly='readonly']{color:#999}form input[type="checkbox"],form input[type="radio"]{margin:0;width:auto}form input[type="checkbox"]+label,form input[type="radio"]+label{display:inline;margin-left:5px;vertical-align:middle;width:auto}form input[type="submit"]{font-size:1.14286em;margin-bottom:0.75em;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-color:#dd4814;background-image:-moz-linear-gradient(#f26120, #dd4814);background-image:-webkit-gradient(linear, 0% 0%, 0% 100%, from(#f26120), to(#dd4814));background-image:-webkit-linear-gradient(#f26120, #dd4814);background-image:-o-linear-gradient(#f26120, #dd4814);-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;border:0;color:#fff;display:block;padding:10px 14px;text-shadow:none;width:auto;margin-bottom:0}form input[type="submit"]:hover{background:#dd4814}form label{cursor:pointer;display:block;margin-bottom:4px}form label span{color:#df382c}form ul{margin-left:0}form li{list-style:none outside none;margin-top:14px}form button[type="submit"]{border:0;display:inline-block;font-family:Ubuntu, Arial, "libra sans", sans-serif;text-decoration:none;font-weight:300}form input[type="reset"]{display:none}table{border-collapse:collapse;border-spacing:0;overflow-x:scroll;margin-bottom:20px;margin:0 0 2.85714em 0;width:100%}table th,table td{padding:15px 10px;background:#f0edea;border:1px dotted #888888}table td{text-align:center;vertical-align:middle}table thead th{border-collapse:separate;border-spacing:0 10px;background:#fee3d2;color:#333333;font-weight:normal}table tbody th{text-align:left;font-weight:normal;font-weight:300}table th[scope="col"]{text-align:center}table thead th:first-of-type{text-align:left}@media only screen and (max-width: 768px){table{display:block}}@media only screen and (min-width: 984px){form fieldset{padding:15px 20px}img{max-width:none}}.audience-consumer{color:#333333}.audience-consumer .row-box,.audience-consumer .main-content{color:#333333}.audience-consumer .inner-wrapper{background:#fff}.audience-consumer .quote-right-top{padding:60px 60px 0 40px;background:url("/sites/ubuntu/latest/u/img/patterns/quote-orange-br-287x287.png") no-repeat;height:287px;position:absolute;right:-40px;text-align:left;top:-90px;width:31.91489%}.audience-consumer .quote-right-top p{font-size:1.14286em;margin-bottom:0.75em;margin:0.769em;padding-bottom:0;color:#fff}.audience-consumer .quote-right-top p cite{font-size:0.85714em;margin-bottom:1em;color:#fff;padding:0}.audience-consumer .quote-right-top p a,.audience-consumer .quote-right p a{color:#fff}.audience-consumer .quote-right{font-size:1.28571em;margin-bottom:0.66667em;color:#fff;padding:50px 100px 0 50px;text-indent:-6px;background:url("/sites/ubuntu/latest/u/img/patterns/quote-orange-bl-287x287.png") no-repeat;min-height:287px;position:absolute;right:-20px;text-align:left;top:-90px;width:21.2006% em}.audience-consumer .quote-right cite{font-style:normal;margin-left:6px}.audience-consumer .quote-right-alt{background:url(/sites/ubuntu/latest/u/img/patterns/quote-white-br-360x360.png) 0 -100px no-repeat;color:#dd4814;padding:50px 50px 0 50px}.audience-consumer .quote-right-right{background:url("/sites/ubuntu/latest/u/img/patterns/quote-orange-br-287x287.png") no-repeat}.audience-enterprise h1{margin:0 0 18px 0}.audience-enterprise td{background:#fff}.audience-enterprise th,.audience-enterprise td{padding:6px 10px;background:#fff}.audience-enterprise th[scope="col"]{background:#E2D4DC;color:#772953}.audience-enterprise tbody th[rowspan]{background:#F7F2F6}.audience-enterprise tfoot th[rowspan]{background:#dfdcd9}.audience-enterprise tfoot td,.audience-enterprise tfoot th{font-weight:normal;background:#dfdcd9}.audience-enterprise .inner-wrapper{background:#2c001e;color:#fff}.audience-enterprise .row-box{background:#fff;color:#333333}.row-enterprise{background:#772953;color:#fff;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.row-enterprise .box,.row-enterprise div{background:#772953;color:#fff}.row-enterprise a{color:#fff}.enterprise-dot-pattern{background:url("/sites/ubuntu/latest/u/img/patterns/enterprise-dot-pattern.png")}.developer-dot-pattern{background:url("/sites/ubuntu/latest/u/img/patterns/developer-dot-pattern.png")}.wrapper,header.banner .nav-primary,nav div.footer-a div,.inline-lists ul,.legal{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:auto}.inner-wrapper{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;clear:both;display:block;float:left;width:100%;margin:0;padding-bottom:20px;position:relative;z-index:1}@media only screen and (min-width: 768px){.med-six-col .three-col{width:48%}.med-six-col .three-col:nth-of-type(2n){margin-right:0}}@media only screen and (min-width: 769px){.inner-wrapper{border-radius:4px;padding-bottom:20px}}@media only screen and (min-width: 984px){.wrapper{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;margin:0 auto;position:relative;text-align:left;width:984px}.inner-wrapper{-moz-box-shadow:0 0 3px #c9c9c9;-webkit-box-shadow:0 0 3px #c9c9c9;box-shadow:0 0 3px #c9c9c9;margin:10px 0 30px}.three-col,.med-six-col .three-col{width:23.30%}.three-col.last-col:nth-of-type(2n){margin-right:0}.med-six-col .three-col:nth-of-type(2n){margin-right:20px}.med-six-col .three-col.last-col{margin-right:0}}.left{float:left}.right{float:right}.caps{text-transform:uppercase}img{border:0 none;height:auto;max-width:100%}img.left{margin-right:0}img.touch-border{margin-bottom:-3px}.accessibility-aid,.off-left{position:absolute;left:-999em}a.external{-moz-background-size:0.7em 0.7em;-webkit-background-size:0.7em 0.7em;-o-background-size:0.7em 0.7em;background-size:0.7em 0.7em;padding-right:.9em;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/external-link-orange.svg");background-position:right 1px;background-repeat:no-repeat}.opera-mini a.external,.no-svg a.external{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/external-link-orange.png")}.text-center,.align-center{text-align:center}.no-margin{margin:0}.no-margin-bottom{margin-bottom:0}.no-padding-bottom{padding-bottom:0}.pull-left-20{margin-left:-20px}.pull-right-20{margin-right:-20px}.pull-left-40{margin-left:-40px}.pull-right-40{margin-right:-41px}.no-border{border:0}.link-top{font-size:1em;margin-bottom:0.85714em;clear:both;margin-bottom:40px;margin-top:-40px}.link-top a{background:#fff;margin-right:10px;margin-top:-17px;padding:5px;float:right}.pull-bottom-right{position:absolute;right:0;bottom:0;left:auto}.box .pull-bottom-right{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0}.pull-bottom-left{margin-left:-20px;margin-bottom:-21px}.pull-top-right{margin-left:-20px;margin-top:-21px}div.box-image-centered span img.priority-0,div.row-image-centered span img.priority-0,div.row.row-image-centered span img.priority-0,img.priority-0{position:absolute;left:-999em}.priority-0,.not-for-small{position:absolute;left:-999em}.video-container{position:relative;padding-bottom:56.25%;padding-top:30px;height:0;overflow:hidden}.video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}.video-container+h3,.video-container+.video-title{margin-top:20px}@media only screen and (max-width: 768px){.pull-right-40{margin-right:-30px}.pull-bottom-right,.pull-bottom-left{position:static}img.pull-bottom-left{margin-bottom:0;margin-left:0}}@media only screen and (min-width: 768px){div.box-image-centered span img.priority-0,div.row-image-centered span img.priority-0,div.row.row-image-centered span img.priority-0,img.priority-0{position:relative;left:auto}.priority-0,.not-for-small{position:relative;left:auto}.for-mobile,.for-small{position:absolute;left:-999em}.pull-right{float:right;margin-right:-30px}img.pull-left{margin-left:-30px}img.touch-border{float:left;margin-bottom:-30px}}@media only screen and (min-width: 769px){img.left{margin-right:20px}}@media only screen and (min-width: 984px){img.touch-border{float:left;margin-bottom:-40px}img.pull-left{margin-left:-40px}.pull-right{float:right;margin-right:-40px}.for-tablet,.for-medium{display:none}.no-border{border:0}}.caps-centered,.muted-heading{font-size:.875em;margin-bottom:20px;text-align:center;text-transform:uppercase}p.intro{font-size:1.14286em;margin-bottom:0.75em;line-height:1.4}.row div p:last-child,.row div ul:last-child{margin-bottom:0}.four-col p:last-child{margin-bottom:0}.note{color:#888888;font-size:.813em}@media only screen and (min-width: 768px){p.intro{font-size:1.13333em}}@media only screen and (min-width: 984px){h1{font-size:2.8125em}h2{font-size:2em;margin-bottom:.375em}h3{font-size:1.438em;margin-bottom:.522em}h4{font-size:1em;margin-bottom:.75em}h5{font-size:1em}p,li,code,pre{font-size:16px;line-height:1.5;margin-bottom:.75em}p.intro{font-size:1.25em}}header.banner{border-top:0;min-width:100%;width:auto;background:#dd4814;display:block;position:relative;z-index:2}header.banner .nav-primary{border:0;margin:0 auto;overflow:hidden}header.banner .nav-primary ul{border-right:1px solid #ed6637;float:left;margin:0;position:relative}header.banner .nav-primary ul li{border-left:1px solid #c64012;float:left;list-style-image:none;margin:0;text-indent:0;vertical-align:bottom}header.banner .nav-primary ul li:last-child{border-right:1px solid #c64012}header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited{font-size:14px;border-left:1px solid #ec5b29;color:#fff;display:block;margin-bottom:0;padding:14px 14px 13px;position:relative;text-align:center;text-decoration:none;-webkit-font-smoothing:subpixel-antialiased;-moz-font-smoothing:subpixel-antialiased;-o-font-smoothing:subpixel-antialiased;font-smoothing:subpixel-antialiased}header.banner .nav-primary ul a.active{background:#B83A10;border-left:1px solid #ec5b29}header.banner .nav-primary ul li a:hover{background:#e1662f;border-top:0;-moz-box-shadow:inset 0 2px 2px -2px #777;-webkit-box-shadow:inset 0 2px 2px -2px #777;box-shadow:inset 0 2px 2px -2px #777}#main-navigation-link{display:none}header.banner .nav-toggle{position:absolute;right:0;display:block;width:48px;height:48px;text-indent:-99999px;background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.svg);-moz-background-size:25px auto;-webkit-background-size:25px auto;-o-background-size:25px auto;background-size:25px auto;background-repeat:no-repeat;background-position:center center;cursor:pointer}header.banner .no-script{display:none}.opera-mini header.banner .nav-toggle,.no-svg header.banner .nav-toggle{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.png)}header.banner nav ul{background-color:#f0f0f0;display:none;float:left}header.banner .nav-primary.active{-moz-box-shadow:0 1px 2px 1px rgba(120,120,120,0.2);-webkit-box-shadow:0 1px 2px 1px rgba(120,120,120,0.2);box-shadow:0 1px 2px 1px rgba(120,120,120,0.2);padding:0;border-bottom:1px solid #d4d7d4}header nav ul.active{display:block}header.banner .nav-primary ul li,header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:active{display:block;padding:0;margin:0;border:none}header.banner .nav-primary ul li a:hover{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background-color:#d0d0d0}header.banner .nav-primary ul li a.active{background-color:#ddd}header.banner .nav-primary ul li{border-bottom:1px solid #F2F2F4;font-size:16px}header.banner .nav-primary ul li:last-child{border:0}header.banner nav.nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:active{padding:14px 14px 13px;text-align:left}header.banner nav.nav-primary ul.active li ul{display:none}#menu.active:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-arrow.svg);background-repeat:no-repeat;background-position:50% 26px;content:"";display:block;height:23px;margin-left:0;padding-bottom:17px;position:relative;top:-3px;width:48px;z-index:999}html.no-svg #menu.active:after,.opera-mini #menu.active:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-arrow.png)}.nav-secondary{border-bottom:1px solid #dfdcd9;margin-bottom:0}.nav-secondary ul{float:left;margin-bottom:10px;margin-left:2px}.nav-secondary ul li{float:left;margin-top:16px;font-size:14px;margin-right:15px}.nav-secondary ul li a:link,.nav-secondary ul li a:visited{color:#333;font-size:14px;float:left}.nav-secondary ul li a:hover,.nav-secondary ul li a:active{color:#dd4814;text-decoration:none}.nav-secondary ul li,.nav-secondary ul li.active a:link,.nav-secondary ul li.active a:visited{color:#dd4814;text-decoration:none}.nav-secondary ul.breadcrumb{margin-left:20px}.nav-secondary ul.breadcrumb li,.nav-secondary ul.breadcrumb li a:link,.nav-secondary ul.breadcrumb li a:visited{color:#888888;margin-right:8px}.nav-secondary ul.breadcrumb li.active a:link,.nav-secondary ul.breadcrumb li.active a:visited{color:#dd4814}header.banner h2{font-size:1.78571em;margin-bottom:0.48em;display:block;left:4px;margin-bottom:0;position:relative;text-transform:lowercase;top:14px}header.banner h2 a:link,header.banner h2 a:visited,header.banner a{color:#fff;float:left;text-decoration:none}header.banner .logo{border-left:0;float:left;height:48px;overflow:hidden}header.banner .logo-ubuntu{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/ubuntu-logo.png") no-repeat scroll 0 10px transparent;font-size:18px;margin-bottom:0;position:relative;text-transform:lowercase;float:left;margin:0;display:inline-block;height:32px;min-width:128px;margin-right:-20px;margin-left:10px;padding:7px 14px 9px 0}header.banner .logo-ubuntu img{margin-right:8px;position:absolute;left:-999em}header.banner .logo-ubuntu span{float:left;font-size:23px;font-weight:300;padding-left:122px;padding-right:20px;position:relative;top:5px}header.banner .nav-primary.nav-left .logo-ubuntu{float:right}header.banner .nav-primary.nav-right .logo-ubuntu{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-white.svg");background-size:107px 25px;float:left}html.no-svg header.banner .nav-primary.nav-right .logo-ubuntu,.opera-mini header.banner .nav-primary.nav-right .logo-ubuntu{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-white.png")}@media only screen and (max-width: 295px){header.banner .nav-primary.nav-right .logo-ubuntu,header.banner .logo-ubuntu{-moz-background-size:20px 20px;-webkit-background-size:20px 20px;-o-background-size:20px 20px;background-size:20px 20px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu_cof-white_orange-hex.svg") 0 50% no-repeat;min-width:0;width:38px}header.banner .logo-ubuntu span{padding-left:38px}}html.no-svg header.banner .logo-ubuntu,.opera-mini header.banner .logo-ubuntu{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu_cof-white_orange-hex.png")}@media only screen and (max-width: 768px){header.banner .nav-primary{-moz-box-shadow:0 1px 2px 1px rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 2px 1px rgba(0,0,0,0.2);box-shadow:0 1px 2px 1px rgba(0,0,0,0.2)}header.banner .nav-primary.active{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;padding:0}header nav ul.active{float:left}header nav ul.active li:last-child a:link,header nav ul.active li:last-child a:visited{border-bottom:0}header.banner .nav-primary ul{position:relative;width:100%}header.banner .nav-primary ul li.active a:link,header.banner .nav-primary ul li.active a:visited{color:#333;font-weight:700}header.banner .nav-primary ul li,header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:active{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:transparent;border:none;display:block;font-weight:300;margin:0;padding:0;width:100%}header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:active{background-color:#f0f0f0;border-bottom:1px solid #d4d7d4;color:#333333;font-size:1em}header.banner .nav-primary ul li:nth-last-child(-n+2) a:link,header.banner .nav-primary ul li:nth-last-child(-n+2) a:visited{border:0}header.banner .nav-primary ul li a:hover{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background:#f8f8f8}header.banner .nav-primary ul li a.active{background-color:#ddd}header.banner nav.nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:active{padding:8px 10px;text-align:left}header.banner .nav-primary ul li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:transparent;border-bottom:0;border-right:1px solid #d4d7d4;float:left;width:50%}.nav-secondary{background:#fff}.nav-secondary ul.second-level-nav{border-top:1px solid #d4d7d4;display:none;margin-bottom:0;margin-left:0;padding-bottom:10px;padding-top:10px;width:100%}.nav-secondary ul.second-level-nav li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:50%;margin:0;float:left}.nav-secondary ul.second-level-nav li a,.nav-secondary ul.second-level-nav li a:link,.nav-secondary ul.second-level-nav li a:visited{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;height:100%;padding:10px 10px 10px 20px;width:100%}.nav-secondary ul.second-level-nav li.active a,.nav-secondary ul.second-level-nav li.active a:link,.nav-secondary ul.second-level-nav li.active a:visited{color:#333;font-weight:700}.nav-secondary ul.third-level-nav{display:none;margin-bottom:0;width:100%;padding-bottom:20px}.nav-secondary ul.third-level-nav li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:50%;margin:0;float:left;padding-left:30px}.nav-secondary ul.third-level-nav li a,.nav-secondary ul.third-level-nav li a:link,.nav-secondary ul.third-level-nav li a:visited{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:10px 10px 10px 0;display:block;width:100%;height:100%}.nav-secondary ul.third-level-nav li.active a,.nav-secondary ul.third-level-nav li.active a:link,.nav-secondary ul.third-level-nav li.active a:visited{color:#333;font-weight:700}.nav-secondary ul.third-level-nav li.single-link{width:100%}.nav-secondary ul.third-level-nav li:only-child{width:100%}.nav-secondary ul.breadcrumb{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;margin-left:0;margin-bottom:0}.nav-secondary ul.breadcrumb li:first-of-type{border-bottom:1px solid #d4d7d4;margin-bottom:-1px}.nav-secondary ul.breadcrumb li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#fff;width:100%;display:block;height:40px;margin:0}.nav-secondary ul.breadcrumb li a,.nav-secondary ul.breadcrumb li a:link,.nav-secondary ul.breadcrumb li a:visited{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:16px;width:100%;color:#333333;display:block;margin-right:0;text-decoration:none;padding:8px 10px 0 10px}.nav-secondary ul.breadcrumb li.active{margin-top:12px}.nav-secondary ul.breadcrumb li.active a,.nav-secondary ul.breadcrumb li.active a:link,.nav-secondary ul.breadcrumb li.active a:visited{color:#333;font-weight:700}.nav-secondary ul.breadcrumb li:nth-of-type(2n){margin-top:12px}.nav-secondary ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-down-arrow.svg);background-position:center center;background-repeat:no-repeat;background-size:18px;float:right;height:18px;margin-right:-5px;margin-top:-6px;padding:10px;position:relative;right:0;top:0;width:18px}.nav-secondary ul.breadcrumb li+li{display:none}.nav-secondary ul.breadcrumb li+li a:link,.nav-secondary ul.breadcrumb li+li a:active,.nav-secondary ul.breadcrumb li+li a:visited{padding-left:20px}.nav-secondary ul.breadcrumb li+li a.after{background-image:none}.nav-secondary.open ul.breadcrumb li a:after,.nav-secondary.open ul.breadcrumb li a:link:after,.nav-secondary.open ul.breadcrumb li a:visited:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.svg)}.nav-secondary.open ul.breadcrumb li+li a.after{background-image:none}.nav-secondary.open ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.svg);margin-top:-7px}.nav-secondary.open ul.second-level-nav,.nav-secondary.open ul.third-level-nav,.nav-secondary.open ul.breadcrumb li+li{display:block}.no-js .nav-secondary ul.second-level-nav{display:block}.no-js #main-navigation-link{position:absolute;right:10px;top:12px;width:20px;height:28px;z-index:999;text-indent:-999em;display:block}.no-js #main-navigation-link a{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.svg");background-position:center center;background-repeat:no-repeat;background-size:25px auto;display:block;width:28px;height:28px;position:absolute}html.no-svg .nav-secondary ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-down-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg header.banner .nav-primary #google-appliance-search-form button[type="submit"],.opera-mini header.banner .nav-primary #google-appliance-search-form button[type="submit"]{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-black.png")}html.no-svg .nav-secondary ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-down-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg header.banner .nav-primary #google-appliance-search-form button[type="submit"],.opera-mini header.banner .nav-primary #google-appliance-search-form button[type="submit"]{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-black.png")}header.banner .nav-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.svg");background-position:center center;background-repeat:no-repeat;background-size:25px auto;cursor:pointer;display:block;height:48px;position:absolute;right:0;text-indent:-99999px;width:48px}html.no-svg header.banner .nav-toggle,.opera-mini header.banner .nav-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.png")}}@media only screen and (min-width: 768px){header.banner .nav-primary ul li{border-bottom:0}}@media only screen and (min-width: 769px){header.banner{-moz-box-shadow:0 2px 2px -2px #777777 inset,2px 1px #FFFFFF;-webkit-box-shadow:0 2px 2px -2px #777777 inset,2px 1px #FFFFFF;box-shadow:0 2px 2px -2px #777777 inset,2px 1px #FFFFFF}header.banner nav.nav-primary{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;border-bottom:0}header.banner .nav-toggle{display:none}header.banner nav ul{background-color:transparent;display:block}header.banner .nav-primary ul li{border-left:1px solid #C64012}header.banner .nav-primary ul li a:active,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:visited,header.banner nav.nav-primary ul li a:link{border-left:1px solid #EC5B29}header.banner .nav-primary ul li:last-child{border-right:1px solid #C64012;border-left:1px solid #C64012}header.banner .nav-primary ul li a.active{background-color:#B83A10}header.banner .nav-primary ul li a:hover{background-color:#E1662F}.nav-secondary ul:last-child li:last-child{padding-bottom:10px}.nav-secondary ul.breadcrumb li,.nav-secondary ul.second-level-nav li,.nav-secondary ul.third-level-nav li{margin-right:15px}.nav-secondary ul.breadcrumb{float:left}.nav-secondary ul.breadcrumb li{margin-bottom:10px}.nav-secondary ul{float:none;margin-bottom:0}.nav-secondary ul li{margin-bottom:5px}}@media only screen and (min-width: 984px){header.banner{margin-bottom:20px}header.banner nav.nav-primary ul{display:block}header.banner .nav-primary,#nav-global .nav-global-wrapper{width:984px}header.banner .nav-primary.nav-right .logo-ubuntu{margin-left:0}}header.banner .nav-primary ul{position:static}header.banner .nav-primary li ul{-moz-box-shadow:0 2px 2px -1px #777777;-webkit-box-shadow:0 2px 2px -1px #777777;box-shadow:0 2px 2px -1px #777777;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;background:#f7f7f7;border:1px solid #d5d5d5;display:none;float:none;margin:0;padding:5px 0;position:absolute;top:51px;width:200px}header.banner .nav-primary li:hover ul:after{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-up-smaller.png") no-repeat;content:'';display:block;height:8px;left:20px;position:relative;top:-13px;width:200px;z-index:999}.no-generatedcontent header.banner .nav-primary li ul{-webkit-border-radius:0 0 10px 10px;-moz-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px;top:48px}header.banner .nav-primary li ul .arrow-up{display:none}header.banner .nav-primary li ul li{border:0;float:none}header.banner .nav-primary li ul li a:link,header.banner .nav-primary li ul li a:visited{border:0;color:#333333;padding:0 0 11px 14px;text-align:left;width:170px}header.banner .nav-primary li ul li a:hover{background:none repeat scroll 0 0 transparent;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;color:#DD4814}header.banner .nav-primary li ul li.first a:link,header.banner .nav-primary li ul li.first a:visited,header.banner .nav-primary li ul li:first-of-type a:link{padding:10px 14px}header.banner .nav-primary li ul li.active a:link,header.banner .nav-primary li ul li.active a:visited{background:none repeat scroll 0 0 transparent !important}header.banner .nav-primary li ul .promo{border-top:1px solid #D5D5D5;float:left;margin-top:5px;padding:15px 0 0}header.banner .nav-primary li ul .promo a:link,header.banner .nav-primary li ul .promo a:visited{background:none repeat scroll 0 0 transparent;border-left:0 none;color:#333333;height:auto;padding:0;text-align:left}header.banner .nav-primary li ul .promo p{margin:0 10px}header.banner .nav-primary li ul .promo a:hover{box-shadow:none;color:#DD4814}header.banner .nav-primary li ul .promo img{margin-top:14px;margin-bottom:-6px;-webkit-border-radius:0 0 10px 10px;-moz-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px;position:relative;top:1px}header.banner .nav-primary li ul .promo .category{color:#888888;font-size:11px;margin:0 10px;text-transform:uppercase}header.banner .nav-primary li:hover ul{display:block}html.lt-ie8 header.banner .nav-primary li:hover ul{display:none}.header-search,#box-search{padding:7px 0 7px 14px;overflow:hidden}.header-search input[type="search"],.header-search input[type="text"],#box-search input[type="search"],#box-search input[type="text"]{-webkit-appearance:none;-moz-box-shadow:inset 0 1px 4px rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 4px rgba(0,0,0,0.2);box-shadow:inset 0 1px 4px rgba(0,0,0,0.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-transition:all 0.5s ease-out;-moz-transition:all 0.5s ease-out;-ms-transition:all 0.5s ease-out;-o-transition:all 0.5s ease-out;transition:all 0.5s ease-out;background-color:#be3d00;border:none;color:#fff;display:block;float:left;font-size:16px;height:2.1em;margin-bottom:0;padding:0.5em 2.5em 0.5em 0.5em;width:100%}.header-search ::-webkit-input-placeholder,#box-search ::-webkit-input-placeholder{color:white;opacity:0.4}.header-search ::-webkit-input-placeholder,#box-search ::-webkit-input-placeholder{color:white;opacity:0.4}.header-search ::-moz-placeholder,#box-search ::-moz-placeholder{color:white;opacity:0.4}.header-search :-ms-input-placeholder,#box-search :-ms-input-placeholder{color:white;opacity:0.4}.header-search input:-moz-placeholder,#box-search input:-moz-placeholder{color:white;opacity:0.4}.header-search ::placeholder,#box-search ::placeholder{color:white;opacity:0.4}.header-search input[type="search"]:focus,#box-search input[type="search"]:focus{background-color:#a63603}.header-search button[type=submit],#box-search button[type=submit]{padding:3px 2px;line-height:0;float:left;margin-left:-40px;display:block;background:none;overflow:visible}.header-search button[type=submit]:hover,#box-search button[type=submit]:hover{background:none}.header-search button[type=submit] img,#box-search button[type=submit] img{height:28px;width:28px}header.banner .search-toggle{-moz-background-size:20px 20px;-webkit-background-size:20px 20px;-o-background-size:20px 20px;background-size:20px 20px;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search_icon_white_64.png");background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search.svg");background-position:center center;background-repeat:no-repeat;display:block;height:48px;outline:none;overflow:hidden;position:absolute;right:58px;text-indent:-999em;top:0;width:24px}.search-toggle:link,.search-toggle:active{outline:none}#box-search,.header-search{background:#f0f0f0;border:0;display:none;float:left;margin-bottom:0;position:relative;margin:0 0 -1px 0;padding:0;width:100%;z-index:3}#box-search.active,.header-search.active,.header-search.open{display:block}#box-search div,.header-search div{-moz-box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);-webkit-box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);background:#f0f0f0;margin:10px;position:relative;z-index:1}#box-search form input[type="search"],.header-search form input[type="search"]{font-size:1.14286em;margin-bottom:0.75em;-webkit-border-radius:4px 4px 4px 4px;-moz-border-radius:4px 4px 4px 4px;border-radius:4px 4px 4px 4px;-moz-box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);-webkit-box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;border:0;color:#333;font-size:16px;height:auto;margin:0;float:left;padding:9px 10px;width:100%}.yes-js .header-inner #box-search,.yes-js .header-inner .header-search{display:none}.yes-js .header-inner #box-search form,.yes-js .header-inner .header-search form{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin-left:0;margin-right:0;overflow:hidden;padding:10px;top:0;z-index:999;position:relative;width:100%}@media only screen and (max-width: 768px){header.banner .search-toggle{right:48px}html.no-svg .search-toggle,.opera-mini .search-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-white.png")}}@media only screen and (min-width: 768px){header.banner .search-toggle{display:none}}@media only screen and (min-width: 960px){#box-search,.header-search{background:none;overflow:hidden;padding:7px 0 7px 14px;border-right:0 none;float:right;margin-bottom:0;padding-bottom:5px;padding-right:0;padding-top:7px;max-width:220px}#box-search form input[type="text"],#box-search form input[type="search"],.header-search form input[type="text"],.header-search form input[type="search"]{-moz-box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-search.png") no-repeat scroll 5px center,none repeat scroll 0 0 #BE3D00;border:6px solid #DE6532;border-width:0 0 1px;color:#fff;font-size:0.813em;height:24px;margin-bottom:0;padding:4px 4px 4px 30px;transition:all 0.5s ease 0s;width:86px}}@media only screen and (max-width: 960px){header.banner nav.nav-primary .header-search{padding:0;position:relative;top:0;width:100%}header.banner nav.nav-primary .header-search input[type="search"]{border-radius:0;background:#f7f7f7;color:#333}header.banner nav.nav-primary .header-search button[type="submit"]{width:32px;height:38px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-black.svg") no-repeat scroll center center transparent;background-size:28px 28px}header.banner nav.nav-primary .header-search button[type="submit"] img{max-width:none;display:none}header.banner nav.nav-primary .header-search.open{display:block}header.banner .search-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-white.svg");background-position:center center;background-repeat:no-repeat;background-size:25px auto;cursor:pointer;right:0;display:block;height:48px;position:absolute;text-indent:-99999px;width:48px}html.no-svg header.banner .search-toggle,.opera-mini header.banner .search-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/img/search-white.png")}.opera-mini x:-o-prefocus,.opera-mini header.banner .search-toggle{-o-background-size:25px auto;background-size:25px auto}}@media only screen and (min-width: 984px){#box-search,.header-search{display:block;margin-right:0}#box-search form input[type="text"]:focus,.header-search form input[type="text"]:focus{width:160px}}@media only screen and (max-width: 768px){header.banner .search-toggle{right:48px}}body.ubuntu-search .nav-secondary,body.search-results .nav-secondary,body.search-no-results .nav-secondary{display:none}body.ubuntu-search section>h1,body.ubuntu-search section article h1,body.search-results section>h1,body.search-results section article h1,body.search-no-results section>h1,body.search-no-results section article h1{padding-bottom:10px;font-size:1.438em;margin-bottom:0}body.ubuntu-search section>h1,body.search-results section>h1,body.search-no-results section>h1{border-bottom:1px dotted #dfdcd9}body.ubuntu-search .main-search,body.search-results .main-search,body.search-no-results .main-search{padding:20px 0;margin:0 0 20px 0;background-color:transparent}body.ubuntu-search .main-search input[type="search"],body.search-results .main-search input[type="search"],body.search-no-results .main-search input[type="search"]{float:left;width:100%;font-size:2em;border:1px solid #999;-moz-box-sizing:border-box;box-sizing:border-box;padding:0.2em 65px 0.2em 0.2em}body.ubuntu-search .main-search button[type=submit],body.search-results .main-search button[type=submit],body.search-no-results .main-search button[type=submit]{padding:4px;line-height:0;float:left;margin-left:-53px;display:block;background:none;overflow:visible;width:auto;margin-top:-4px}body.ubuntu-search .main-search button[type=submit]:hover,body.search-results .main-search button[type=submit]:hover,body.search-no-results .main-search button[type=submit]:hover{background:none}body.ubuntu-search .main-search button[type=submit] img,body.search-results .main-search button[type=submit] img,body.search-no-results .main-search button[type=submit] img{height:45px;width:45px}body.ubuntu-search .search-result h1 .title-main,body.search-results .search-result h1 .title-main,body.search-no-results .search-result h1 .title-main{margin-right:20px}body.ubuntu-search .search-result h1 .result-url,body.search-results .search-result h1 .result-url,body.search-no-results .search-result h1 .result-url{color:#999;overflow:hidden;text-overflow:ellipsis;display:block;vertical-align:bottom;padding-bottom:2px}body.ubuntu-search .search-result h1 .result-url a,body.search-results .search-result h1 .result-url a,body.search-no-results .search-result h1 .result-url a{color:#999}body.ubuntu-search .search-result p,body.search-results .search-result p,body.search-no-results .search-result p{margin-bottom:0}body.ubuntu-search .num-results,body.search-results .num-results,body.search-no-results .num-results{display:inline-block;margin-left:20px}body.ubuntu-search .bottom-results-total,body.search-results .bottom-results-total,body.search-no-results .bottom-results-total{text-align:center;width:100%;overflow:visible;padding-top:20px;margin:0}body.ubuntu-search .bottom-nav,body.search-results .bottom-nav,body.search-no-results .bottom-nav{overflow:hidden;margin-top:-26px}body.ubuntu-search .bottom-nav ul,body.search-results .bottom-nav ul,body.search-no-results .bottom-nav ul{margin-bottom:0;margin-left:0;padding:0;overflow:hidden}body.ubuntu-search .bottom-nav li,body.search-results .bottom-nav li,body.search-no-results .bottom-nav li{float:left;margin-left:15px}body.ubuntu-search .bottom-nav li:first-child,body.search-results .bottom-nav li:first-child,body.search-no-results .bottom-nav li:first-child{margin-left:0}body.ubuntu-search .nav-back,body.search-results .nav-back,body.search-no-results .nav-back{float:left}body.ubuntu-search .nav-back li:before,body.search-results .nav-back li:before,body.search-no-results .nav-back li:before{content:"\2039";color:#dd4814;margin-right:5px}body.ubuntu-search .nav-back li.item-extreme:before,body.search-results .nav-back li.item-extreme:before,body.search-no-results .nav-back li.item-extreme:before{content:"\2039\2039"}body.ubuntu-search .nav-forward,body.search-results .nav-forward,body.search-no-results .nav-forward{float:right}body.ubuntu-search .nav-forward li:after,body.search-results .nav-forward li:after,body.search-no-results .nav-forward li:after{content:"\203A";color:#dd4814;margin-left:5px}body.ubuntu-search .nav-forward li.item-extreme:after,body.search-results .nav-forward li.item-extreme:after,body.search-no-results .nav-forward li.item-extreme:after{content:"\203A\203A"}body.ubuntu-search .error-notification,body.search-results .error-notification,body.search-no-results .error-notification{background-color:#fdffdc;color:#333;padding:20px;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;margin-top:20px;display:block}body.ubuntu-search .result-line,body.search-results .result-line,body.search-no-results .result-line{color:#ada69e}body.ubuntu-search .results-top,body.search-results .results-top,body.search-no-results .results-top{border-bottom:1px dotted #dfdcd9;padding-bottom:0.5em}body.ubuntu-search .search-container,body.search-results .search-container,body.search-no-results .search-container{padding-bottom:0}@media only screen and (min-width: 768px){.ubuntu-search .main-search button[type=submit]{margin-left:-60px;margin-top:0}}body footer.global #nav-global li:first-of-type a{margin-left:0}footer.global{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-moz-box-shadow:inset 0 2px 2px -1px #d3d3d3;-webkit-box-shadow:inset 0 2px 2px -1px #d3d3d3;box-shadow:inset 0 2px 2px -1px #d3d3d3;background:none;border-top:0;clear:both;display:block;padding:30px 10px 20px;position:relative;width:100%}footer.global .legal{margin:0 auto;width:100%}footer.global .legal{background-image:none;position:relative;clear:both;min-height:40px}footer.global .legal p,footer.global .legal ul{padding-left:0}footer.global h2{font-size:0.75em;line-height:1.4;margin-bottom:0;padding-bottom:0.5em}footer.global h2,footer.global h2 a:link,footer.global h2 a:visited{color:#333333;font-weight:normal}footer.global nav ul li h2 a:after{content:""}footer.global ul{margin:0}footer.global nav ul li.two-col{display:inline-block;min-height:10em;vertical-align:top}footer.global nav ul li li{font-size:0.85714em;margin-bottom:1em;font-size:0.75em;margin-bottom:0}footer.global ul li li a:link,footer.global ul li li a:visited{color:#333333;margin-bottom:0}footer.global ul li li a:hover,footer.global ul li li a:active,footer.global h2 a:hover,footer.global h2 a:active{color:#dd4814}footer.global .inline li{display:inline}footer.global p,footer.global ul.inline li a{color:#333333;font-size:12px;margin-bottom:0}footer.global ul.inline li a:hover{color:#dd4814}footer.global ul.inline li:after{color:#888888;content:"\00b7";vertical-align:middle;margin:0 5px}footer.global ul.inline li:last-child{width:120px}footer.global ul.inline li:last-child:after{content:""}footer.global .inline li{float:none;margin-bottom:0}footer.global .top-link{-moz-box-shadow:0 -4px 4px -4px rgba(0,0,0,0.3) inset;-webkit-box-shadow:0 -4px 4px -4px rgba(0,0,0,0.3) inset;box-shadow:0 -4px 4px -4px rgba(0,0,0,0.3) inset;background:none repeat scroll 0 0 transparent;border:0 none;float:left;font-size:0.75em;letter-spacing:0.05em;margin:0 0 0 -10px;padding-right:20px;text-transform:uppercase;width:100%}footer.global .top-link a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-upload-warmgrey.svg");background-position:10px center;background-repeat:no-repeat;background-size:14px 14px;border-bottom:0 none;color:#888888;display:block;float:none;font-weight:400;padding:12px 0 12px 28px}html.no-svg footer.global .top-link a,.opera-mini footer.global .top-link a{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-upload-warmgrey.png")}@media only screen and (max-width: 768px){footer.no-global .legal{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;box-shadow:0 2px 2px -1px #D3D3D3 inset;padding-top:10px;margin-left:-10px;padding-left:10px;padding-right:10px}#livechat-eye-catcher{display:block}}@media only screen and (min-width: 768px){footer.global .inline li{display:inline;float:left}}@media only screen and (min-width: 769px){footer.global .top-link{display:none}footer.global .footer-b h2 a i{font-style:normal;display:inline}}@media only screen and (min-width: 984px){footer.global .legal{width:984px}footer.global{padding:30px 0 20px}footer.global .legal{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-grey.png") 100% 0 no-repeat}footer.global .footer-a{display:block}}#context-footer{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:1em;margin-bottom:0.85714em;border-bottom:0;clear:both;padding-bottom:1px;padding-top:0;position:relative;margin-bottom:0;margin-left:0;margin-right:0;width:100%}#context-footer hr{-moz-box-shadow:inset 0 2px 2px -2px #333;-webkit-box-shadow:inset 0 2px 2px -2px #333;box-shadow:inset 0 2px 2px -2px #333;background:#dd4814;height:14px;margin:0 0 10px;border:0;clear:both}#context-footer div.twelve-col{display:table;float:none;margin-bottom:7px}#context-footer div div{display:block;padding-left:0;margin-bottom:20px}#context-footer div div div{display:block;padding-left:0;margin-bottom:0}#context-footer div div.feature-one{padding-left:0}#context-footer div div.feature-four{margin-bottom:0;margin-right:0}#context-footer>div{padding-left:10px;padding-right:10px}#context-footer ul{margin-bottom:5px}#context-footer li.active{display:none}#context-footer h3{font-size:1.14286em;margin-bottom:0.75em;font-weight:normal}#context-footer .list a:after,#context-footer a.link-arrow:after,#context-footer nav ul li h2 a:after{content:' \203A'}@media only screen and (min-width: 768px){#context-footer{margin-bottom:12px;padding-left:30px;padding-right:30px}#context-footer div+div{width:31%}#context-footer div div.feature-four{padding-bottom:20px}#context-footer hr{margin:0 -30px 40px}#context-footer>div{padding-left:0;padding-right:0}}@media only screen and (min-width: 984px){#context-footer{padding:0 40px 10px}#context-footer div div{display:table-cell;float:none;padding-left:20px;margin-bottom:0}#context-footer hr{margin:0 -40px 40px}}a.link-cta-ubuntu,a.link-cta-canonical,a.link-cta-inverted,button.cta-ubuntu,button.cta-canonical,form button[type="submit"],form input[type="submit"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:1.14286em;margin-bottom:0.75em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background:#dd4814;color:#fff;text-decoration:none;display:inline-block;margin:0;font-family:Ubuntu, Arial, 'libra sans', sans-serif;font-weight:300;-webkit-font-smoothing:subpixel-antialiased;-moz-font-smoothing:subpixel-antialiased;-o-font-smoothing:subpixel-antialiased;font-smoothing:subpixel-antialiased;padding:8px 14px;width:100%;text-align:center}a.cta-large,button.cta-large{font-size:1.28571em;margin-bottom:0.66667em;padding:10px 20px}a.link-cta-canonical,button.cta-canonical,form button.cta-canonical[type="submit"],form input.cta-canonical[type="submit"]{background:#772953;color:#fff}a.link-cta-inverted,button.cta-inverted{background:#fff;color:#333333}.row-enterprise a.link-cta-canonical,.row-enterprise button.link-cta-canonical{background:#fff;color:#772953}a.link-cta-ubuntu:hover,a.link-cta-ubuntu:hover,button.cta-ubuntu:hover,form button[type="submit"]:hover,form input[type="submit"]:hover{background:#c03f11;text-decoration:none}a.link-cta-canonical:hover,button.cta-canonical:hover{background:#5f2143;text-decoration:none}a.link-cta-inverted:hover,.row-enterprise a.link-cta-canonical:hover,button.cta-inverted:hover,.row-enterprise button.cta-canonical:hover{background:#fff;text-decoration:underline}a.cta-deactivated,a.cta-deactivated:hover,button.cta-deactivated,button.cta-deactivated:hover{background:#efefef;color:#fff;cursor:not-allowed}@media only screen and (min-width: 768px){a.link-cta-ubuntu,a.link-cta-canonical,a.link-cta-inverted,button.cta-ubuntu,button.cta-canonical,form button[type="submit"],form input[type="submit"]{width:auto}}@media only screen and (min-width: 984px){a.link-cta-ubuntu,a.link-cta-canonical,a.link-cta-inverted,button.cta-ubuntu,button.cta-canonical,form button[type="submit"],form input[type="submit"]{width:auto}}form input,form select,form textarea{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%}form .fieldset-submit ul{margin-bottom:0}form fieldset .mktError,form fieldset .errMsg,form fieldset .reqMark{color:#df382c}form fieldset .mktFormMsg{clear:both;display:block}.row{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-bottom:1px dotted #888888;clear:both;padding:20px 10px 0;position:relative}.row br{display:none}.row.no-padding-bottom{padding-bottom:0 !important}.row-grey{background:#f7f7f7}.no-border{border:0}#main-content .row-hero{margin-top:20px;padding-top:0}.row-background{color:#fff;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/backgrounds/image-background-wallpaper.jpg") no-repeat scroll 50% 50% #4b1827}.row-background a.alternate{color:#fff;text-decoration:underline}.row-background a.alternate:hover{color:rgba(255,255,255,0.6)}@media only screen and (min-width: 768px){.row-background{background-position:center 50%;background-size:100% auto}}.strip{width:100%;display:block}.strip-dark{background-color:#2c001e;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/backgrounds/background-grid.png");background-repeat:repeat;color:#fff}.strip-dark .list-ubuntu li{border:0}.strip-dark .resource{color:#333;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.strip-dark .resource:before{border-right-color:#2c001e}#main-content .strip-dark .resource:before{border-bottom-width:29px;right:-2px;top:-1px}#main-content .strip-dark .resource:hover:before{border-bottom-width:34px}#main-content .strip-dark .resource h2{padding-right:20px}.row-aux{background-color:rgba(255,255,255,0.6);text-align:center}.row-aux h2,.row-aux p{text-align:left}.row-aux a p{color:#333;margin-bottom:30px}.row-step h2{position:relative;top:5px}.row-step .step{position:relative;top:-5px;height:32px;width:32px;border-radius:50%;border:3px solid #dd4814;color:#dd4814;line-height:32px;text-align:center;background-color:#fff;font-size:23px;font-weight:400}@media only screen and (min-width: 768px){.row{padding:30px}#main-content .row-hero{margin-top:40px}}@media only screen and (min-width: 769px){.row-step .step{height:42px;width:42px;line-height:42px}.row br{display:block}}@media only screen and (min-width: 984px){.row br{display:block}.row{padding:60px 40px 40px}.no-border{border:0}}.box,.box-grey{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:1.333em 20px}.box{background:#fff;border:1px solid #dfdcd9}.box-grey{background:#f7f7f7;color:#333333}.box-orange{background:#dd4814;color:#fff}.box-highlight{-moz-box-shadow:0 2px 2px 0 #c2c2c2;-webkit-box-shadow:0 2px 2px 0 #c2c2c2;box-shadow:0 2px 2px 0 #c2c2c2;border:1px solid #f7f7f7}.box-textured{-moz-box-shadow:0 2px 2px 0 #c2c2c2;-webkit-box-shadow:0 2px 2px 0 #c2c2c2;box-shadow:0 2px 2px 0 #c2c2c2;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/grey-textured-background.jpg");border:0}.box-padded{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#efefef;border:0;margin-bottom:20px;padding:6px 5px}.box-padded h3{font-size:1.39286em;margin-bottom:0.61538em;margin-left:5px;margin-top:5px}.box-padded li h3{font-size:1.39286em;margin-bottom:0.61538em;margin:0}.box-padded div{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff;overflow:hidden;padding:8px 8px 2px}.box-padded-feature{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/soft-centre-bkg.gif") repeat scroll 0 0 #a09f9f;border:0;margin-bottom:20px;padding:11px 5px 6px}.box-padded-feature h3{color:#fff;margin-left:5px;font-size:1.39286em;margin-bottom:0.61538em}.box-padded-feature h4{font-size:1.14286em;margin-bottom:0.75em;font-weight:normal}.box-padded-feature>div{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff;overflow:hidden;padding:20px 8px}.box-padded-feature div div{margin-bottom:0}.box-padded-feature .inline-icons{display:table;width:100%;margin:0;text-align:center}.box-padded-feature .inline-icons li{display:table-cell;text-align:left;float:none}.box-padded-feature .one-col{width:48px;float:left}.resource{cursor:pointer;padding-bottom:40px;position:relative;-moz-transition:background 0.2s ease-out;-webkit-transition:background 0.2s ease-out;transition:background 0.2s ease-out}.resource h2{padding-right:20px}.resource.five-col h2 a:link,.resource.five-col h2 a:visited,.resource.four-col h2 a:link,.resource.four-col h2 a:visited{font-size:inherit !important}.resource.four-col h2 a:link,.resource.four-col h2 a:visited{font-size:1.125em}.resource.twelve-col h2 a:link,.resource.twelve-col h2 a:visited{font-size:1.40625em}.resource:hover{background-color:#fafafa}.resource:after{-moz-box-shadow:0 -1px 2px 0 #ddd;-webkit-box-shadow:0 -1px 2px 0 #ddd;box-shadow:0 -1px 2px 0 #ddd;content:'';height:1px;position:absolute;right:-6px;top:14px;-ms-transform:rotate(45deg);-webkit-transform:rotate(45deg);transform:rotate(45deg);-moz-transition:all 0.2s ease-out;-webkit-transition:all 0.2s ease-out;transition:all 0.2s ease-out;width:41px;z-index:2}.resource:hover:after{right:-9px;top:18px;width:48px}.resource:before{content:'';position:absolute;-moz-transition:border-width 0.2s ease-out;-webkit-transition:border-width 0.2s ease-out;transition:border-width 0.2s ease-out;top:-2px;right:-3px;width:0;height:0;border-bottom:30px solid #fdfdfd;border-right:30px solid #fff;-webkit-box-shadow:-2px 2px 2px rgba(176,176,176,0.4);-moz-box-shadow:-2px 2px 2px rgba(176,176,176,0.4);box-shadow:-2px 2px 2px rgba(176,176,176,0.4);z-index:2;-webkit-border-radius:0 0 0 0;-moz-border-radius:0 0 0 0;border-radius:0 0 0 0}.resource:hover:before{border-bottom-width:35px;border-right-width:35px}.resource:last-of-type{margin-bottom:30px}.resource .content-cat{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-resource-hub-icon-document.png") left center no-repeat;color:#aea79f;font-size:14px;letter-spacing:1px;margin:0;padding-left:20px;padding:0;position:absolute;text-transform:uppercase}.resource .content-cat-webinar{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-resource-hub-webinar.png") left center no-repeat}.resource.box-image-centered div+span img{margin-top:40px}html.yui3-js-enabled .resource:hover a{text-decoration:underline}.row-grey .resource:before{border-right-color:#f7f7f7}@media only screen and (max-width: 768px){.box-padded-feature .inline-icons li{float:left;display:block}.box-padded-feature .one-col{width:48px;float:left}}.arrow-up,.arrow-down,.arrow-right,.arrow-left{height:11px;position:absolute;width:18px}.arrow-up{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-up.png") 0 0 no-repeat;left:20px;top:-11px}.arrow-down{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-down.png") 0 0 no-repeat;bottom:-11px;right:20px}.arrow-right{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-right.png") 0 0 no-repeat;height:18px;right:-11px;top:20px;width:11px}.arrow-left{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-left.png") 0 0 no-repeat;bottom:20px;height:18px;left:-11px;width:11px}div>.arrow-left{left:-10px}@media only screen and (min-width: 769px){html.yui3-js-enabled .arrow{visibility:visible}}.list,.list-ubuntu,.list-canonical{list-style:none;margin-left:0}.list li,.list-ubuntu li,.list-canonical li{border-bottom:1px dotted #888888;margin-bottom:0;padding:10px 0}.list li:last-of-type,.list li.last-item,.list-ubuntu li:last-of-type,.list-ubuntu li.last-item,.list-canonical li:last-of-type,.list-canonical li.last-item{border:0;padding-bottom:0}.list article{border-bottom:1px dotted #888888;margin-bottom:0;padding:10px 0}.list-spaced article,.list-spaced li{padding:30px 0}nav .list a{display:block}.list-ubuntu li,.list-canonical li{background-repeat:no-repeat;background-position:0 1em;padding-left:25px}.list-ubuntu li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-orange.svg")}.list-canonical li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-midaubergine.svg")}.list-warm li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-warmgrey.svg")}.list-dark li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-darkaubergine.svg")}.vertical-divider .list-canonical li,.vertical-divider .list-ubuntu li{padding-left:25px}html.no-svg .list-ubuntu li,.opera-mini .list-ubuntu li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-orange.png")}html.no-svg .list-canonical li,.opera-mini .list-canonical li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-midaubergine.png")}html.no-svg .list-warm li,.opera-mini .list-warm li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-warmgrey.png")}html.no-svg .list-dark li,.opera-mini .list-dark li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-darkaubergine.png")}.no-bullets{list-style:none;margin-left:0}.row .combined-list ul,.row .combined-list div{margin-bottom:0}.row .combined-list li.last-item{border-bottom:1px dotted #888888;padding-bottom:10px}.row .combined-list div.last-col,.row .combined-list ul.last-col{margin-bottom:20px}.row .combined-list div.last-col li.last-item,.row .combined-list ul.last-col li.last-item{border-bottom:0;padding-bottom:0}.inline{margin-left:0}.inline li{display:inline;list-style:none;margin-left:0;float:left}@media only screen and (min-width: 768px){.row .combined-list ul,.row .combined-list div{margin-bottom:20px}.row .combined-list li.last-item{border-bottom:0;padding-bottom:0}}ul.inline-logos{float:left;margin-left:0;padding:0;text-align:center;width:100%}ul.inline-logos li{clear:none;display:inline-block;float:none;margin:10px 20px;padding:0}ul.inline-logos li.clear-row{clear:left}ul.inline-logos li.last-item{border:0}ul.inline-logos img{-webkit-transition:all 0.5s ease-out;-moz-transition:all 0.5s ease-out;-ms-transition:all 0.5s ease-out;-o-transition:all 0.5s ease-out;transition:all 0.5s ease-out;vertical-align:middle;max-width:115px;max-height:32px}.inline-icons{margin:0 0 20px}.inline-icons li{margin-right:20px;margin-bottom:20px;text-align:left;display:inline-block}.inline-icons li.last-item{margin-right:0}.inline-icons.no-margin-bottom li{margin-bottom:0}.inline-icons img{vertical-align:middle;max-width:115px;max-height:32px}@media only screen and (max-width: 768px){ul.inline-logos img{max-width:172px;max-height:48px}}@media only screen and (min-width: 769px){ul.inline-logos li{clear:none;display:inline-block;height:auto;margin:20px 0;line-height:60px;padding:0 40px}ul.inline-logos li img{float:none;vertical-align:middle;max-width:200px;max-height:45px}}@media only screen and (min-width: 984px){.inline-icons{text-align:left;margin-bottom:20px}}blockquote.pull-quote{text-indent:0}blockquote.pull-quote p{color:#333333;padding-left:10px;padding-right:10px;font-size:1.77379em;margin-bottom:0.48323em;text-indent:-.4em;margin-left:.4em;line-height:1.3}blockquote.pull-quote p span{font-weight:bold;color:#dd4814;line-height:0;position:relative;left:-5px}blockquote.pull-quote p span+span{left:5px}blockquote.pull-quote p cite{margin:10px 0 0;font-weight:300;display:block;font-size:.75em;text-indent:0}blockquote.pull-quote.js{padding-left:60px;display:table-cell}blockquote.quote-canonical,blockquote.quote-canonical-white{font-size:1.14286em;margin-bottom:0.75em;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-white-360x360.png") no-repeat 20px -130px;color:#772953;float:right;font-size:1em;height:215px;margin-top:0;padding:20px 60px 0;position:relative;width:236px}blockquote.quote-canonical-white{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-aubergine-345x345.png") no-repeat 0 0;color:#fff;padding:80px 60px 0;height:265px}blockquote.quote p:first-child{font-size:1.28571em;margin-bottom:0.66667em;line-height:1.3;text-indent:-7px}blockquote.quote-right-bottom{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-quote-orange.svg");background-repeat:no-repeat;background-size:287px 286px;color:#fff;height:167px;padding:60px 40px;position:static;right:-40px;top:-90px;width:207px}blockquote.quote-right-bottom p{color:#fff}blockquote.quote-grey{font-size:2.57143em;margin-bottom:0.33333em;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-grey-br-211x211.png") no-repeat scroll 0 0 transparent;color:#fff;height:152px;line-height:40px;margin-left:20px;padding:60px 0 0;text-align:center;width:211px}blockquote.quote-bottom-left{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-orange-bl-287x287.png") no-repeat;color:#fff;height:167px;padding:55px 40px 70px 45px;width:225px}html.no-svg blockquote.quote-right-bottom,.opera-mini blockquote.quote-right-bottom{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-quote-orange.png")}.row-quote{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.row-quote blockquote{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;margin:0;padding:0}.row-quote blockquote p{margin-bottom:.75em;line-height:1.3;color:#333333;padding-left:10px;padding-right:10px;text-indent:0}.row-quote blockquote span{font-weight:bold;color:#dd4814;line-height:0;position:relative;left:-5px}.row-quote blockquote span+span{left:5px}.row-quote blockquote cite{color:#333333;font-style:normal;margin-bottom:0;font-size:.75em;text-indent:-14px;text-indent:0}.row-quote .quote-twitter{background:#fcece7 url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/pictogram-twitter-115x139.png") 20px bottom no-repeat;padding:20px 20px 20px 23.40425%}.row-quote .quote-twitter-small{background:#fcece7 url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/pictogram-twitter-54x63.png") 99% bottom no-repeat;padding:20px 20px 20px 80px}.row-quote .quote-twitter-small p{margin:0;padding:0}blockquote.quote-canonical,blockquote.quote-canonical-white{background:none;color:#333333;width:auto;height:auto;padding:0 30px;margin-top:20px}@media only screen and (min-width: 768px){.row-quote blockquote{text-indent:-7px}.pull-quote{text-indent:-.4em}.row-quote blockquote p{font-size:1.77357em;margin-bottom:0.48329em}blockquote.pull-quote p,.row-quote blockquote p{padding-left:0;padding-right:0;text-indent:-.7em}blockquote.pull-quote p span,.row-quote blockquote p span{font-size:1.391304348em}blockquote.pull-quote p cite,.row-quote blockquote p cite{margin-left:0;text-indent:0}blockquote.pull-quote p span,.row-quote blockquote p span{top:5px}}@media only screen and (min-width: 769px){.row-quote blockquote p{font-size:1.77357em;margin-bottom:0.48329em;text-indent:-.4em}}@media only screen and (min-width: 984px){.row-quote blockquote{padding:0 80px 20px;text-indent:-10px}blockquote.pull-quote p span,.row-quote blockquote p span{top:10px}}html.js .tabbed-content .accordion-button{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;height:auto;padding-bottom:.6em;padding-right:20px}html.yui3-js-enabled .tabbed-menu{display:none;padding-bottom:20px;padding-top:20px}html.yui3-js-enabled .arrow{display:none;position:absolute;visibility:hidden}html.yui3-js-enabled .tabbed-content{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:8px 8px 0;background:#f7f7f7;margin-bottom:8px}html.yui3-js-enabled .tabbed-content.hide{display:block;opacity:1 !important}html.yui3-js-enabled .tabbed-content .title{display:none}html.yui3-js-enabled .tabbed-content div{display:none}html.yui3-js-enabled .tabbed-content .accordion-button{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-down.svg") no-repeat scroll right 3px #f7f7f7;color:#333333;display:block;font-size:16px;padding-bottom:.6em;padding-right:20px;width:100%}html.yui3-js-enabled .tabbed-content.open .accordion-button{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-up.svg");margin-bottom:10px}html.yui3-js-enabled .tabbed-content.open div{display:block}html.yui3-js-enabled html.yui3-js-enabled.opera-mini .tabbed-content .accordion-button,html.yui3-js-enabled html.yui3-js-enabled.no-svg .tabbed-content .accordion-button{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-right.png")}html.yui3-js-enabled html.yui3-js-enabled.opera-mini .tabbed-content.open .accordion-button,html.yui3-js-enabled html.yui3-js-enabled.no-svg .tabbed-content.open .accordion-button{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-up.png")}html.yui3-js-enabled html.yui3-js-enabled.opera-mini.tabbed-content .accordion-button{background-image:none;margin-bottom:10px}html.yui3-js-enabled html.yui3-js-enabled.opera-mini.tabbed-content div{display:block}@media only screen and (min-width: 768px){html.yui3-js-enabled .tabbed-menu{display:block}html.yui3-js-enabled .tabbed-content{margin-bottom:20px;padding:40px}html.yui3-js-enabled .tabbed-content.hide{display:none;opacity:0 !important}html.yui3-js-enabled .tabbed-content .title{display:block}html.yui3-js-enabled .tabbed-content div{display:block}html.yui3-js-enabled .tabbed-content .vertical-divider div{display:table-cell}html.yui3-js-enabled .tabbed-content .accordion-button{display:none}}html.yui3-js-enabled .accordion-button.active{background-color:transparent}@media only screen and (min-width: 768px){.tabbed-menu{-moz-box-shadow:0 -1px 10px #cfcfcf inset;-webkit-box-shadow:0 -1px 10px #cfcfcf inset;box-shadow:0 -1px 10px #cfcfcf inset;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;background:none repeat scroll 0 0 #f7f7f7;padding-bottom:20px;padding-top:20px;position:relative}.tabbed-menu ul{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:table;margin-bottom:0;padding:0;position:relative;table-layout:fixed;width:100%}.tabbed-menu li{text-align:center;display:table-cell}.tabbed-menu a{color:#666;display:block;outline:none}.tabbed-menu a .active{color:#772953;text-decoration:none}.tabbed-menu a:hover{text-decoration:none}.tabbed-menu .arrow{bottom:0;position:absolute}.tabbed-content{*zoom:1;padding:20px 40px 0}.tabbed-content:before,.tabbed-content:after{content:"";display:table}.tabbed-content:after{clear:both}.tabbed-content .row{padding-left:0;padding-right:0}.tabbed-content .main-content{padding-bottom:40px}html.yui3-js-enabled .tabbed-content.hide{display:none;opacity:0}.tabbed-content-bg{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;margin-left:20px;margin-right:20px}.tabbed-content-bg .row-box{padding-left:0;padding-right:0}html.yui3-js-enabled .arrow{visibility:visible}}.row.vertical-divider{padding-bottom:40px}.vertical-divider div,.vertical-divider li{border-right:0;display:block;padding-left:0;padding-right:0}.vertical-divider-full{padding-bottom:0}.vertical-divider-full>div{padding-bottom:40px}.row.vertical-divider-full{padding-bottom:0}@media only screen and (max-width: 767px){.vertical-divider>div,.vertical-divider>li{border-bottom:1px dotted #888888;padding-bottom:20px}.vertical-divider div:last-of-type,.vertical-divider li:last-of-type,.inline-icons li:last-of-type{border-bottom:0;padding-bottom:5px}.row.vertical-divider{padding-bottom:0}.equal-height div,.equal-height li{height:auto !important}}@media only screen and (min-width: 984px){.row.vertical-divider{padding-bottom:60px}.vertical-divider>div,.vertical-divider>li{border-right:1px dotted #888888;display:table-cell;float:none;margin-right:0;padding-left:20px;padding-right:20px;vertical-align:top}.vertical-divider>div:last-child,.vertical-divider>li:last-child,.vertical-divider>div.last-col,.vertical-divider>li.last-col,.vertical-divider>div:last-of-type,.vertical-divider>li:last-of-type{border-right:0;padding-right:0}.vertical-divider>div:first-child,.vertical-divider>li:first-child,.vertical-divider>div.first-col,.vertical-divider>li.first-col,.vertical-divider>div:first-of-type,.vertical-divider>li:first-of-type{padding-left:0}}.slider{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#f7f7f7;padding-top:40px}.slider .slide-window{overflow:hidden;position:relative;height:450px;-moz-transition:left 1s;-webkit-transition:left 1s;-o-transition:left 1s;transition:left 1s}.slider .slide-container{position:absolute;width:2800 px;-moz-transition:left 1s;-webkit-transition:left 1s;-o-transition:left 1s;transition:left 1s;left:0}.slider .slider-dots ul{position:absolute;top:550px;left:220px;z-index:5}.slider .slider-dots li{background-position:0 -8px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/sprite-pager.png") no-repeat;float:left;height:7px;list-style-type:none;margin-right:.75em;text-indent:-9999em;width:7px}.slider .slider-dots li.active{background-position:0 0}.slider .slider-dots a{display:block;outline:0}.slider .slide{float:right;width:700px}.slider .slide h3{margin-top:65px;display:inline-block}.slider .slide p{width:350px}.slider .arrow-prev,.slider .arrow-next{font-size:5em;margin-top:150px;display:block;color:#888888;outline:0}.slider .arrow-prev:hover,.slider .arrow-next:hover{text-decoration:none;color:#333333}.slider .arrow-prev:active,.slider .arrow-next:active{padding-top:1px;text-decoration:none}.slider .arrow-prev:focus,.slider .arrow-next:focus{text-decoration:none}.yui3-tooltip-hidden{display:none}.yui3-tooltip-content{-moz-box-shadow:0 2px 8px rgba(0,0,0,0.2);-webkit-box-shadow:0 2px 8px rgba(0,0,0,0.2);box-shadow:0 2px 8px rgba(0,0,0,0.2);background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/grey-textured-background.jpg") repeat scroll 0 0 transparent;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #e3e3e3;color:#333333;margin-top:-30px;max-width:520px;position:relative}.yui3-tooltip .yui3-widget-bd{padding:20px;width:320px}.yui3-tooltip .yui3-widget-bd *{max-width:100%}.yui3-tooltip .yui3-widget-bd h5{margin-bottom:10px;font-size:22px;font-weight:300}.yui3-tooltip .yui3-widget-bd img{float:left;margin-right:10px}.yui3-tooltip .yui3-widget-bd q{border-bottom:1px dotted #888888;border-top:1px dotted #888888;display:block;font-size:16px;font-style:italic;margin-bottom:0;margin-top:20px;padding:10px 0}.yui3-tooltip .yui3-widget-bd p:last-child{margin-bottom:0}.yui3-tooltip .yui3-widget-ft,.yui3-tooltip .yui3-widget-ft div{position:absolute;width:0;height:0;border-style:solid;line-height:0;font-size:0}.yui3-tooltip .yui3-tooltip-align-bottom .yui3-widget-ft,.yui3-tooltip .yui3-tooltip-align-bottom .yui3-widget-ft div{top:-10px;left:50%;margin:0 0 0 -10px;border-width:0 10px 10px;border-color:#efefef transparent}.yui3-tooltip .yui3-tooltip-align-bottom .yui3-widget-ft div{top:0;border-color:#efefef transparent}.tooltip-label{-moz-box-shadow:3px 3px 6px rgba(0,0,0,0.3);-webkit-box-shadow:3px 3px 6px rgba(0,0,0,0.3);box-shadow:3px 3px 6px rgba(0,0,0,0.3);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff;border:1px solid #dfdcd9;display:none;font-size:13px;line-height:1;margin:0;padding:6px 5px;position:absolute;top:-20px;white-space:nowrap;z-index:1000}body,a:link,a:visited{-webkit-font-smoothing:antialiased}code,pre,p{line-height:1.5}body{font-size:16px}@media only screen and (min-width: 768px){code,pre,p{line-height:1.6}body{font-size:16px}}@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi){body{font-size:18px}}.not-for-medium{display:none}@media only screen and (min-width: 985px){.not-for-medium{display:block}}header.banner{background:#000000;-moz-box-shadow:inset 0 2px 2px -2px #000;-webkit-box-shadow:inset 0 2px 2px -2px #000;box-shadow:inset 0 2px 2px -2px #000;margin-bottom:0}header.banner .nav-primary{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;*zoom:1}header.banner .nav-primary:before,header.banner .nav-primary:after{content:"";display:table}header.banner .nav-primary:after{clear:both}header.banner nav.nav-primary{border-bottom:1px solid #262626;overflow:visible}header.banner nav.nav-primary .user-nav{float:right;margin-right:20px}header.banner nav.nav-primary .user-dropdown:hover ul:after{display:none}header.banner nav.nav-primary .user-dropdown .menu-link img{margin-right:10px}header.banner nav.nav-primary .user-dropdown .menu-link img.hover{display:none}header.banner nav.nav-primary .user-dropdown .menu-link img.normal{display:inline-block}header.banner nav.nav-primary .user-dropdown .open .menu-link img.hover,header.banner nav.nav-primary .user-dropdown .menu-link:hover img.hover{display:inline-block}header.banner nav.nav-primary .user-dropdown .open .menu-link img.normal,header.banner nav.nav-primary .user-dropdown .menu-link:hover img.normal{display:none}header.banner nav.nav-primary .user-dropdown ul{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;margin-top:-2px;background-color:#fff;border-width:0}header.banner nav.nav-primary .user-dropdown ul a:hover{background-color:transparent}header.banner nav.nav-primary #user-dropdown .dropdown ul{width:auto}header.banner .nav-primary.nav-right .logo-ubuntu{-moz-background-size:73px 30px;-webkit-background-size:73px 30px;-o-background-size:73px 30px;background-size:73px 30px;background-image:url(../img/logos/logo.svg);background-position:20px;background-repeat:no-repeat;min-width:120px;padding-top:6px;margin-left:0}body.no-svg header.banner .nav-primary.nav-right .logo-ubuntu{background-image:url(../img/logos/logo.png)}input[type=text]::-ms-reveal,input[type=text]::-ms-clear{display:none;width:0;height:0}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-results-button,input[type="search"]::-webkit-search-results-decoration{display:none}.contextual-bar{overflow:hidden;background-color:#ffffff;border-bottom:1px solid #d4d4d4}form.search-form{overflow:hidden;float:right;width:100%;position:relative}form.search-form input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:0;border-left:0;margin:0;width:100%;height:50px;float:left;font-size:1em;padding-top:0;padding-bottom:0;padding-right:30px;background-color:transparent;-webkit-appearance:none}form.search-form input:focus{border-color:#dd4814}form.search-form button[type=submit],form.search-form button[type=submit]:hover{position:absolute;top:10px;right:10px;display:block;height:30px;width:30px;padding:0;line-height:0;-webkit-appearance:none;background:transparent}form.search-form button img{height:16px}.contextual-nav{border:0;display:block;margin:0;padding-left:10px;background-color:transparent;overflow:hidden;float:left}.contextual-nav li,.contextual-nav li:last-child{font-size:0.875em;float:left;list-style-type:none;margin:0;margin-left:5px}.contextual-nav li a:link,.contextual-nav li a:visited,.contextual-nav .contextual-nav__label{display:block;color:#333333;font-weight:300;text-align:center;padding:16px 10px 10px 10px;border-bottom:3px solid transparent}.contextual-nav .contextual-nav__label{color:#cdcdcd}.contextual-nav li a:hover{border-bottom-color:#dd4814;text-decoration:none;color:#dd4814}.contextual-nav li a.active{border-bottom:3px solid #dd4814}.opera-mini header.banner .logo-ubuntu,.no-svg header.banner .logo-ubuntu{background-image:url(../img/logos/logo.png)}@media only screen and (min-width: 769px){header.banner .nav-primary ul li,header.banner .nav-primary ul li:last-child{border-bottom:0;width:auto}header.banner nav.nav-primary li a:link,header.banner nav.nav-primary li a:visited{border-left:1px solid #262626;font-weight:400}header.banner nav.nav-primary ul li a.active{padding-bottom:10px;background-color:#0e0c0b;border-bottom:3px solid #dd4814;border-left:1px solid #262626}header.banner nav.nav-primary ul li{border-left:1px solid #262626}header.banner nav.nav-primary ul li a:hover{background-color:#dd4814}header.banner nav.nav-primary ul{background-color:transparent;border-right:1px solid #262626;display:block}header.banner nav.nav-primary ul li:last-child{border-left:1px solid #262626;border-right:0}header.banner .nav-primary ul li a:active,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:visited,header.banner nav.nav-primary ul li a:link{border-left:0}header.banner .nav-primary ul li a.external:hover{background-image:url("../img/icons/external-link-grey.png")}form.search-form{width:325px}form.search-form input{border-left:1px solid #d4d4d4;margin:0 20px;width:250px;font-size:0.875em}}@media only screen and (min-width: 1030px){header.banner{height:48px;overflow:hidden}header.banner .nav-primary{width:100%}}body{background-repeat:repeat}.row{border:0;background-color:rgba(255,255,255,0.6)}@media only screen and (min-width: 769px){.append-one{margin-right:10.6%}.row{padding:50px 40px 30px}}.inner-wrapper{*zoom:1;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background-color:transparent;background-image:none;margin:0 auto;padding-bottom:0;float:none}.inner-wrapper:before,.inner-wrapper:after{content:"";display:table}.inner-wrapper:after{clear:both}.wrapper{position:static;background:transparent;width:100%;overflow:hidden}img.touch-border{margin-bottom:-50px}.inner-wrapper,footer.global .legal{max-width:1030px;width:auto;padding-left:0;padding-right:0}.touch-top{margin-top:-50px}@media only screen and (max-width: 1030px){.inner-wrapper,footer.global .legal{padding-left:8px;padding-right:8px;width:auto}}.footer-cta{background:#fff;padding-bottom:20px}.footer-wrapper.strip-light{background-color:#fff}.solutions-cta{height:60px;background-color:#dd4814;line-height:60px;text-align:center}.solutions-cta a{color:#fff;font-size:1.25em}footer.global{background-color:white;box-shadow:none;padding-top:0}footer.global .row{padding:10px 0 0}footer.global .two-col{width:46%;float:left;display:inline-block;min-height:200px}footer.global h2{padding-bottom:0;color:#888888;font-size:16px}footer.global nav .canonlist ul li,footer.global nav .additional-info ul li{min-height:0;width:48%;float:left}footer.global ul.bullets li:after{line-height:1;color:#888888;content:"•";vertical-align:middle;margin:0 5px}footer.global ul.inline li:last-child{width:auto}footer.global a.external{background-image:url("../img/icons/external-link-dark.png")}footer.global .top-link{margin-bottom:10px}footer.global a{color:#333333}footer.global a:hover{color:#dd4814}footer.global .legal{background-image:none}footer.global .legal.has-cookie{padding-bottom:70px}footer.global .inner-wrapper{overflow:visible}footer.global a.link-cta-positive,footer.global a.link-cta-negative{width:auto;margin-top:10px;padding-left:20px;padding-right:20px;color:#fff;font-size:14px}footer.global .section__title{background:none;cursor:default}.legal-inner{clear:both;overflow:hidden;float:left;width:100%;padding:20px 10px 0;margin:-3px -10px 0}.social,.social--right{margin-left:0}.social .social__item,.social--right .social__item{display:inline;float:left;padding-right:1em}.social .social__google,.social .social__facebook,.social .social__twitter,.social--right .social__google,.social--right .social__facebook,.social--right .social__twitter{background-image:url("../img/icons/icon-social.png");display:block;width:45px;height:44px}.social .social__google.social__twitter:hover,.social .social__facebook.social__twitter:hover,.social .social__twitter.social__twitter:hover,.social--right .social__google.social__twitter:hover,.social--right .social__facebook.social__twitter:hover,.social--right .social__twitter.social__twitter:hover{background-position:0 -45px}.social .social__google.social__facebook,.social .social__facebook.social__facebook,.social .social__twitter.social__facebook,.social--right .social__google.social__facebook,.social--right .social__facebook.social__facebook,.social--right .social__twitter.social__facebook{background-position:90px 0}.social .social__google.social__facebook:hover,.social .social__facebook.social__facebook:hover,.social .social__twitter.social__facebook:hover,.social--right .social__google.social__facebook:hover,.social--right .social__facebook.social__facebook:hover,.social--right .social__twitter.social__facebook:hover{background-position:90px -45px}.social .social__google.social__google,.social .social__facebook.social__google,.social .social__twitter.social__google,.social--right .social__google.social__google,.social--right .social__facebook.social__google,.social--right .social__twitter.social__google{background-position:135px 0}.social .social__google.social__google:hover,.social .social__facebook.social__google:hover,.social .social__twitter.social__google:hover,.social--right .social__google.social__google:hover,.social--right .social__facebook.social__google:hover,.social--right .social__twitter.social__google:hover{background-position:135px -45px}@media only screen and (min-width: 768px){.social--right{float:right}}#additional-info{border-bottom:0}#additional-info h2:before{background-image:url("../img/icons/external-link-grey.svg"),none;background-repeat:no-repeat;background-size:14px 14px;content:"";display:inline-block;height:15px;margin-right:3px;position:relative;top:3px;width:15px}#additional-info div li{border-left:1px solid #d4d7d4;box-sizing:border-box;display:block;float:left;margin:0;padding:0;width:50%}#additional-info div li a{border-bottom:1px solid #d4d7d4;box-sizing:border-box;color:#333333;display:block;float:left;margin:0;overflow:hidden;padding:8px 10px;text-align:left;white-space:normal;width:100%}#additional-info .section__title{border-bottom:1px solid #d4d7d4;background-position:100% 0.1em}html.opera-mini footer #nav-global h2:before,html.opera-mini footer #additional-info h2:before,html.no-svg footer #nav-global h2:before,html.no-svg footer #additional-info h2:before{background-image:url("../img/icons/external-link-grey.png")}@media only screen and (min-width: 769px){.footer-wrapper.strip-light{white-space:nowrap}footer.global{padding-top:40px;padding-bottom:40px}footer.global .two-col{width:14.89361%;display:inline-block;min-height:0}footer.global .section{min-height:160px;margin-right:40px;padding-bottom:0;border-right:1px dotted #aaa;border-bottom:0}footer.global .section:last-child{margin-right:0;border-right:0}footer.global li{display:inline;float:left}footer.global ul.no-bullets li{border-right:1px dotted #aaa;padding-right:15px;padding-left:15px}footer.global ul.no-bullets li a{font-size:16px}footer.global ul.no-bullets li a:hover{color:#dd4814}footer.global ul.no-bullets li:last-child{border-right:none}footer.global ul.no-bullets li:first-child{padding-left:0px}#additional-info .section__title{border-bottom:0}#additional-info div li,#additional-info div a:link{width:100%;border:0}}.actions .actions__social-item--twitter,.actions .actions__social-item--google-plus{text-indent:-99999px;background-image:url("../img/icons/icon-social.svg");background-repeat:no-repeat;height:44px;width:44px;overflow:hidden;display:block}.actions .actions__social-item--twitter{background-position:0 0}.actions .actions__social-item--twitter:hover{background-position:0 -45px}.actions .actions__social-item--google-plus{background-position:-45px 0}.actions .actions__social-item--google-plus:hover{background-position:-45px -45px}.anchor{display:inline-block;margin-left:3px;opacity:.0;position:relative;top:1px;width:1em;height:1em;background:url("../img/icons/anchor_16.svg") 0 80% no-repeat;background-size:16px;-moz-transition:opacity 0.1s;-webkit-transition:opacity 0.1s;transition:opacity 0.1s}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,dt:hover .anchor,li:hover .anchor{opacity:1}.box{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;display:block;margin-bottom:0;border-top:0;border-left:0;border-right:0;padding-left:0;padding-right:0}.box-dim{background-color:#fafafa}@media only screen and (min-width: 768px){.box{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-moz-box-shadow:0px 1px 1px 0px rgba(0,0,0,0.15);-webkit-box-shadow:0px 1px 1px 0px rgba(0,0,0,0.15);box-shadow:0px 1px 1px 0px rgba(0,0,0,0.15);display:inline-block;margin-bottom:20px;padding-left:20px;padding-right:20px;border:0}}a.indent{-moz-box-shadow:inset 0 1px 2px 0 #333;-webkit-box-shadow:inset 0 1px 2px 0 #333;box-shadow:inset 0 1px 2px 0 #333;background:rgba(0,0,0,0.1);padding:10px 30px;text-weight:normal}a.indent:hover{background:rgba(0,0,0,0.2)}a.link-cta-positive,a.link-cta-negative{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#dd4814;color:#fff;display:inline-block;font-size:1.14286em;font-weight:300;text-decoration:none;margin:0;padding:8px 14px;text-align:center;-moz-transition:background 0.2s;-webkit-transition:background 0.2s;transition:background 0.2s;width:100%}a.link-cta-positive:hover,a.link-cta-negative:hover{background-color:#ae3910}a.link-cta-positive .external,a.link-cta-negative .external{padding-right:1em;background-image:url("../img/icons/external-link-white.svg");background-repeat:no-repeat;background-size:11px;background-position:right top}@media only screen and (min-width: 769px){a.link-cta-positive .external,a.link-cta-negative .external{padding-right:.7em}}a.link-cta-negative{background-color:#b2b2b2}a.link-cta-negative:hover{background-color:#888888}.charms__list{list-style:none;margin-bottom:1em;margin-left:0;border-bottom:1px dotted #d4d4d4}.charms__list .charms__list--config{display:none}.charms__list .charms__list--toggle{display:block}.charms__list .charms__list--toggle.is-open+.charms__list--config{display:block}.charms__list .charms__list--config-name{border-top:0}.charms__list--item{font-size:1em;border-top:1px dotted #d4d4d4;padding:10px 0 0 10px;margin-bottom:10px}.charms__list--item:last-of-type{margin-bottom:10px}.charms__list--icon{margin-right:.4em;width:25px;height:25px}.charms__list--toggle{background:url("../img/shared/icon-arrow-down.svg") no-repeat center center;width:16px;height:100%;float:right;text-indent:-99999px;margin-right:20px}.charms__list--toggle.is-open{background-image:url("../img/shared/icon-arrow-up.svg");background-size:14px}.charms__list--config{padding-left:35px;padding-bottom:20px}.charms__list--config-name{font-size:1em;margin-top:15px;padding-top:15px;font-weight:400;border-top:1px dotted #d4d4d4}.charms__list--config-name:first-of-type{border-top:0}.charms__list--config-type{font-weight:400}.charms__list--config-description,.charms__list--config-setting{margin-left:30px;margin-top:8px}.charms__list--config-setting{font-size:0.875em;color:#888888;font-family:"Ubuntu Mono","Consolas","Monaco","Lucida Console","Courier New",Courier,monospace}body.no-svg .charms__list .charms__list--toggle{background-image:url("../img/shared/icon-arrow-down.png")}body.no-svg .charms__list .charms__list--toggle.is-open{background-image:url("../img/shared/icon-arrow-up.png")}pre{background:transparent;border:1px solid #888888;margin:0 0 1.5em 0}pre:not(:first-child){margin-top:1.5em}code.language-bash .comment{color:#888888}.cookie-policy{-moz-box-shadow:0 -1px 2px rgba(0,0,0,0.2);-webkit-box-shadow:0 -1px 2px rgba(0,0,0,0.2);box-shadow:0 -1px 2px rgba(0,0,0,0.2);background-color:#fae4dc;bottom:0;position:fixed;width:100%;z-index:100}.cookie-policy p{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:13px;margin-bottom:0;margin-left:0;padding:8px 0;width:100%}.cookie-policy .link-cta{background-image:url(../img/icons/close-orange.svg);background-repeat:no-repeat;color:#fff;float:right;font-size:1em;height:15px;margin:12px 0;margin-top:12px;padding:0;text-decoration:none;text-indent:-9999px;width:16px}html.no-svg .cookie-policy .link-cta,html.opera-mini .cookie-policy .link-cta{background-image:url(../img/icons/close-orange.png)}html.opera-mini .cookie-policy{position:relative;top:0}.deploy-command{margin-bottom:10px;position:relative}.deploy-command .deploy-command__field{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px 4px 4px 4px;-moz-border-radius:4px 4px 4px 4px;border-radius:4px 4px 4px 4px;-moz-box-shadow:inset 0 1px 2px 0 rgba(0,0,0,0.12);-webkit-box-shadow:inset 0 1px 2px 0 rgba(0,0,0,0.12);box-shadow:inset 0 1px 2px 0 rgba(0,0,0,0.12);background-image:url("../img/icons/code-snippet_16.svg");background-repeat:no-repeat;background-position:5px center;background-color:#fff;background-size:1.142857143em;width:100%;height:37px;border:1px solid #c1c1c1;padding:.6em;color:#888888;padding-left:2em;font-size:0.875em;white-space:nowrap;overflow:hidden;cursor:text}.deploy-command .command2clipboard__clip{cursor:pointer;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;line-height:1;position:absolute;right:1px;top:1px;background-color:#ffffff;padding:9px 8px 7px;border-left:1px solid #b2b2b2;display:none}.deploy-command .command2clipboard__clip.zeroclipboard-is-hover{background-color:#eeeeee}@media only screen and (min-width: 1030px){.deploy-command .command2clipboard__clip{display:inline-block}}.dropdown-menu{position:relative;display:block}.dropdown-menu.open .menu-link{background-color:#000000}.dropdown-menu.open .dropdown{display:block}.dropdown-menu .menu-link .border-box{display:block;color:#f2f2f4}.dropdown-menu .dropdown{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;display:none;position:absolute;z-index:1000;top:0;left:0;right:0;width:auto;background-color:#ffffff;box-shadow:0 1px 5px rgba(0,0,0,0.2)}.dropdown-menu .dropdown.right{left:auto;right:0;text-align:right}.dropdown-menu .dropdown.narrow{min-width:140px;width:auto}.dropdown-menu .dropdown a,.dropdown-menu .dropdown p,.dropdown-menu .dropdown li{color:#333333}.dropdown-menu .dropdown p{padding:11px 20px}.dropdown-menu .dropdown header,.dropdown-menu .dropdown footer{background-color:#ffffff}.dropdown-menu .dropdown header{padding:11px 20px;color:#f2f2f4;font-size:16px;font-weight:300}.dropdown-menu .dropdown footer{padding:20px}.dropdown-menu .dropdown ul{width:auto;left:0;right:0}.dropdown-menu .dropdown ul li a{width:auto;display:block;padding:15px 20px}.files .files__list{list-style:none;margin-bottom:1em;border-left:1px solid #cbcbcb;margin-left:1em}@media only screen and (min-width: 768px){.files .files__list{margin-left:0}}.files .files__list li{position:relative}.files .files__list li a:link,.files .files__list li a:visited{color:#333;text-decoration:none}.files .files__list li:before{content:'';width:12px;height:1px;background:#d4d4d4;display:inline-block;position:relative;top:-4px;margin-right:5px}.files .files__list li:last-child:after{content:'';width:4px;height:1em;position:absolute;display:block;left:-2px;top:.85em;background:#fff}.files .files__list ul:last-child>li a:after{content:'';width:4px;height:3em;position:absolute;display:block;left:-1.8em;top:-1.45em;background:white;cursor:default}.files .files__list .files__list{margin-left:1.3em}.files .files__list .files__list--item,.files .files__list .files__list--item-folder{font-size:0.875em;margin-bottom:0.75em}.files .files__list .files__list--item-folder{background-position:center right;background-size:12px;cursor:pointer}.files .files__list .files__list--item-folder:after{font-size:14px;display:block;content:"-";position:absolute;left:-7px;top:4px;padding:0 4px;line-height:0.9em;background:#ffffff;border:1px solid #888888}.files .files__list .files__list--item-folder.is-closed+ul{display:none}.files .files__list .files__list--item-folder.is-closed:after{content:"+";padding:0 2px}.files .files__actions--launchpad{background:url("../img/icons/icon-launchpad.svg") no-repeat;padding-left:1.4em}#main-content .row-hero{padding-top:20px;margin-top:0}#main-content .row-hero .intro{font-size:16px}@media only screen and (min-width: 769px){#main-content .row-hero{padding-top:60px}#main-content .row-hero .intro{font-size:1.4375em;margin-bottom:40px}}.how-to div div img{float:left;margin:0 20px 20px 0}header.banner a.external,header.banner a.external:hover{background-image:url("../img/icons/external-link-grey.png")}a.external,a.external:hover,header.banner nav.nav-primary ul li a.external:link,header.banner nav.nav-primary ul li a.external:visited,header.banner nav.nav-primary ul li a.external:hover{background-repeat:no-repeat}a.external,a.external:hover header.banner nav.nav-primary ul li a.external:link,header.banner nav.nav-primary ul li a.external:visited,header.banner nav.nav-primary ul li a.external:hover{background-position:right 14px top 14px;padding-right:35px;background-size:auto}@media only screen and (max-width: 769px){header.banner nav.nav-primary ul li a.external:link,header.banner nav.nav-primary ul li a.external:visited,header.banner nav.nav-primary ul li a.external:hover{background:none}header.banner nav.nav-primary ul li a.external:after{display:inline-block;width:11px;height:11px;margin-left:0.25em;background-image:url("../img/icons/external-link-dark.png");vertical-align:text-top}}.list__icons{margin-left:0;margin-bottom:5px}.list__icons li{list-style:none;float:left;padding:8px 8px 0 0;margin-bottom:0}.list__icons li img{width:24px;height:24px;vertical-align:top}.list__tick{list-style-image:url("../img/icons/tick.png")}.list__middot{margin-left:0;list-style:none}.list__middot li{display:inline}.list__middot li:after{content:"•";color:#888;margin:0 5px 0 8px;vertical-align:middle}.list__middot li.files__actions--last:after{content:""}.combined-list .list li{border-bottom:1px dotted #888;padding:10px 0}@media only screen and (max-width: 767px){.combined-list .last-col .list li:last-of-type{border-bottom:0;padding-bottom:0}}@media only screen and (min-width: 768px){.combined-list .list li:last-of-type{border-bottom:0;padding-bottom:0}}.events-list li{position:relative;padding-bottom:20px}.events-list dd{margin-left:0;background-position:0 center;background-repeat:no-repeat;background-size:20px 20px;padding:6px 20px 6px 24px}.events-list .event-map{display:none}.events-list .event-date{background-image:url("../img/icons/calendar.svg")}.events-list .location{background-image:url("../img/icons/location.svg")}@media only screen and (min-width: 769px){.events-list .event-details-wrapper{padding-left:120px}.events-list .event-map{-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;position:absolute;left:0;top:0;height:100px;width:100px;float:left;margin-right:10px;margin-top:5px;overflow:hidden;display:block}}body.no-svg .events-list .event-date{background-image:url("../img/icons/calendar.png")}body.no-svg .events-list .location{background-image:url("../img/icons/location.png")}.maintainers .maintainer__email{display:block}.ratings ul{margin-left:2px;margin-bottom:0}.ratings ul li{margin-bottom:0}.ratings ul li img{vertical-align:text-top}.ratings ul li:first-of-type{margin-left:0}.revisions__list{list-style:none;margin-left:0}.revisions__list .revisions__list-item{margin-bottom:1em}.revisions__list .revisions__list_meta{color:#888;margin-bottom:.2em}.revisions__list .revisions__list_meta_date{float:right}.section{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;overflow:hidden;padding-bottom:20px;padding-top:20px}.section .section__title{background:url(../img/shared/icon-arrow-up.svg) no-repeat center right;cursor:pointer;margin-bottom:1em}.section.is-closed{height:60px}.section.is-closed .section__title{background-image:url(../img/shared/icon-arrow-down.svg)}.no-svg .row.section .section__title{background:url(../img/shared/icon-arrow-up.png)}.no-svg .row.section.is-closed .section__title{background:url(../img/shared/icon-arrow-down.png)}footer .section{margin-bottom:1em;padding-bottom:1em}footer .section.is-closed{height:auto;padding-bottom:0}footer .section.is-closed ul{display:none}@media only screen and (min-width: 769px){.row .section .section__title{background-image:none;cursor:auto}.row .section.is-closed{height:auto}}.list--concealed .list-item{display:none}.list--concealed .list-item:first-of-type{display:list-item}.list--concealed.list--visible-6 .list-item:nth-child(-n+6){display:list-item}.list--concealed.list--visible-4 .list-item:nth-child(-n+4){display:list-item}.list--concealed.list--visible-2 .list-item:nth-child(-n+2){display:list-item}.list--concealed a.btn__see--less{display:none}.list--concealed a.btn__see--more{display:inline}.list--revealed .list__controls,.list--concealed .list__controls{display:block;margin-top:2em}.list--revealed .list--item{display:list-item}.list--revealed a.btn__see--less{display:inline}.list--revealed a.btn__see--more{display:none}a.btn__see--more,a.btn__see--less{-moz-transition:background 0.2s;-webkit-transition:background 0.2s;transition:background 0.2s;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;color:#333;border-radius:2px;border:1px solid #b2b2b2;background:#fff;padding:0.38462em 1.15385em}a.btn__see--more:hover,a.btn__see--less:hover{background:#eee;text-decoration:none}.strip-dark,.strip-light{clear:both}.strip-dark{background-color:#2c001e;background-image:none;background-repeat:repeat;color:#fff}.strip-dark.solid{background-image:none;background-color:#2c001e}.strip-dark ul,.strip-dark ol{margin:0;padding:0}.strip-dark .icon,.strip-dark ol span{-moz-background-size:40px 40px;-webkit-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;background-image:url(../img/icons/list-icon-background.png);background-repeat:no-repeat;display:block;margin:0 20px 20px 0;padding:24px;float:left;width:16px;height:16px;padding:12px}.strip-light .icon,.strip-dark .icon{position:absolute}.strip-light{background-color:rgba(255,255,255,0.6)}.strip-dark ol,.strip-dark ul{padding:20px 0}.strip-light .icon{display:block;background-image:url(../img/icons/list-icon-background.png);padding:24px;margin:0 auto 48px}.strip-dark .connected-list li,.strip-light .connected-list li{margin-bottom:10px;min-height:52px}.strip-dark .connected-list li p,.strip-light .connected-list li p,.strip-dark .connected-list li h3,.strip-light .connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li p .strip-dark ol.connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li span{float:left;font-size:22px;font-weight:normal;height:26px;margin-left:0;margin-right:20px;padding-top:2px;position:absolute;text-align:center;width:16px}.strip-white{background:#fff}.strip-trans{background:transparent}.strip-green{background-image:linear-gradient(to right, #6fad23 0%, #7cc227 100%);overflow:hidden}.strip-green,.strip-green a{color:#fff}.strip-blue{background-image:linear-gradient(to right, #1076a2 0%, #359fcd 100%);overflow:hidden}.strip-blue,.strip-blue a{color:#fff}.tag-list{list-style:none;margin:0}.tag-list--item{display:inline-block;text-transform:lowercase}.tag-list--item a:link,.tag-list--item a:visited{color:#333}.tag-list--item a:after{content:','}.tag-list--item:last-child a:after{content:''}#twitter-feed,#blog-feed{margin:35px 0}#twitter-feed>ul,#blog-feed>ul{list-style:none;margin-left:0}#twitter-feed>ul li,#blog-feed>ul li{position:relative;margin-bottom:30px}#twitter-feed .user,#blog-feed .user{font-size:0.875em;margin-bottom:0.5em}#twitter-feed .user img,#blog-feed .user img{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;width:24px;height:24px;vertical-align:middle;margin-right:5px}#twitter-feed .user a:link,#twitter-feed .user a:visited,#twitter-feed .user a:hover,#blog-feed .user a:link,#blog-feed .user a:visited,#blog-feed .user a:hover{text-decoration:none}#twitter-feed .user span[data-scribe="element:name"],#blog-feed .user span[data-scribe="element:name"]{color:#333}#twitter-feed .tweet,#blog-feed .tweet{padding-left:33px;margin-bottom:.3em}#twitter-feed .timePosted,#blog-feed .timePosted{padding-left:33px;font-size:0.875em}#twitter-feed .interact,#blog-feed .interact{padding-left:33px}#twitter-feed .interact a:link,#twitter-feed .interact a:visited,#blog-feed .interact a:link,#blog-feed .interact a:visited{margin-right:20px}@media only screen and (min-width: 769px){#twitter-feed .timePosted{position:absolute;top:0;right:0;padding-left:0}}.spaced-segment{margin-bottom:50px}.spaced-segment h3{margin-bottom:1.3em}.strip-dark,.strip-light{clear:both}.strip-dark{background-color:#2c001e;background-image:none;background-repeat:repeat;color:#fff}.strip-dark.solid{background-image:none;background-color:#2c001e}.strip-dark ul,.strip-dark ol{margin:0;padding:0}.strip-dark .icon,.strip-dark ol span{-moz-background-size:40px 40px;-webkit-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;background-image:url(../img/icons/list-icon-background.png);background-repeat:no-repeat;display:block;margin:0 20px 20px 0;padding:24px;float:left;width:16px;height:16px;padding:12px}.strip-light .icon,.strip-dark .icon{position:absolute}.strip-light{background-color:rgba(255,255,255,0.6)}.strip-dark ol,.strip-dark ul{padding:20px 0}.strip-light .icon{display:block;background-image:url(../img/icons/list-icon-background.png);padding:24px;margin:0 auto 48px}.strip-dark .connected-list li,.strip-light .connected-list li{margin-bottom:10px;min-height:52px}.strip-dark .connected-list li p,.strip-light .connected-list li p,.strip-dark .connected-list li h3,.strip-light .connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li p .strip-dark ol.connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li span{float:left;font-size:22px;font-weight:normal;height:26px;margin-left:0;margin-right:20px;padding-top:2px;position:absolute;text-align:center;width:16px}.strip-white{background:#fff}.strip-trans{background:transparent}.strip-green{background-image:linear-gradient(to right, #6fad23 0%, #7cc227 100%);overflow:hidden}.strip-green,.strip-green a{color:#fff}.strip-blue{background-image:linear-gradient(to right, #1076a2 0%, #359fcd 100%);overflow:hidden}.strip-blue,.strip-blue a{color:#fff}@media only screen and (min-width: 769px){.tip,.command2clipboard__clip{position:relative;display:inline-block}.tip .tip-content,.command2clipboard__clip .tip-content{position:absolute;z-index:98;left:-1000px;right:-1000px;top:-30px;font-weight:300;margin:auto;display:block;text-align:center;white-space:nowrap}.tip:hover .tip-content:after,.command2clipboard__clip.zeroclipboard-is-hover .tip-content:after{display:table;z-index:98;margin:auto;color:#fff;border-radius:3px;background:#000;box-shadow:none;font-size:12px;content:attr(data-tooltip);padding:4px 6px;white-space:nowrap;text-align:center}.tip:hover .tip-content:before,.command2clipboard__clip.zeroclipboard-is-hover .tip-content:before{position:absolute;top:100%;left:50%;margin-left:-5px;content:'';border:solid transparent;border-width:5px;border-top-color:#000}}.fake{display:block}*{-webkit-backface-visibility:hidden;margin:0}html{height:100%}body{height:100%;font-size:1.0em;font-family:'Ubuntu', Arial, 'libra sans', sans-serif;font-weight:300}hr{border:none;background:#B2B2B2;width:100%;height:1px;display:block;width:100%;float:left;margin-bottom:20px}ul,ol{margin-left:0}a.alt{color:#333}a.alt:hover{color:#dd4814}a:active,a:focus{outline:none}::selection{color:#FFF;background:#dd4814}::-moz-selection{color:#FFF;background:#dd4814}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:300;src:url("../fonts/ubuntu-l-webfont.eot?") format("eot"),url("../fonts/ubuntu-l-webfont.woff2") format("woff2"),url("../fonts/ubuntu-l-webfont.woff") format("woff"),url("../fonts/ubuntu-l-webfont.ttf") format("truetype"),url("../fonts/ubuntu-l-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:italic;font-weight:300;src:url("../fonts/ubuntu-li-webfont.eot?") format("eot"),url("../fonts/ubuntu-li-webfont.woff2") format("woff2"),url("../fonts/ubuntu-li-webfont.woff") format("woff"),url("../fonts/ubuntu-li-webfont.ttf") format("truetype"),url("../fonts/ubuntu-li-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:400;src:url("../fonts/ubuntu-r-webfont.eot?") format("eot"),url("../fonts/ubuntu-r-webfont.woff2") format("woff2"),url("../fonts/ubuntu-r-webfont.woff") format("woff"),url("../fonts/ubuntu-r-webfont.ttf") format("truetype"),url("../fonts/ubuntu-r-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:500;src:url("../fonts/ubuntu-m-webfont.eot?") format("eot"),url("../fonts/ubuntu-m-webfont.woff2") format("woff2"),url("../fonts/ubuntu-m-webfont.woff") format("woff"),url("../fonts/ubuntu-m-webfont.ttf") format("truetype"),url("../fonts/ubuntu-m-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:italic;font-weight:500;src:url("../fonts/ubuntu-mi-webfont.eot?") format("eot"),url("../fonts/ubuntu-mi-webfont.woff2") format("woff2"),url("../fonts/ubuntu-mi-webfont.woff") format("woff"),url("../fonts/ubuntu-mi-webfont.ttf") format("truetype"),url("../fonts/ubuntu-mi-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:700;src:url("../fonts/ubuntu-b-webfont.eot?") format("eot"),url("../fonts/ubuntu-b-webfont.woff2") format("woff2"),url("../fonts/ubuntu-b-webfont.woff") format("woff"),url("../fonts/ubuntu-b-webfont.ttf") format("truetype"),url("../fonts/ubuntu-b-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:400;src:url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/GZMdC02DTXXx8AdUvU2etw.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:700;src:url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/pqisLQoeO9YTDCNnlQ9bfz8E0i7KZn-EPnyo3HZu7kw.woff") format("woff")}.accordion{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;background:#FFF;box-shadow:0 1px 1px rgba(0,0,0,0.1);margin-bottom:40px}.disabled .accordion{opacity:.5;pointer-events:none}.accordion .accordion__title{border-bottom:1px dotted #B2B2B2;padding:13px 20px 12px;margin:0;font-size:1.3em}.accordion .accordion__tab{border-bottom:1px dotted #B2B2B2}.accordion .accordion__tab:last-of-type{border:none}.accordion .accordion__tab .accordion__tab-title{padding:12px 20px;margin:0;color:#888;cursor:pointer;background:transparent url("../img/icons/accordion-open.svg") top 20px right 20px no-repeat}.accordion .accordion__tab .accordion__tab-title.active{background-image:url("../img/icons/accordion-close.svg")}.accordion .accordion__tab .accordion__tab-title.active+.accordion__tab-content{max-height:3000px;transition:max-height 0.5s ease-in}.accordion .accordion__tab .accordion__tab-content{max-height:0;transition:max-height 0.5s ease-out;overflow:hidden}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list{list-style-type:none;padding:0 20px 14px;margin:0}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item{margin-bottom:0.15em}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#333;width:100%;display:inline-block;padding-right:20px}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link:hover{color:#dd4814;text-decoration:none}.disabled .accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link{color:#333}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active{font-weight:400}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active .accordion__tab-link{background:transparent url("../img/icons/cross.svg") top 7px right 0px no-repeat}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active:hover{color:#dd4814}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active:hover .accordion__tab-link{color:#dd4814;background-image:url("../img/icons/cross-orange.svg")}.cta-group .cta-group__link{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:3px 0px 0px 3px;-moz-border-radius:3px 0px 0px 3px;border-radius:3px 0px 0px 3px;display:inline-block;padding:10px 14px;text-align:center;color:#ffffff;background-color:#dd4814}.cta-group .cta-group__link:hover{cursor:pointer;text-decoration:none;background-color:#c03f11}.cta-group.secondary .cta-group__link{color:#dd4814;border:1px solid #b2b2b2;background-color:#FFF;line-height:1}.cta-group.secondary .cta-group__link:hover{cursor:pointer;background-color:#F2F2F2}a.link-cta-ubuntu,button.cta-ubuntu,input[type='submit'],form button[type='submit'],form input[type='submit']{font-size:1em;border:none;max-height:37px}a.link-cta-ubuntu[disabled],a.link-cta-ubuntu.disabled,button.cta-ubuntu[disabled],button.cta-ubuntu.disabled,input[type='submit'][disabled],input[type='submit'].disabled,form button[type='submit'][disabled],form button[type='submit'].disabled,form input[type='submit'][disabled],form input[type='submit'].disabled{cursor:default;opacity:.5}a.link-cta-ubuntu.clear,button.cta-ubuntu.clear,input[type='submit'].clear,form button[type='submit'].clear,form input[type='submit'].clear{background:none;color:#333}a.link-cta-ubuntu.secondary,button.cta-ubuntu.secondary,input[type='submit'].secondary,form button[type='submit'].secondary,form input[type='submit'].secondary{color:#dd4814;border:1px solid #b2b2b2;background:#FFF}a.link-cta-ubuntu.secondary.external,button.cta-ubuntu.secondary.external,input[type='submit'].secondary.external,form button[type='submit'].secondary.external,form input[type='submit'].secondary.external{background-image:url("../img/external-link-black.svg");background-size:16px 16px;background-repeat:no-repeat;background-position:top 8px right 8px}a.link-cta-ubuntu.secondary:hover,button.cta-ubuntu.secondary:hover,input[type='submit'].secondary:hover,form button[type='submit'].secondary:hover,form input[type='submit'].secondary:hover{background-color:#F2F2F2;cursor:pointer}a.link-cta-ubuntu.secondary[disabled],a.link-cta-ubuntu.secondary .disabled,button.cta-ubuntu.secondary[disabled],button.cta-ubuntu.secondary .disabled,input[type='submit'].secondary[disabled],input[type='submit'].secondary .disabled,form button[type='submit'].secondary[disabled],form button[type='submit'].secondary .disabled,form input[type='submit'].secondary[disabled],form input[type='submit'].secondary .disabled{cursor:default;color:#fff;border:1px solid #b2b2b2;background:#eee}a.link-cta-ubuntu.secondary[disabled]:hover,a.link-cta-ubuntu.secondary .disabled:hover,button.cta-ubuntu.secondary[disabled]:hover,button.cta-ubuntu.secondary .disabled:hover,input[type='submit'].secondary[disabled]:hover,input[type='submit'].secondary .disabled:hover,form button[type='submit'].secondary[disabled]:hover,form button[type='submit'].secondary .disabled:hover,form input[type='submit'].secondary[disabled]:hover,form input[type='submit'].secondary .disabled:hover{background:#EEE}a.link-cta-ubuntu.text-button,button.cta-ubuntu.text-button,input[type='submit'].text-button,form button[type='submit'].text-button,form input[type='submit'].text-button{background-color:transparent;color:#333}a.link-cta-ubuntu.text-button:hover,button.cta-ubuntu.text-button:hover,input[type='submit'].text-button:hover,form button[type='submit'].text-button:hover,form input[type='submit'].text-button:hover{text-decoration:underline}a.link-cta-ubuntu.full,button.cta-ubuntu.full,input[type='submit'].full,form button[type='submit'].full,form input[type='submit'].full{display:block;width:100%}@media screen and (max-width: 768px){a.link-cta-ubuntu,button.cta-ubuntu,input[type='submit'],form button[type='submit'],form input[type='submit']{margin-bottom:20px}}a.link-cta-ubuntu{line-height:20px}.cta-group{float:left;width:auto;clear:both;position:relative;overflow:hidden}.cta-group .cta-group__link{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;max-height:36px;padding-right:49px;width:100%;line-height:1.2;position:relative;margin:0;text-align:left}.cta-group .cta-group__link:after{-webkit-border-radius:0px 3px 3px 0px;-moz-border-radius:0px 3px 3px 0px;border-radius:0px 3px 3px 0px;content:'';display:block;height:36px;width:34px;background:red;position:absolute;top:0;right:0;background-image:url("../img/chevron-white.svg");background-color:#dd4814;background-repeat:no-repeat;background-position:center}.cta-group .cta-group__link:hover{background-color:#dd4814}.cta-group .cta-group__link:hover:after{background-color:#c03f11}.cta-group .cta-group__dropdown{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;right:0;list-style:none;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);z-index:20;max-height:1000px;transition:max-height 0.3s ease-in;overflow:hidden;position:relative;clear:both}.cta-group .cta-group__dropdown.ng-hide{display:block !important;max-height:0;overflow:hidden;transition:max-height 0.3s ease-out}.cta-group .cta-group__dropdown .cta-group__item{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;clear:both;padding:5px 10px;margin:0}.cta-group .cta-group__dropdown .cta-group__item a{color:#333;cursor:pointer;width:100%;float:left;margin:0}.cta-group .cta-group__dropdown .cta-group__item a:hover{color:#dd4814;text-decoration:none}.cta-group.secondary .cta-group__link{float:left;max-height:36px;width:100%}.cta-group.secondary .cta-group__link:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-image:url("../img/icons/accordion-open.svg");background-repeat:no-repeat;background-color:#fff;border:1px solid #b2b2b2;border-left:none;top:-1px;right:-1px}.cta-group.secondary .cta-group__link:hover{background-color:#FFF}.cta-group.secondary .cta-group__link:hover:after{background-color:#F2F2F2}.flash-messages{margin:0px auto;padding:0;max-width:1440px}@media screen and (max-width: 1030px){.flash-messages{margin:0px 10px 20px}}.flash-messages .flash-messages__item{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;margin:0 0 20px;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.flash-messages .flash-messages__item.info{background-image:url("../img/icons/info.png");background-image:url("../img/icons/info.svg"),none}.flash-messages .flash-messages__item.success{background-image:url("../img/icons/success.png");background-image:url("../img/icons/success.svg"),none}.flash-messages .flash-messages__item.warning{background-image:url("../img/icons/warning.png");background-image:url("../img/icons/warning.svg"),none}.flash-messages .flash-messages__item.error{background-image:url("../img/icons/error.png");background-image:url("../img/icons/error.svg"),none}form input[type='text'],form input[type='number'],form input[type='search'],form input[type='password'],form input[type='email'],form input[type='url'],form textarea,form select,tags-input .tags .input,.accounts .api li input[type='text']{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;background:#FFF;color:#333;border:1px solid #D2D2D2;display:block;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-size:1em;font-weight:300;padding:0px 13px}form input[type='text']:active,form input[type='number']:active,form input[type='search']:active,form input[type='password']:active,form input[type='email']:active,form input[type='url']:active,form textarea:active,form select:active,tags-input .tags .input:active,.accounts .api li input[type='text']:active{border-color:#B2B2B2;outline:none}form input[type='text']:focus,form input[type='number']:focus,form input[type='search']:focus,form input[type='password']:focus,form input[type='email']:focus,form input[type='url']:focus,form textarea:focus,form select:focus,tags-input .tags .input:focus,.accounts .api li input[type='text']:focus{border-color:#B2B2B2;outline:none}form input.invalid[type='text'],form input.invalid[type='number'],form input.invalid[type='search'],form input.invalid[type='password'],form input.invalid[type='email'],form input.invalid[type='url'],form textarea.invalid,form select.invalid,tags-input .tags .invalid.input,.accounts .api li input.invalid[type='text'],form input.ng-invalid[type='text'],form input.ng-invalid[type='number'],form input.ng-invalid[type='search'],form input.ng-invalid[type='password'],form input.ng-invalid[type='email'],form input.ng-invalid[type='url'],form textarea.ng-invalid,form select.ng-invalid,tags-input .tags .ng-invalid.input,.accounts .api li input.ng-invalid[type='text']{border-color:#d90000}form input[disabled="disabled"][type='text'],form input[disabled="disabled"][type='number'],form input[disabled="disabled"][type='search'],form input[disabled="disabled"][type='password'],form input[disabled="disabled"][type='email'],form input[disabled="disabled"][type='url'],form textarea[disabled="disabled"],form select[disabled="disabled"],tags-input .tags [disabled="disabled"].input,.accounts .api li input[disabled="disabled"][type='text']{-webkit-text-fill-color:#333;border-color:#D2D2D2;background-color:transparent}label{position:relative}.disabled label{cursor:default}form li.help-msg{margin-bottom:1em}form li.help-msg .help{color:#888;font-size:0.875em}form label span{color:#333}form input[type='text'],form input[type='number'],form input[type='search'],form input[type='password'],form input[type='email'],form input[type='url']{padding:7px 10px}form input[type='text']::-webkit-input-placeholder,form input[type='number']::-webkit-input-placeholder,form input[type='search']::-webkit-input-placeholder,form input[type='password']::-webkit-input-placeholder,form input[type='email']::-webkit-input-placeholder,form input[type='url']::-webkit-input-placeholder{color:#888}form input[type='text']:-moz-placeholder,form input[type='number']:-moz-placeholder,form input[type='search']:-moz-placeholder,form input[type='password']:-moz-placeholder,form input[type='email']:-moz-placeholder,form input[type='url']:-moz-placeholder{color:#888}form input[type='text']::-moz-placeholder,form input[type='number']::-moz-placeholder,form input[type='search']::-moz-placeholder,form input[type='password']::-moz-placeholder,form input[type='email']::-moz-placeholder,form input[type='url']::-moz-placeholder{color:#888}form input[type='text']:-ms-input-placeholder,form input[type='number']:-ms-input-placeholder,form input[type='search']:-ms-input-placeholder,form input[type='password']:-ms-input-placeholder,form input[type='email']:-ms-input-placeholder,form input[type='url']:-ms-input-placeholder{color:#888}form input[type='number']{padding-right:15px}form input[type='search']{-webkit-appearance:textfield}form input[type='search']::-webkit-search-decoration,form input[type='search']::-webkit-search-cancel-button{-webkit-appearance:none}form input[type='radio'],form input[type='image']{display:inline-block;margin-right:10px}form textarea{overflow:auto;height:auto;min-height:175px;padding:7px 10px;vertical-align:top}form select{display:block;clear:both;cursor:pointer;margin:0;background-image:url("../img/icons/accordion-open.svg");background-repeat:no-repeat;background-position:top 16px right 10px;padding:6px 30px 6px 10px;-moz-appearance:none;text-indent:0.01px;text-overflow:''}form select[multiple],form select[size]{height:auto;background-image:none;padding-top:10px}form select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}form select[disabled]{color:#888;background-image:none}form select::-ms-expand{display:none}form fieldset{background:none;margin-left:0;padding:0}.checkbox{visibility:hidden;width:0;height:0;margin-right:0;position:absolute}.checkbox+.checkbox-label{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-left:20px;position:relative}.checkbox+.checkbox-label:before{content:"";display:inline-block;width:20px;height:20px;position:absolute;top:0;left:0;background:url("../img/checkbox.svg") no-repeat;background-size:13px 13px;background-position:0px 3px}.checkbox:checked+.checkbox-label:before{background:url("../img/checkbox-checked.svg") no-repeat;background-position:0px 3px}.checkbox[disabled="disabled"]+.checkbox-label:before{cursor:default;opacity:0.5}.field-error,.errors{color:#DF382C}.field-error .errorlist,.errors .errorlist{margin:0}.field-error .errorlist li,.errors .errorlist li{margin:0 0 14px 0}.inline{display:inline-block;width:100%;font-size:0;margin-bottom:10px}.inline.error{background-color:#fdf5f5;box-shadow:0px 0px 0px 5px #fdf5f5}.inline.error .ng-invalid{border-color:#D2D2D2}.inline:last-of-type{margin-bottom:0}.inline label{display:inline-block;float:none;font-size:16px;margin:0}.inline input[type='submit'],.inline input[type='text'],.inline input[type='number'],.inline input[type='search'],.inline input[type='password'],.inline input[type='email'],.inline input[type='checkbox'],.inline select{display:inline-block;clear:none;margin:0;float:none;font-size:16px}.inline input[type='submit']:invalid,.inline input[type='text']:invalid,.inline input[type='number']:invalid,.inline input[type='search']:invalid,.inline input[type='password']:invalid,.inline input[type='email']:invalid,.inline input[type='checkbox']:invalid,.inline select:invalid{-moz-box-shadow:none}.inline input[type='submit']:-moz-submit-invalid,.inline input[type='text']:-moz-submit-invalid,.inline input[type='number']:-moz-submit-invalid,.inline input[type='search']:-moz-submit-invalid,.inline input[type='password']:-moz-submit-invalid,.inline input[type='email']:-moz-submit-invalid,.inline input[type='checkbox']:-moz-submit-invalid,.inline select:-moz-submit-invalid{box-shadow:none}.inline input[type='submit']:-moz-ui-invalid,.inline input[type='text']:-moz-ui-invalid,.inline input[type='number']:-moz-ui-invalid,.inline input[type='search']:-moz-ui-invalid,.inline input[type='password']:-moz-ui-invalid,.inline input[type='email']:-moz-ui-invalid,.inline input[type='checkbox']:-moz-ui-invalid,.inline select:-moz-ui-invalid{box-shadow:none}.inline div{float:none;margin:0}.inline input.cta-ubuntu,.inline a.link-cta-ubuntu,.inline button.cta-ubuntu{font-size:16px}.inline .icon{position:absolute;top:11px;right:10px;cursor:pointer}.inline .error-message{font-size:12px;color:#e85232;margin-top:10px;margin-bottom:10px;font-weight:normal}.form-inline label,.form-inline button,.form-inline input[type='submit'],.form-inline input[type='text'],.form-inline input[type='number'],.form-inline input[type='search'],.form-inline input[type='password'],.form-inline input[type='email'],.form-inline input[type='checkbox'],.form-inline select{display:inline-block;width:auto;vertical-align:middle;margin-bottom:0}.form-inline input,.form-inline input[type='submit'] input[type='text'],.form-inline input[type='number'],.form-inline input[type='search'],.form-inline input[type='password'],.form-inline input[type='email'],.form-inline input[type='checkbox'],.form-inline select{margin-left:20px}.form-inline fieldset{width:auto;display:inline-block;margin:0 40px 0 0}.controls{position:absolute;top:0;right:20px}.controls a,.controls button{margin-left:20px}.icon{background-size:16px 16px;width:16px;height:16px;padding:0;display:inline-block}.icon.icon__loading{background:url("../img/in_progress.png") no-repeat;-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;animation:spin 1s infinite linear}a.icon{cursor:pointer}dl dt{clear:left}dl dd{color:#888;margin-left:0}dl dt,dl dd{display:inline-block;float:left;line-height:37px;margin-bottom:10px !important}tags-input{outline:none}tags-input .host:focus{outline:none}tags-input .tags:focus,tags-input .tags.focused{outline:none}tags-input .tags .tag-list{margin:4px 0 0;padding:0;list-style-type:none;width:100%;float:left}tags-input .tags .tag-item{display:inline-block;float:left;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-size:1em;font-weight:300;height:30px;line-height:30px;cursor:default;color:#000;padding-right:15px;position:relative;margin:0 11px 0 0}tags-input .tags .tag-item .remove-button{display:inline-block;width:12px;height:12px;text-indent:-999em;background:url("../img/icons/cross.svg") no-repeat;background-size:12px 12px;position:absolute;right:0;top:9px;cursor:pointer}tags-input .tags .tag-item .remove-button:hover{text-decoration:none}tags-input .tags .input{padding:7px 10px;width:100% !important;float:left;position:relative !important;left:0}tags-input .tags .input::-ms-clear{display:none}tags-input .suggestion-list{background:#FFF;padding:10px 8px;border:1px solid #D2D2D2;border-top:0;border-radius:0 0 2px 2px;display:none}tags-input .suggestion-list li:hover{background:#EEE;cursor:pointer}tags-input[disabled] .host:focus{outline:none}tags-input[disabled] .tags{cursor:default}tags-input[disabled] .tags .tag-item .remove-button{cursor:default}tags-input[disabled] .tags .input{cursor:default}.tag-link{margin-right:10px}.tag-link:last-of-type:after{content:''}.pagination{margin:10px 0;text-align:center}.pagination .inactive{color:#AEA79F}.pagination a,.pagination span{margin:0 5px}.search{position:relative;padding-bottom:20px}.search input[type='search']{-webkit-appearance:textfield}.search .search__input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;list-style:none;background:#FFF;box-shadow:0 1px 1px rgba(0,0,0,0.1);width:100%;border:none;padding:13px 20px;font-size:1.25em}.search .search__input::-webkit-input-placeholder{color:#000 !important}.search .search__input:-moz-placeholder{color:#000 !important}.search .search__input::-moz-placeholder{color:#000 !important}.search .search__input:-ms-input-placeholder{color:#000 !important}.search .search__input[disabled="disabled"]{background-color:#fff;opacity:.5;pointer-events:none}.search .search__input[disabled="disabled"]+.search__submit.close{pointer-events:none;opacity:.5}.search .search__submit{position:absolute;top:15px;right:25px;background-color:transparent;background-image:url("../img/search-icon.svg");background-repeat:no-repeat;text-indent:-999em;display:block;width:21px;height:20px;overflow:hidden;outline:none;padding:0;border:none}.search .search__submit:hover{background-color:transparent;background-image:url("../img/search-icon.svg")}.search .search__submit.close{background-image:url("../img/icons/cross.svg");background-size:21px;margin-top:2px}.search .search__submit.close:hover{background-image:url("../img/icons/cross.svg")}.spinner-col{width:10px}.spinner{float:left;margin:0 auto;text-indent:-9999em}.spinner.spin{background:url("../img/in_progress.png") no-repeat;background-size:16px 16px;width:16px;height:16px;-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;animation:spin 1s infinite linear;padding:0}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}table{text-align:left;width:100%;margin-bottom:40px;border-collapse:separate;border-spacing:0;font-size:16px}table th,table td{background:transparent;text-align:left;padding:13px 10px}table th .checkbox+.checkbox-label::before,table td .checkbox+.checkbox-label::before{top:-2px}table thead th{background:transparent;color:#888;border:none;border-bottom:1px solid #B2B2B2}table tbody tr:hover .icon-controls a{opacity:1}table tbody td{border:none;border-bottom:1px dotted #B2B2B2;position:relative}table tbody td.icon-controls{text-align:right}table tbody td.icon-controls a{opacity:0}table tbody td input[type="text"]{position:absolute;left:10px;top:6px;width:80%}.table-listing{text-align:left;width:100%;margin:0 0 40px 0;border-collapse:separate;border-spacing:0}.table-listing .table-listing__row:hover .table-listing__cell{background-color:#FFF}.table-listing .table-listing__row.error{background-color:#F3E3E2}.table-listing .table-listing__row.error .status{color:#DD3832}.table-listing .table-listing__row.progress{background-color:rgba(25,182,238,0.1)}.table-listing .table-listing__row.selected{background-color:#FFF}.table-listing .table-listing__header{background:transparent;color:#888;border:none;border-bottom:1px solid #B2B2B2}.table-listing .table-listing__header .table-listing__header-link{background-repeat:no-repeat;background-position:top 8px right 0;color:#888}.table-listing .table-listing__header .table-listing__header-link:hover{color:#333;text-decoration:none;border-bottom:1px solid #333}.table-listing .table-listing__header .table-listing__header-link:focus,.table-listing .table-listing__header .table-listing__header-link:active,.table-listing .table-listing__header .table-listing__header-link:visited{text-decoration:none}.table-listing .table-listing__header .table-listing__header-link.active{color:#333}.table-listing .table-listing__header .table-listing__header-link.sort{border-bottom:1px solid #333}.table-listing .table-listing__header .divide{width:1px;display:inline-block;background:#D2D2D2 none repeat scroll 0% 0%;height:10px;padding:0px;margin:0px 5px}.table-listing .table-listing__cell{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:none;border-bottom:1px dotted #B2B2B2;position:relative}.table-listing .table-listing__cell.icon-controls{text-align:right;opacity:0}.table-listing .table-listing__cell input,.table-listing .table-listing__cell select{position:absolute;left:10px;top:5px;width:80%}.table-listing .fixed{max-width:200px;min-width:200px;width:200px;padding-left:0}.table-listing__header .table-listing .fixed{padding-left:0}.table-listing.no-hover .table-listing__row:hover .table-listing__cell,.table-listing.no-hover .table-listing__row:hover td{background-color:transparent}.t1{width:1%}.t2{width:2%}.t3{width:3%}.t4{width:4%}.t5{width:5%}.t6{width:6%}.t7{width:7%}.t8{width:8%}.t9{width:9%}.t10{width:10%}.t11{width:11%}.t12{width:12%}.t13{width:13%}.t14{width:14%}.t15{width:15%}.t16{width:16%}.t17{width:17%}.t18{width:18%}.t19{width:19%}.t20{width:20%}.t21{width:21%}.t22{width:22%}.t23{width:23%}.t24{width:24%}.t25{width:25%}.t26{width:26%}.t27{width:27%}.t28{width:28%}.t29{width:29%}.t30{width:30%}.t31{width:31%}.t32{width:32%}.t33{width:33%}.t34{width:34%}.t35{width:35%}.t36{width:36%}.t37{width:37%}.t38{width:38%}.t39{width:39%}.t40{width:40%}.t41{width:41%}.t42{width:42%}.t43{width:43%}.t44{width:44%}.t45{width:45%}.t46{width:46%}.t47{width:47%}.t48{width:48%}.t49{width:49%}.t50{width:50%}.t51{width:51%}.t52{width:52%}.t53{width:53%}.t54{width:54%}.t55{width:55%}.t56{width:56%}.t57{width:57%}.t58{width:58%}.t59{width:59%}.t60{width:60%}.t61{width:61%}.t62{width:62%}.t63{width:63%}.t64{width:64%}.t65{width:65%}.t66{width:66%}.t67{width:67%}.t68{width:68%}.t69{width:69%}.t70{width:70%}.t71{width:71%}.t72{width:72%}.t73{width:73%}.t74{width:74%}.t75{width:75%}.t76{width:76%}.t77{width:77%}.t78{width:78%}.t79{width:79%}.t80{width:80%}.t81{width:81%}.t82{width:82%}.t83{width:83%}.t84{width:84%}.t85{width:85%}.t86{width:86%}.t87{width:87%}.t88{width:88%}.t89{width:89%}.t90{width:90%}.t91{width:91%}.t92{width:92%}.t93{width:93%}.t94{width:94%}.t95{width:95%}.t96{width:96%}.t97{width:97%}.t98{width:98%}.t99{width:99%}.t100{width:100%}.table__column--1{max-width:14.4px;width:100%}.table__column--2{max-width:28.8px;width:100%}.table__column--3{max-width:43.2px;width:100%}.table__column--4{max-width:57.6px;width:100%}.table__column--5{max-width:72px;width:100%}.table__column--6{max-width:86.4px;width:100%}.table__column--7{max-width:100.8px;width:100%}.table__column--8{max-width:115.2px;width:100%}.table__column--9{max-width:129.6px;width:100%}.table__column--10{max-width:144px;width:100%}.table__column--11{max-width:158.4px;width:100%}.table__column--12{max-width:172.8px;width:100%}.table__column--13{max-width:187.2px;width:100%}.table__column--14{max-width:201.6px;width:100%}.table__column--15{max-width:216px;width:100%}.table__column--16{max-width:230.4px;width:100%}.table__column--17{max-width:244.8px;width:100%}.table__column--18{max-width:259.2px;width:100%}.table__column--19{max-width:273.6px;width:100%}.table__column--20{max-width:288px;width:100%}.table__column--21{max-width:302.4px;width:100%}.table__column--22{max-width:316.8px;width:100%}.table__column--23{max-width:331.2px;width:100%}.table__column--24{max-width:345.6px;width:100%}.table__column--25{max-width:360px;width:100%}.table__column--26{max-width:374.4px;width:100%}.table__column--27{max-width:388.8px;width:100%}.table__column--28{max-width:403.2px;width:100%}.table__column--29{max-width:417.6px;width:100%}.table__column--30{max-width:432px;width:100%}.table__column--31{max-width:446.4px;width:100%}.table__column--32{max-width:460.8px;width:100%}.table__column--33{max-width:475.2px;width:100%}.table__column--34{max-width:489.6px;width:100%}.table__column--35{max-width:504px;width:100%}.table__column--36{max-width:518.4px;width:100%}.table__column--37{max-width:532.8px;width:100%}.table__column--38{max-width:547.2px;width:100%}.table__column--39{max-width:561.6px;width:100%}.table__column--40{max-width:576px;width:100%}.table__column--41{max-width:590.4px;width:100%}.table__column--42{max-width:604.8px;width:100%}.table__column--43{max-width:619.2px;width:100%}.table__column--44{max-width:633.6px;width:100%}.table__column--45{max-width:648px;width:100%}.table__column--46{max-width:662.4px;width:100%}.table__column--47{max-width:676.8px;width:100%}.table__column--48{max-width:691.2px;width:100%}.table__column--49{max-width:705.6px;width:100%}.table__column--50{max-width:720px;width:100%}.table__column--51{max-width:734.4px;width:100%}.table__column--52{max-width:748.8px;width:100%}.table__column--53{max-width:763.2px;width:100%}.table__column--54{max-width:777.6px;width:100%}.table__column--55{max-width:792px;width:100%}.table__column--56{max-width:806.4px;width:100%}.table__column--57{max-width:820.8px;width:100%}.table__column--58{max-width:835.2px;width:100%}.table__column--59{max-width:849.6px;width:100%}.table__column--60{max-width:864px;width:100%}.table__column--61{max-width:878.4px;width:100%}.table__column--62{max-width:892.8px;width:100%}.table__column--63{max-width:907.2px;width:100%}.table__column--64{max-width:921.6px;width:100%}.table__column--65{max-width:936px;width:100%}.table__column--66{max-width:950.4px;width:100%}.table__column--67{max-width:964.8px;width:100%}.table__column--68{max-width:979.2px;width:100%}.table__column--69{max-width:993.6px;width:100%}.table__column--70{max-width:1008px;width:100%}.table__column--71{max-width:1022.4px;width:100%}.table__column--72{max-width:1036.8px;width:100%}.table__column--73{max-width:1051.2px;width:100%}.table__column--74{max-width:1065.6px;width:100%}.table__column--75{max-width:1080px;width:100%}.table__column--76{max-width:1094.4px;width:100%}.table__column--77{max-width:1108.8px;width:100%}.table__column--78{max-width:1123.2px;width:100%}.table__column--79{max-width:1137.6px;width:100%}.table__column--80{max-width:1152px;width:100%}.table__column--81{max-width:1166.4px;width:100%}.table__column--82{max-width:1180.8px;width:100%}.table__column--83{max-width:1195.2px;width:100%}.table__column--84{max-width:1209.6px;width:100%}.table__column--85{max-width:1224px;width:100%}.table__column--86{max-width:1238.4px;width:100%}.table__column--87{max-width:1252.8px;width:100%}.table__column--88{max-width:1267.2px;width:100%}.table__column--89{max-width:1281.6px;width:100%}.table__column--90{max-width:1296px;width:100%}.table__column--91{max-width:1310.4px;width:100%}.table__column--92{max-width:1324.8px;width:100%}.table__column--93{max-width:1339.2px;width:100%}.table__column--94{max-width:1353.6px;width:100%}.table__column--95{max-width:1368px;width:100%}.table__column--96{max-width:1382.4px;width:100%}.table__column--97{max-width:1396.8px;width:100%}.table__column--98{max-width:1411.2px;width:100%}.table__column--99{max-width:1425.6px;width:100%}.table__column--100{max-width:1440px;width:100%}#commissioning_scripts .script-content.slider{overflow:hidden}#commissioning_scripts .script-content.slider pre{margin-top:20px}.table{display:table;border-color:#B2B2B2;border-collapse:collapse;border-spacing:0;overflow-x:scroll;margin-bottom:20px;margin:0 0 2.5em;width:100%}.table .table__row{float:left;width:100%;display:table-row;border-bottom:1px dotted #B2B2B2}.table .table__row:hover{background-color:#FFF}.table .table__row:hover .table__input{background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row:hover .table__controls{z-index:1;opacity:1}.table .table__row:hover .table__controls--secondary{z-index:1;opacity:1}.table .table__row.active{background-color:#FFF}.table .table__row.active:hover .table__input{background-color:transparent;border-color:transparent;pointer-events:none;background-position:-9999px -9999px}.table .table__row.active:hover .table__input.editible{pointer-events:all;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__row.active:hover .table__controls{opacity:0;z-index:-1000;pointer-events:none}.table .table__row.active:hover .table__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.table .table__row.active:hover .table__dropdown .table__input{pointer-events:all;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__header,.table .table__data{font-size:16px;display:table-cell;padding:13px 10px;box-sizing:border-box;min-height:21px;background:none;border:0;text-align:left;float:left}.table .table__header a,.table .table__data a{color:#dd4814}.table .table__header a:hover,.table .table__data a:hover{cursor:pointer}.table .table__head{display:table-head;width:100%;box-sizing:border-box}.table .table__head .table__row{border-bottom:1px solid #B2B2B2}.table .table__head .table__row:hover{background-color:transparent}.table .table__head .table__header{font-size:13px;background:none;color:#888}.table .table__head a,.table .table__head .table__header-link{color:#888}.table .table__head a:hover,.table .table__head .table__header-link:hover{color:#333;text-decoration:none;border-bottom:1px solid #333}.table .table__head a.active,.table .table__head .table__header-link.active{color:#333;text-decoration:none}.table .table__head a.sort,.table .table__head .table__header-link.sort{border-bottom:1px solid inherit}.table .table__head .divide{width:1px;display:inline-block;background:#888;height:10px;margin:0 5px}.table .table__body{display:table-row-group}.table .table__footer{display:table-footer-group}.table .table__label{clear:both;display:block;margin-top:11px;color:#BCBCBC}.table .table__label a{color:#BCBCBC}.table .table__label a:hover{color:#dd4814}.table .table__label.active a{color:#dd4814}.table .table__controls{width:100%;text-align:right;opacity:0;z-index:-1000}.table .table__controls--secondary{opacity:0;z-index:-1000;width:auto;text-align:left}.table .table__input{display:inline-block;margin:-7px 0 -8px -14px;background-color:transparent;border-color:transparent;background-position:-9999px -9999px}.table label{font-size:13px;color:#BCBCBC}.table input,.table select{margin:0 0 0 -14px}.table input[type="radio"]{margin-left:0}.table ul li{margin:0;margin-bottom:14px}.table ul li:last-of-type{margin-bottom:0}.table .table__dropdown{width:100%}.table .table__dropdown .table__dropdown-row{border-bottom:0;position:relative}.table .table__dropdown .table__dropdown-row:before{display:block;margin:0 auto;width:calc(100% - 20px);border-top:1px dotted #B2B2B2;position:absolute;height:1px;content:'';top:0;left:10px}.table .table__dropdown .table__dropdown-row.table__dropdown-row--head{border-bottom:0}.table .table__dropdown .table__dropdown-row.table__dropdown-row--head .table__header{color:#BCBCBC;font-size:13px}.table .table__dropdown .table__dropdown-row.no-border{border:0}.table .table__dropdown .table__dropdown-row.no-border:before{border:0}.table .table__dropdown .table__dropdown-row .table__input{display:inline-block;margin:-7px 0 -8px -14px;background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.table .table__dropdown--info .table__row{border-bottom:0}.table .table__dropdown--info .table__data{color:#BCBCBC}h1 span,h2 span,h3 span,h4 span,h5 span{color:#888;font-size:75%;padding-left:20px}h4{font-size:20px;font-weight:300}pre{border:0;background-color:#FFF;border-radius:2px}.yui3-node-add-widget{width:65.9292%;margin-right:2.21238%}@media screen and (max-width: 768px){.yui3-node-add-widget{width:100%;margin:0}}.yui3-node-add-widget .buttons{margin-top:30px}.yui3-node-add-widget .add-link img.icon{margin-right:6px}.yui3-overlay{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;background-color:#fff;-webkit-box-shadow:0 0 10px 0 rgba(0,0,0,0.5);box-shadow:0 0 10px 0 rgba(0,0,0,0.5)}.yui3-overlay ul{padding:5px 0}.yui3-overlay li{float:none}.yui3-overlay li:last-child a{border-bottom:none}.yui3-overlay a{display:block;padding:6px 20px;color:#dd4814 !important;border-bottom:1px solid #e5e2e0}.yui3-overlay a:focus,.yui3-overlay a:hover{background-color:#f2f2f2}.yui3-overlay-hidden{display:none}.yui3-widget-mask{background-color:#000;opacity:0.3}.yui3-panel{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;background-color:#FFF;padding:50px 80px 50px 80px;-webkit-box-shadow:0 0 15px 0 #000;box-shadow:0 0 15px 0 #000}.yui3-panel .yui3-button{float:right}.yui3-panel .yui3-button.link-button{float:left;padding-left:0;padding-right:0;color:#dd4814;border:none;background:none;-webkit-box-shadow:none;box-shadow:none;font-size:13px}.yui3-widget-hd{margin-bottom:30px;font-size:24px}.yui3-widget-ft{margin-top:50px}.yui3-widget-button-wrapper{width:100%}.icon{margin-left:5px;width:16px;height:16px;display:inline-block;text-indent:999em;overflow:hidden;background-repeat:no-repeat;background-size:16px 16px;vertical-align:middle}.icon.info{background-image:url("../img/icons/info.png");background-image:url("../img/icons/info.svg"),none}.icon.edit{background-image:url("../img/icons/edit.png");background-image:url("../img/icons/edit.svg"),none}.icon.delete{background-image:url("../img/icons/delete.png");background-image:url("../img/icons/delete.svg"),none}.icon.remove{background-image:url("../img/icons/filter-remove.svg"),none}.icon.warning{background-image:url("../img/icons/warning.png");background-image:url("../img/icons/warning.svg"),none}.icon.debug{background-image:url("../img/icons/debug.png");background-image:url("../img/icons/debug.svg"),none}.icon.success,.icon.tick{background-image:url("../img/icons/success.png");background-image:url("../img/icons/success.svg"),none}.icon.error{background-image:url("../img/icons/error.png");background-image:url("../img/icons/error.svg"),none}.icon.partition{background-image:url("../img/icons/partition.svg")}.icon.add{background-image:url("../img/icons/add.svg")}.clear{clear:both}.hidden{display:none}.align-right{text-align:right}.align-center{text-align:center}.align-left{text-align:left}.right{float:right !important}.left{float:left !important}.border{border-top:1px dotted #B2B2B2;padding-top:20px}.border.bottom{border-bottom:1px dotted #B2B2B2}.border.solid{border-style:solid}.vertical-align{position:relative;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.margin-top{margin-top:20px}.margin-top--ten{margin-top:10px}.margin-right{margin-right:20px !important}.margin-right--ten{margin-right:10px !important}.margin-bottom{margin-bottom:20px}.margin-left{margin-left:20px}.margin-left--ten{margin-left:10px !important}.padding-top{padding-top:20px}.padding-top--ten{padding-top:10px !important}.padding-right{padding-right:20px}.padding-bottom{padding-bottom:20px !important}.padding-bottom--ten{padding-bottom:10px !important}.padding-left{padding-left:20px !important}.padding-left--30,.padding-left--thirty{padding-left:30px !important}.padding-left--35{padding-left:35px !important}.padding-left--45{padding-left:45px !important}.padding-left--50{padding-left:50px !important}.border-top{border-top:1px dotted #888}.add-machine__list .add-machine__details,.border-bottom{border-bottom:1px dotted #888}.no-padding{padding:0}.no-padding-top{padding-top:0 !important}.no-padding-left{padding-left:0}.no-padding-bottom{padding-bottom:0 !important}.no-margin-bottom{margin-bottom:0}.footer-wrapper{border-top:1px dotted #b2b2b2}.footer-wrapper footer.global{background-color:transparent;padding-top:0px;padding-right:20px;padding-left:20px;background-image:url("../img/logos/logo-ubuntu-orange.png");background-image:url("../img/logos/logo-ubuntu-orange.svg"),none;background-size:107px 25px;background-position:top 20px right 20px;background-repeat:no-repeat;max-width:1480px}.footer-wrapper footer.global p{font-size:0.875em}.footer-wrapper footer.global a{margin:0 5px;color:#dd4814}.footer-wrapper footer.global .version{font-weight:500;margin-right:5px}.footer-wrapper footer.global .copy{margin-top:10px}.footer-wrapper footer.global .legal{max-width:1440px}.wrapper{min-height:100%;height:auto !important;height:100%;margin:0 auto -112px;position:relative;background:rgba(255,255,255,0.6);padding-top:172px}.wrapper:after{content:'';position:absolute;display:block;top:0;right:0;bottom:0;left:0;background:url("../img/backgrounds/image-background-paper.png");height:100%;width:100%;z-index:-1}.inner-wrapper{max-width:1480px;padding:0px 20px;margin:0 auto;position:relative}.push,.footer-wrapper{height:112px}.row{background-color:transparent;border-bottom:1px dotted #CCC}.row:last-child{border-bottom:none}header.banner{overflow:visible;z-index:20;position:fixed;top:0}header.banner nav.nav-primary{border-bottom:none}header.banner .nav-primary.nav-right .logo-ubuntu{-moz-background-size:100px 30px;-webkit-background-size:100px 30px;-o-background-size:100px 30px;background-size:100px 30px;background-position:5px 9px;background-image:url("../img/logos/logo.png");background-image:url("../img/logos/logo.svg"),none}header.banner .nav-primary li:hover ul:after{display:none}@media screen and (max-width: 768px){header.banner .nav-primary ul{border-right:none}}header.banner #right-nav{float:right;margin-right:20px}@media screen and (max-width: 768px){header.banner #right-nav{margin-right:0}}header.banner #user-link{position:relative}@media screen and (max-width: 768px){header.banner #user-link{border-top:1px solid #d4d7d4;width:100%}}header.banner #user-link>a{padding-bottom:12px}@media screen and (max-width: 768px){header.banner #user-link>a{display:none}}header.banner #user-link .normal,header.banner #user-link .hover{margin-right:7px}@media screen and (max-width: 768px){header.banner #user-link .normal,header.banner #user-link .hover{display:none}}header.banner #user-link .hover{display:none}header.banner #user-link .nav{-webkit-border-radius:0px 0px 4px 4px;-moz-border-radius:0px 0px 4px 4px;border-radius:0px 0px 4px 4px;background-color:#FFF;border:none;display:none;position:absolute;right:0;top:48px;box-shadow:0px 2px 4px rgba(0,0,0,0.15)}@media screen and (min-width: 769px){header.banner #user-link .nav a.active{background:none;border:none}}header.banner #user-link .nav a:hover{background-color:transparent}@media screen and (max-width: 768px){header.banner #user-link .nav a:hover{background-color:#F8F8F8;color:#333}}@media screen and (max-width: 768px){header.banner #user-link .nav{background:none;position:relative;top:inherit;width:100%;box-shadow:none;float:left;padding:0}header.banner #user-link .nav li{border-bottom:1px solid #d4d7d4;width:100%;float:left}header.banner #user-link .nav li a{padding:10px 14px;width:100%}}@media screen and (max-width: 768px){header.banner #user-link:hover>a{background-color:transparent}}header.banner #user-link:hover .normal{display:none}header.banner #user-link:hover .hover{display:inline-block}@media screen and (max-width: 768px){header.banner #user-link:hover .hover{display:none}}header.banner #user-link:hover .nav{display:block}header.banner .nav-toggle{background-image:url("../img/icons/navigation-menu-plain.png");background-image:url("../img/icons/navigation-menu-plain.svg"),none;top:0}@media screen and (max-width: 768px){header.banner .nav-toggles .open{display:block}header.banner .nav-toggles .close{display:none}header.banner #canonlist:target ul{display:block}header.banner #canonlist:target+.nav-toggles .open{display:none}header.banner #canonlist:target+.nav-toggles .close{display:block}}.page-header{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#FFF;box-shadow:0 1px 1px rgba(0,0,0,0.1);width:100%;float:left;position:fixed;z-index:10;top:48px}.page-header .page-header__nav{position:absolute;top:10px;z-index:1000}.page-header .page-header__nav a{font-weight:300}.page-header .page-header__title{font-size:2em;width:auto;padding:31px 0;margin:0;float:left;font-size:32px}.page-header .page-header__title [contenteditable="true"]{display:inline-block;padding:8px 10px;width:auto;box-sizing:border-box;border:1px solid transparent;margin:-10px 0 -10px -10px;border-radius:2px;color:#333;cursor:default;font-size:32px}.page-header .page-header__title [contenteditable="true"].editable:hover{border:1px solid #D2D2D2;cursor:text}.page-header .page-header__title [contenteditable="true"]:active,.page-header .page-header__title [contenteditable="true"]:focus{outline:none;background-color:#FFF;border:1px solid #B2B2B2}.page-header .page-header__title [contenteditable="true"].invalid,.page-header .page-header__title [contenteditable="true"].invalid:hover,.page-header .page-header__title [contenteditable="true"].invalid:active,.page-header .page-header__title [contenteditable="true"].invalid:focus{border-color:#d90000}.page-header .page-header__title [contenteditable="true"] br{display:none}.page-header .page-header__title .icon{vertical-align:3px;margin-right:10px}.page-header .page-header__title .page-header__title--identicator{font-size:0.6em;width:auto;display:inline-block;position:relative;top:0px;padding-left:20px;margin-left:10px}.page-header .page-header__title .page-header__title--identicator a{color:#888}.page-header .page-header__title .page-header__title--identicator a:hover{text-decoration:none;border-bottom:3px solid #888}.page-header .page-header__title .page-header__title--identicator a:focus,.page-header .page-header__title .page-header__title--identicator a:active{text-decoration:none}.page-header .page-header__title .page-header__title--identicator a.active{color:#333;border-bottom:3px solid #dd4814}.page-header .page-header__title .page-header__title--identicator a.active:hover{text-decoration:none;cursor:default}.page-header .page-header__title .page-header__title--identicator .divide{width:1px;display:inline-block;background:#D2D2D2;height:11px;padding:0;margin:0 5px}.page-header .page-header__title .page-header__title--identicator .page-header__title-loadmore{font-size:14px;margin-left:10px}.page-header .page-header__title .page-header__title--identicator .page-header__title-loadmore:hover{border:0;text-decoration:underline}.page-header .page-header__title .link-cta-ubuntu,.page-header .page-header__title .alt{font-size:16px;margin-left:20px;position:relative;vertical-align:middle;margin-top:-5px}.page-header .page-header__actions{float:right;padding:34px 0;margin-bottom:0}.page-header .page-header__actions .page-header__cta{float:right;position:relative;height:auto;max-height:36px}.page-header .page-header__actions .page-header__cta .cta-group{float:right}.page-header .page-header__actions .page-header__cta .page-header__cta-feedback{display:inline-block;position:relative;line-height:36px;text-align:right;color:#dd4814;margin-right:20px;cursor:pointer}.page-header .page-header__actions .page-header__cta .page-header__cta-feedback:hover{text-decoration:underline}.page-header .page-header__dropdown{float:left;width:100%;max-height:1000px;transition:max-height 0.3s ease-in;overflow:hidden;border-color:#888 !important}.page-header .page-header__dropdown.ng-hide{display:block !important;max-height:0;overflow:hidden;transition:max-height 0.3s ease-out;border-top:none}.page-header .page-header__dropdown .page-header__feedback{border-top:1px dotted #888;display:inline-block;width:100%;padding:20px 0}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:0;background-position:top 3px left 0px;background-repeat:no-repeat;padding:6px 0 5px 25px;width:auto;display:inline-block;position:relative}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.info,.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.error{background-image:url("../img/icons/error.png");background-image:url("../img/icons/error.svg"),none;background-position:0px 9px}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.info.progress,.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.error.progress{width:100%}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.progress{padding-left:0}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.progress .loader{position:relative;top:1px}.title .title__indicator .title__link{color:#888;font-size:20px}.title .title__indicator .title__link:hover{color:#333;text-decoration:none;border-bottom:1px solid #333}.title .title__indicator .title__link:focus,.title .title__indicator .title__link:active{text-decoration:none}.title .title__indicator .title__link.active{color:#333;border-bottom:1px #dd4814 solid}.title .title__indicator .divide{width:1px;display:inline-block;background:#D2D2D2;height:11px;padding:0;margin:0 5px}.accounts .logout .divide{padding:0 20px 0 30px;display:inline-block}.accounts .api li{position:relative}.accounts .api li input[type='text']{line-height:30px;padding-right:30px;width:100%}.accounts .api li input[type='text']::-webkit-input-placeholder{color:#333}.accounts .api li input[type='text']:-moz-placeholder{color:#333}.accounts .api li input[type='text']::-moz-placeholder{color:#333}.accounts .api li input[type='text']:-ms-input-placeholder{color:#333}.accounts .api li .delete-link{position:absolute;top:7px;right:7px}form.page-title-form{margin-bottom:30px}form.page-title-form input{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;border:1px solid transparent;background-color:transparent;font-size:36px;line-height:26px;color:#333;margin:6px 10px;padding:4px;height:auto;box-shadow:none}form.page-title-form input:hover{outline:none;background:#FFF;border-color:#D2D2D2;box-shadow:inset 0 1px 1px rgba(0,0,0,0.1)}form.page-title-form input:focus{border:1px solid #dd4814;background-color:#fff;outline:none}.small-icon{width:12px}.images-info{text-align:center;padding:10px}.images-warning{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;margin:0 0 10px;box-shadow:0 1px 1px rgba(0,0,0,0.1);border:1px solid #EEE;background-image:url("../img/icons/warning.png");background-image:url("../img/icons/warning.svg"),none}#loader{width:10px;margin:16px auto 0 auto}#importing{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;margin:0 0 10px;box-shadow:0 1px 1px rgba(0,0,0,0.1);border:1px solid #EEE;position:relative}#importing .spinner{position:absolute;left:15px}.importing-dot{opacity:0;-webkit-animation:dot 1.3s infinite;animation:dot 1.3s infinite}.selector{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;padding:20px;background:#FFF;margin:0 0 20px;box-shadow:0 1px 1px rgba(0,0,0,0.1);border:1px solid #EEE;width:100%;float:left}.selector h2{font-size:1em;font-weight:300}.selector h2 img{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;background:url("../img/icons/help.svg") no-repeat;width:16px;height:16px;padding-left:16px;margin-left:5px}.selector .selector-available,.selector .selector-chosen{width:46%;float:left;margin:0;text-align:left}@media screen and (max-width: 768px){.selector .selector-available,.selector .selector-chosen{width:100%}}.selector .selector-available h2,.selector .selector-chosen h2{background:none;border:none}.selector .selector-available select,.selector .selector-chosen select{margin-bottom:10px}.selector ul.selector-chooser{width:8%;float:left;margin:20% 0 0}@media screen and (max-width: 768px){.selector ul.selector-chooser{width:100%;margin:0 0 10px;text-align:center}}.selector ul.selector-chooser li{width:100%;text-align:center}@media screen and (max-width: 768px){.selector ul.selector-chooser li{width:auto;display:inline-block;height:16px;width:16px;margin:0 20px}}.selector ul.selector-chooser li a{display:block;text-indent:999em;width:16px;height:16px;overflow:hidden;margin:0 auto}.selector ul.selector-chooser li a.selector-add{background-image:url("../img/icons/chevron_right.svg")}@media screen and (max-width: 768px){.selector ul.selector-chooser li a.selector-add{background-image:url("../img/icons/chevron_down.svg")}}.selector ul.selector-chooser li a.selector-remove{background-image:url("../img/icons/chevron_left.svg")}@media screen and (max-width: 768px){.selector ul.selector-chooser li a.selector-remove{background-image:url("../img/icons/chevron_up.svg")}}.selector .selector-filter img{display:none}.selector .selector-filter input{background-image:url("../img/search-orange.png");background-repeat:no-repeat;background-position:top 7px right 8px}.selector select#id_mac_addresses_to.filtered{height:269px !important}.nodes{position:relative}.nodes .search{position:absolute;right:0}.nodes .search input[type='submit']{position:absolute;top:8px;right:12px;background-color:transparent;background-image:url("../img/search-icon.svg");background-repeat:no-repeat;text-indent:-999em;display:block;width:21px;height:20px;overflow:hidden;outline:none;padding:0}.nodes .search input[type='submit']:hover{color:transparent;background-color:transparent;background-image:url("../img/search-icon.svg");background-repeat:no-repeat}@media screen and (max-width: 768px){.nodes .search{position:relative}}@media screen and (max-width: 768px){.nodes .actions select{width:100%;margin-bottom:20px}.nodes .actions input{position:absolute;right:0;top:0}}.powerstates{width:14px;height:15px;display:inline-block}.powerstates.power-on{background:transparent url("../img/icons/power-on.svg") left top no-repeat}.powerstates.power-off{background:transparent url("../img/icons/power-off.svg") left top no-repeat}.powerstates.power-unknown{background:none}.powerstates.power-error{background:transparent url("../img/icons/power-error.svg") left top no-repeat}.powerstates.power-check-ok{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;width:10px;height:10px;color:#33CC00}.powerstates.power-check-error{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;width:10px;height:10px;color:#FF0000}.node-actions .link-cta-ubuntu,.node-actions .cta-ubuntu{margin-bottom:10px;float:left;font-size:16px}.buttons{margin-top:30px}#network-interfaces li{list-style-type:none}#content-discovery-data{padding-top:20px;margin-top:20px;border-top:1px dotted #B2B2B2}#content-discovery-data .slider{height:0;overflow:hidden}.slider{padding-top:0 !important}.slider .content{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;box-shadow:0 1px 1px rgba(0,0,0,0.1);background:#FFF;border:1px solid #EEE;border-top:none;padding:20px}.slider .content pre{margin:0}.slider .tabs{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;padding:8px 20px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;border:1px solid #EEE}.add-machine__list{padding:13px 0 20px;border-top:1px dotted #888;margin-bottom:0}.add-machine__list .add-machine__details{background:transparent url("../img/icons/accordion-open.svg") top 12px right 10px no-repeat}.add-machine__list .add-machine__details>div{margin-bottom:0}.add-machine__list .add-machine__details .add-machine__details-form{display:none}.add-machine__list .add-machine__details.active{background-image:url("../img/icons/accordion-close.svg")}.add-machine__list .add-machine__details.active .add-machine__details-form{display:block}.power-status{display:inline-block;font-size:100%;padding-left:0}.power-status--power{display:inline-block;margin-left:20px;position:relative;font-size:100%}.power-status--power.checking{color:#2AB7EC;background:url("../img/status_in_progress.svg");padding-left:20px}.power-status--power.on{padding-left:20px;color:#38B44A;background:transparent url("../img/icons/power-on.svg") left top 4px no-repeat}.power-status--power.off{padding-left:20px;color:#D2D2D2;background:transparent url("../img/icons/power-off.svg") left top 4px no-repeat}.power-status--power.error{padding-left:20px;color:#DB3832;background:transparent url("../img/icons/power-error.svg") left top 4px no-repeat}.power-status--power .power-check{font-size:0.75em;color:#D2D2D2;display:inline-block;padding:0}.power-status--power .power-check .power-check__link{color:#888;text-decoration:none;margin-left:5px}.power-status--power .power-check .power-check__link:hover{border-bottom:0 !important;text-decoration:underline !important}.loading,.loader{background:url("../img/in_progress.png") no-repeat;background-size:16px 16px;width:16px;height:16px;-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;animation:spin 1s infinite linear;padding:0;display:inline-block}.details__used{color:#BCBCBC}.details .details__label{clear:both;display:block;margin-top:11px;color:#BCBCBC}.details .details__label a{color:#BCBCBC}.details .details__label a:hover{color:#dd4814}.details .details__label.active a{color:#dd4814}.details .details__controls{width:100%;text-align:right;opacity:0;z-index:-1000}.details .details__controls--secondary{opacity:0;z-index:-1000;width:auto;text-align:left}.details .table-row .details__input{display:inline-block;margin:-7px 0 -8px -14px;background-color:transparent;border-color:transparent;background-position:-9999px -9999px}.details .table-row .details__text{line-height:37px}.details .table-row:hover .details__input{background-color:#FFF;border-color:#D2D2D2;background-position:right 10px top 16px}.details .table-row:hover .details__controls{z-index:1;opacity:1}.details .table-row:hover .details__controls--secondary{z-index:1;opacity:1}.details .table-row.active:hover .details__input{background-color:transparent;border-color:transparent;pointer-events:none;background-position:-9999px -9999px}.details .table-row.active:hover .details__controls{opacity:0;z-index:-1000;pointer-events:none}.details .table-row.active:hover .details__controls--secondary{z-index:-1000;opacity:0;pointer-events:none}.details .table-row label{font-size:13px;color:#BCBCBC}.details .table-row input,.details .table-row select{margin:0 0 0 -14px}.details .table-row input[type="radio"]{margin-left:0}.details .details__dropdown .details__row{border-bottom:0;position:relative}.details .details__dropdown .details__row:before{display:block;margin:0 auto;width:calc(100% - 20px);border-top:1px dotted #B2B2B2;position:relative;height:1px;content:''}.details .details__dropdown .details__row.details__row--head{border-bottom:0}.details .details__dropdown .details__row.details__row--head .table-cell{color:#BCBCBC;font-size:13px}.details .details__dropdown .details__row.no-border{border:0}.details .details__dropdown .details__row.no-border:before{border:0}.details .details__dropdown--info .table-row{border-bottom:0}.details .details__dropdown--info .table-cell{color:#BCBCBC}
1388+=======
1389+.fake{display:none}body{font-size:14px}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col,.col{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;clear:none;display:inline-block;float:none;margin-right:2.12766%;margin-bottom:20px;position:relative;width:100%}.twelve-col .one-col,.twelve-col .two-col,.twelve-col .three-col,.twelve-col .four-col,.twelve-col .five-col,.twelve-col .six-col,.twelve-col .seven-col,.twelve-col .eight-col,.twelve-col .nine-col,.twelve-col .ten-col,.twelve-col .eleven-col{width:100%}.last-col,.last{margin-right:0}.clearfix:after,.container:after{clear:both;content:"\0020";display:block;height:0;overflow:hidden;visibility:hidden}.clear{clear:both}.clearfix{display:block}@media only screen and (min-width: 768px){body{font-size:15px}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col,.col{float:left}.one-col{width:6.38297%}.two-col{width:14.89361%}.three-col{width:23.40425%}.four-col{width:31.91489%}.five-col{width:40.42553%}.six-col{width:48.93617%}.seven-col{width:57.4468%}.eight-col{width:65.95744%}.nine-col{width:74.46808%}.ten-col{width:82.97872%}.eleven-col{width:91.48936%}.twelve-col{width:100%;margin-right:0}.twelve-col .one-col{width:6.3053%;margin-right:2.21238%}.twelve-col .two-col{width:14.823%;margin-right:2.21238%}.twelve-col .three-col{width:23.3407%;margin-right:2.21238%}.twelve-col .three-col{width:48.8938%;margin-right:2.21238%}.twelve-col .four-col{width:31.8584%;margin-right:2.21238%}.twelve-col .five-col{width:40.3761%;margin-right:2.21238%}.twelve-col .six-col{width:48.8938%;margin-right:2.21238%}.twelve-col .seven-col{width:57.4115%;margin-right:2.21238%}.twelve-col .eight-col{width:65.9292%;margin-right:2.21238%}.twelve-col .nine-col{width:74.4469%;margin-right:2.21238%}.twelve-col .ten-col{width:82.9646%;margin-right:2.21238%}.twelve-col .eleven-col{width:91.4823%;margin-right:2.21238%}.twelve-col .twelve-col{width:100%;margin-right:0}.eleven-col .one-col{width:6.89238%;margin-right:2.41837%}.eleven-col .two-col{width:16.20314%;margin-right:2.41837%}.eleven-col .three-col{width:25.5139%;margin-right:2.41837%}.eleven-col .four-col{width:34.82466%;margin-right:2.41837%}.eleven-col .five-col{width:44.13542%;margin-right:2.41837%}.eleven-col .six-col{width:53.44619%;margin-right:2.41837%}.eleven-col .seven-col{width:62.75695%;margin-right:2.41837%}.eleven-col .eight-col{width:72.06771%;margin-right:2.41837%}.eleven-col .nine-col{width:81.37847%;margin-right:2.41837%}.eleven-col .ten-col{width:90.68923%;margin-right:2.41837%}.eleven-col .eleven-col{width:100%;margin-right:0}.ten-col .one-col{width:7.6%;margin-right:2.66666%}.ten-col .two-col{width:17.86666%;margin-right:2.66666%}.ten-col .three-col{width:28.13333%;margin-right:2.66666%}.ten-col .four-col{width:38.4%;margin-right:2.66666%}.ten-col .five-col{width:48.66666%;margin-right:2.66666%}.ten-col .six-col{width:58.93333%;margin-right:2.66666%}.ten-col .seven-col{width:69.19999%;margin-right:2.66666%}.ten-col .eight-col{width:79.46666%;margin-right:2.66666%}.ten-col .nine-col{width:89.73333%;margin-right:2.66666%}.ten-col .ten-col{width:100%;margin-right:0}.nine-col .one-col{width:8.46953%;margin-right:2.97176%}.nine-col .two-col{width:19.91084%;margin-right:2.97176%}.nine-col .three-col{width:31.35215%;margin-right:2.97176%}.nine-col .four-col{width:42.79346%;margin-right:2.97176%}.nine-col .five-col{width:54.23476%;margin-right:2.97176%}.nine-col .six-col{width:65.67607%;margin-right:2.97176%}.nine-col .seven-col{width:77.11738%;margin-right:2.97176%}.nine-col .eight-col{width:88.55869%;margin-right:2.97176%}.nine-col .nine-col{width:100%;margin-right:0}.eight-col .one-col{width:9.56375%;margin-right:3.3557%}.eight-col .two-col{width:22.48322%;margin-right:3.3557%}.eight-col .three-col{width:35.40268%;margin-right:3.3557%}.eight-col .four-col{width:48.32214%;margin-right:3.3557%}.eight-col .five-col{width:61.24161%;margin-right:3.3557%}.eight-col .six-col{width:74.16107%;margin-right:3.3557%}.eight-col .seven-col{width:87.08053%;margin-right:3.3557%}.eight-col .eight-col{width:100%;margin-right:0}.seven-col .one-col{width:10.98265%;margin-right:3.85356%}.seven-col .two-col{width:25.81888%;margin-right:3.85356%}.seven-col .three-col{width:40.6551%;margin-right:3.85356%}.seven-col .four-col{width:55.49132%;margin-right:3.85356%}.seven-col .five-col{width:70.32755%;margin-right:3.85356%}.seven-col .six-col{width:85.16377%;margin-right:3.85356%}.seven-col .seven-col{width:100%;margin-right:0}.six-col .one-col{width:12.89592%;margin-right:4.52488%}.six-col .two-col{width:30.31674%;margin-right:4.52488%}.six-col .three-col{width:47.73755%;margin-right:4.52488%}.six-col .four-col{width:65.15837%;margin-right:4.52488%}.six-col .five-col{width:82.57918%;margin-right:4.52488%}.six-col .six-col{width:100%;margin-right:0}.five-col .one-col{width:15.61643%;margin-right:5.47945%}.five-col .two-col{width:36.71232%;margin-right:5.47945%}.five-col .three-col{width:57.80821%;margin-right:5.47945%}.five-col .four-col{width:78.9041%;margin-right:5.47945%}.five-col .five-col{width:100%;margin-right:0}.four-col .one-col{width:19.79166%;margin-right:6.94444%}.four-col .two-col{width:46.52777%;margin-right:6.94444%}.four-col .three-col{width:73.26388%;margin-right:6.94444%}.four-col .four-col{width:100%;margin-right:0}.three-col .one-col{width:27.01421%;margin-right:9.47867%}.three-col .two-col{width:63.5071%;margin-right:9.47867%}.three-col .three-col{width:100%;margin-right:0}.two-col .one-col{width:42.53731%;margin-right:14.92537%}.two-col .two-col{width:100%;margin-right:0}.one-col .one-col{width:100%;margin-right:0}.twelve-col .last-col{margin-right:0}.eleven-col .last-col{margin-right:0}.ten-col .last-col{margin-right:0}.nine-col .last-col{margin-right:0}.eight-col .last-col{margin-right:0}.seven-col .last-col{margin-right:0}.six-col .last-col{margin-right:0}.five-col .last-col{margin-right:0}.four-col .last-col{margin-right:0}.three-col .last-col{margin-right:0}.two-col .last-col{margin-right:0}.one-col .last-col{margin-right:0}.row,#context-footer{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;margin:0;padding:40px 40px 20px}.row:after{content:".";visibility:hidden;display:block;height:0;clear:both}.row-feature{background:none}.container{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:20px 20px 0;width:100%}.append-one{margin-right:8.51063%}.append-two{margin-right:17.02127%}.append-three{margin-right:25.53191%}.append-four{margin-right:34.04255%}.append-five{margin-right:42.55319%}.append-six{margin-right:51.06383%}.append-seven{margin-right:59.57446%}.append-eight{margin-right:68.0851%}.append-nine{margin-right:76.59574%}.append-ten{margin-right:85.10638%}.append-eleven{margin-right:93.61702%}.prepend-one{margin-left:8.51063%}.prepend-two{margin-left:17.02127%}.prepend-three{margin-left:25.53191%}.prepend-four{margin-left:34.04255%}.prepend-five{margin-left:42.55319%}.prepend-six{margin-left:51.06383%}.prepend-seven{margin-left:59.57446%}.prepend-eight{margin-left:68.0851%}.prepend-nine{margin-left:76.59574%}.prepend-ten{margin-left:85.10638%}.prepend-eleven{margin-left:93.61702%}.push-one{margin-left:57px}.pull-one,.pull-two,.pull-three,.pull-four,.pull-five,.pull-six,.pull-seven,.pull-eight,.pull-nine,.pull-ten,.pull-eleven{float:left;position:relative}.pull-one{margin-left:-6.38297%}.pull-two{margin-left:-17.02127%}.pull-three{margin-left:-25.53191%}.pull-four{margin-left:-34.04255%}.pull-five{margin-left:-34.04255%}.pull-six{margin-left:-51.06383%}.pull-seven{margin-left:-59.57446%}.pull-eight{margin-left:-68.0851%}.pull-nine{margin-left:-76.59574%}.pull-ten{margin-left:-85.10638%}.pull-eleven{margin-left:-93.61702%}.push-1,.push-two,.push-three,.push-four,.push-five,.push-six,.push-seven,.push-eight,.push-nine,.push-ten,.push-eleven{float:left;position:relative}.push-one{margin:0 -8.51063% 0 8.51063%}.push-two{margin:0 -19.14893% 0 19.14893%}.push-three{margin:0 -27.65957% 0 27.65957%}.push-four{margin:0 -36.17021% 0 36.17021%}.push-five{margin:0 -36.17021% 0 36.17021%}.push-six{margin:0 -53.19149% 0 53.19149%}.push-seven{margin:0 -61.70212% 0 61.70212%}.push-eight{margin:0 -70.21276% 0 70.21276%}.push-nine{margin:0 -78.7234% 0 78.7234%}.push-ten{margin:0 -87.23404% 0 87.23404%}.push-eleven{margin:0 -95.74468% 0 95.74468%}}@media only screen and (min-width: 984px){body{font-size:16px}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col,.col{float:left}.one-col{width:6.38297%}.two-col{width:14.89361%}.three-col{width:23.40425%}.four-col{width:31.91489%}.five-col{width:40.42553%}.six-col{width:48.93617%}.seven-col{width:57.4468%}.eight-col{width:65.95744%}.nine-col{width:74.46808%}.ten-col{width:82.97872%}.eleven-col{width:91.48936%}.three-col:nth-child(1):nth-last-child(4),.three-col:nth-child(2):nth-last-child(3),.three-col:nth-child(3):nth-last-child(2),.three-col:nth-child(4):nth-last-child(1){width:23.36%}.three-col:nth-of-type(2){margin-right:2.21238%}.twelve-col{width:100%;margin-right:0}.twelve-col .one-col{width:6.3053%;margin-right:2.21238%}.twelve-col .two-col{width:14.823%;margin-right:2.21238%}.twelve-col .three-col{width:23.3407%;margin-right:2.21238%}.twelve-col .three-col:nth-child(1):nth-last-child(4),.twelve-col .three-col:nth-child(2):nth-last-child(3),.twelve-col .three-col:nth-child(3):nth-last-child(2),.twelve-col .three-col:nth-child(4):nth-last-child(1){width:23.3407%}.twelve-col .three-col:nth-of-type(2){margin-right:2.21238%}.twelve-col .four-col{width:31.8584%;margin-right:2.21238%}.twelve-col .five-col{width:40.3761%;margin-right:2.21238%}.twelve-col .six-col{width:48.8938%;margin-right:2.21238%}.twelve-col .seven-col{width:57.4115%;margin-right:2.21238%}.twelve-col .eight-col{width:65.9292%;margin-right:2.21238%}.twelve-col .nine-col{width:74.4469%;margin-right:2.21238%}.twelve-col .ten-col{width:82.9646%;margin-right:2.21238%}.twelve-col .eleven-col{width:91.4823%;margin-right:2.21238%}.twelve-col .twelve-col{width:100%;margin-right:0}.eleven-col .one-col{width:6.89238%;margin-right:2.41837%}.eleven-col .two-col{width:16.20314%;margin-right:2.41837%}.eleven-col .three-col{width:25.5139%;margin-right:2.41837%}.eleven-col .four-col{width:34.82466%;margin-right:2.41837%}.eleven-col .five-col{width:44.13542%;margin-right:2.41837%}.eleven-col .six-col{width:53.44619%;margin-right:2.41837%}.eleven-col .seven-col{width:62.75695%;margin-right:2.41837%}.eleven-col .eight-col{width:72.06771%;margin-right:2.41837%}.eleven-col .nine-col{width:81.37847%;margin-right:2.41837%}.eleven-col .ten-col{width:90.68923%;margin-right:2.41837%}.eleven-col .eleven-col{width:100%;margin-right:0}.ten-col .one-col{width:7.6%;margin-right:2.66666%}.ten-col .two-col{width:17.86666%;margin-right:2.66666%}.ten-col .three-col{width:28.13333%;margin-right:2.66666%}.ten-col .four-col{width:38.4%;margin-right:2.66666%}.ten-col .five-col{width:48.66666%;margin-right:2.66666%}.ten-col .six-col{width:58.93333%;margin-right:2.66666%}.ten-col .seven-col{width:69.19999%;margin-right:2.66666%}.ten-col .eight-col{width:79.46666%;margin-right:2.66666%}.ten-col .nine-col{width:89.73333%;margin-right:2.66666%}.ten-col .ten-col{width:100%;margin-right:0}.nine-col .one-col{width:8.46953%;margin-right:2.97176%}.nine-col .two-col{width:19.91084%;margin-right:2.97176%}.nine-col .three-col{width:31.35215%;margin-right:2.97176%}.nine-col .four-col{width:42.79346%;margin-right:2.97176%}.nine-col .five-col{width:54.23476%;margin-right:2.97176%}.nine-col .six-col{width:65.67607%;margin-right:2.97176%}.nine-col .seven-col{width:77.11738%;margin-right:2.97176%}.nine-col .eight-col{width:88.55869%;margin-right:2.97176%}.nine-col .nine-col{width:100%;margin-right:0}.eight-col .one-col{width:9.56375%;margin-right:3.3557%}.eight-col .two-col{width:22.48322%;margin-right:3.3557%}.eight-col .three-col{width:35.40268%;margin-right:3.3557%}.eight-col .four-col{width:48.32214%;margin-right:3.3557%}.eight-col .five-col{width:61.24161%;margin-right:3.3557%}.eight-col .six-col{width:74.16107%;margin-right:3.3557%}.eight-col .seven-col{width:87.08053%;margin-right:3.3557%}.eight-col .eight-col{width:100%;margin-right:0}.seven-col .one-col{width:10.98265%;margin-right:3.85356%}.seven-col .two-col{width:25.81888%;margin-right:3.85356%}.seven-col .three-col{width:40.6551%;margin-right:3.85356%}.seven-col .four-col{width:55.49132%;margin-right:3.85356%}.seven-col .five-col{width:70.32755%;margin-right:3.85356%}.seven-col .six-col{width:85.16377%;margin-right:3.85356%}.seven-col .seven-col{width:100%;margin-right:0}.six-col .one-col{width:12.89592%;margin-right:4.52488%}.six-col .two-col{width:30.31674%;margin-right:4.52488%}.six-col .three-col{width:47.73755%;margin-right:4.52488%}.six-col .four-col{width:65.15837%;margin-right:4.52488%}.six-col .five-col{width:82.57918%;margin-right:4.52488%}.six-col .six-col{width:100%;margin-right:0}.five-col .one-col{width:15.61643%;margin-right:5.47945%}.five-col .two-col{width:36.71232%;margin-right:5.47945%}.five-col .three-col{width:57.80821%;margin-right:5.47945%}.five-col .four-col{width:78.9041%;margin-right:5.47945%}.five-col .five-col{width:100%;margin-right:0}.four-col .one-col{width:19.79166%;margin-right:6.94444%}.four-col .two-col{width:46.52777%;margin-right:6.94444%}.four-col .three-col{width:73.26388%;margin-right:6.94444%}.four-col .four-col{width:100%;margin-right:0}.three-col .one-col{width:27.01421%;margin-right:9.47867%}.three-col .two-col{width:63.5071%;margin-right:9.47867%}.three-col .three-col{width:100%;margin-right:0}.two-col .one-col{width:42.53731%;margin-right:14.92537%}.two-col .two-col{width:100%;margin-right:0}.one-col .one-col{width:100%;margin-right:0}.twelve-col .last-col{margin-right:0}.eleven-col .last-col{margin-right:0}.ten-col .last-col{margin-right:0}.nine-col .last-col{margin-right:0}.eight-col .last-col{margin-right:0}.seven-col .last-col{margin-right:0}.six-col .last-col{margin-right:0}.five-col .last-col{margin-right:0}.four-col .last-col{margin-right:0}.three-col .last-col{margin-right:0}.two-col .last-col{margin-right:0}.one-col .last-col{margin-right:0}.row,#context-footer{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;margin:0;padding:40px 40px 20px}.row:after{content:".";visibility:hidden;display:block;height:0;clear:both}.row-feature{background:none}.container{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:20px 20px 0;width:100%}.append-one{margin-right:8.51063%}.append-two{margin-right:17.02127%}.append-three{margin-right:25.53191%}.append-four{margin-right:34.04255%}.append-five{margin-right:42.55319%}.append-six{margin-right:51.06383%}.append-seven{margin-right:59.57446%}.append-eight{margin-right:68.0851%}.append-nine{margin-right:76.59574%}.append-ten{margin-right:85.10638%}.append-eleven{margin-right:93.61702%}.prepend-one{margin-left:8.51063%}.prepend-two{margin-left:17.02127%}.prepend-three{margin-left:25.53191%}.prepend-four{margin-left:34.04255%}.prepend-five{margin-left:42.55319%}.prepend-six{margin-left:51.06383%}.prepend-seven{margin-left:59.57446%}.prepend-eight{margin-left:68.0851%}.prepend-nine{margin-left:76.59574%}.prepend-ten{margin-left:85.10638%}.prepend-eleven{margin-left:93.61702%}.push-one{margin-left:57px}.pull-one,.pull-two,.pull-three,.pull-four,.pull-five,.pull-six,.pull-seven,.pull-eight,.pull-nine,.pull-ten,.pull-eleven{float:left;position:relative}.pull-one{margin-left:-6.38297%}.pull-two{margin-left:-17.02127%}.pull-three{margin-left:-25.53191%}.pull-four{margin-left:-34.04255%}.pull-five{margin-left:-34.04255%}.pull-six{margin-left:-51.06383%}.pull-seven{margin-left:-59.57446%}.pull-eight{margin-left:-68.0851%}.pull-nine{margin-left:-76.59574%}.pull-ten{margin-left:-85.10638%}.pull-eleven{margin-left:-93.61702%}.push-1,.push-two,.push-three,.push-four,.push-five,.push-six,.push-seven,.push-eight,.push-nine,.push-ten,.push-eleven{float:left;position:relative}.push-one{margin:0 -8.51063% 0 8.51063%}.push-two{margin:0 -19.14893% 0 19.14893%}.push-three{margin:0 -27.65957% 0 27.65957%}.push-four{margin:0 -36.17021% 0 36.17021%}.push-five{margin:0 -36.17021% 0 36.17021%}.push-six{margin:0 -53.19149% 0 53.19149%}.push-seven{margin:0 -61.70212% 0 61.70212%}.push-eight{margin:0 -70.21276% 0 70.21276%}.push-nine{margin:0 -78.7234% 0 78.7234%}.push-ten{margin:0 -87.23404% 0 87.23404%}.push-eleven{margin:0 -95.74468% 0 95.74468%}}html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,ol,ul,li,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,menu,nav,output,ruby,section,summary,time,mark,audio,video{border:0;margin:0;padding:0;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:300;src:url("../fonts/ubuntu-l-webfont.eot");src:url("../fonts/ubuntu-l-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-l-webfont.woff") format("woff"),url("../fonts/ubuntu-l-webfont.ttf") format("truetype"),url("../fonts/ubuntu-l-webfont.svg#ubuntulight") format("svg")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:400;src:local("Ubuntu");src:url("../fonts/ubuntu-r-webfont.eot");src:url("../fonts/ubuntu-r-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-r-webfont.woff") format("woff"),url("../fonts/ubuntu-r-webfont.ttf") format("truetype"),url("../fonts/ubuntu-r-webfont.svg#ubunturegular") format("svg")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:500;src:url("../fonts/ubuntu-m-webfont.eot");src:local("Ubuntu Medium"),local("Ubuntu-Medium"),url("../fonts/ubuntu-m-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-m-webfont.woff") format("woff"),url("../fonts/ubuntu-m-webfont.ttf") format("truetype"),url("../fonts/ubuntu-m-webfont.svg#ubuntumedium") format("svg")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:700;src:url("../fonts/ubuntu-b-webfont.eot");src:local("Ubuntu Bold"),local("Ubuntu-Bold"),url("../fonts/ubuntu-b-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-b-webfont.woff") format("woff"),url("../fonts/ubuntu-b-webfont.ttf") format("truetype"),url("../fonts/ubuntu-b-webfont.svg#ubuntubold") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:300;src:url("../fonts/ubuntu-li-webfont.eot");src:local("Ubuntu Light Italic"),local("Ubuntu-LightItalic"),url("../fonts/ubuntu-li-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-li-webfont.woff") format("woff"),url("../fonts/ubuntu-li-webfont.ttf") format("truetype"),url("../fonts/ubuntu-li-webfont.svg#ubuntulight_italic") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:400;src:local("Ubuntu Italic"),local("Ubuntu-Italic"),url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/GZMdC02DTXXx8AdUvU2etw.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:500;src:url("../fonts/ubuntu-mi-webfont.eot");src:local("Ubuntu Medium Italic"),local("Ubuntu-MediumItalic"),url("../fonts/ubuntu-mi-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/ubuntu-mi-webfont.woff") format("woff"),url("../fonts/ubuntu-mi-webfont.ttf") format("truetype"),url("../fonts/ubuntu-mi-webfont.svg#ubuntumedium_italic") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:700;src:local("Ubuntu Bold Italic"),local("Ubuntu-BoldItalic"),url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/pqisLQoeO9YTDCNnlQ9bfz8E0i7KZn-EPnyo3HZu7kw.woff") format("woff")}html{font-size:100%}body{color:#333;font-family:Ubuntu, Arial, "libra sans", sans-serif;font-weight:300}blockquote,q{quotes:none}blockquote{margin:28px 20px}blockquote:before,blockquote:after,q:before,q:after{content:"";content:none}legend{border:0;*margin-left:-7px}figure{margin:0}abbr,acronym{cursor:help}a:focus{outline:thin dotted}a:hover,a:active{outline:0}a:link,a:visited{color:#dd4814;text-decoration:none}a:hover,a:active,a:focus{text-decoration:underline}a.link-arrow:after{content:"\0000a0›"}nav ul li h2 a:after{content:"\0000a0›"}nav ul li a:after,.carousel ul li a:after,ul li p a:after{content:""}ol,ul{margin-left:20px;margin-bottom:20px}ol ol,ul ul,ol ul,ul ol{margin-bottom:0}nav ul,nav ol{list-style:none;list-style-image:none}svg:not(:root){overflow:hidden}img{border:0;height:auto;max-width:100%}img.left{margin-right:20px}img.right{margin-left:20px}.middle img{vertical-align:middle;margin-top:4em}h1,h2,h3,h4,h5,h6{font-weight:300;line-height:1.3}h1{font-size:1.625em;margin-bottom:.5em}h2{font-size:1.438em;margin-bottom:.5em}h3{font-size:1.219em;margin-bottom:.522em}h4{font-size:1.25em;font-weight:400;margin-bottom:.615em}h5{font-size:1em;font-weight:700;margin-bottom:1em}h6{font-size:.723em;font-weight:400;margin-bottom:1em;letter-spacing:.1em;text-transform:uppercase}p,li{font-size:1em;line-height:1.5;margin:0;margin-bottom:.75em;padding:0}h2 span,h1 span{display:block}p+h2,ul+h2,ol+h2,pre+h2{margin-top:0.5625em}header nav a:link{font-weight:normal}p+h3,ul+h3,ol+h3,pre+h3{margin-top:0.78261em}p+h4,ul+h4,ol+h4,pre+h4{margin-top:1.39286em}ol+h2,p+h2,pre+h2,ul+h2{margin-top:.563em}ol+h3,p+h3,pre+h3,ul+h3{margin-top:.783em}ol+h4,p+h4,pre+h4,ul+h4{margin-top:1.219em}li{margin-bottom:.4em}li:last-of-type{margin-bottom:0}ins{background:#fffbeb;text-decoration:none}small,.smaller{font-size:13px}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{vertical-align:text-top}sub{vertical-align:text-bottom}dfn{font-style:italic}mark{background:#ff0;color:#000}code,pre{font-family:"Ubuntu Mono", "Consolas", "Monaco", "Lucida Console", "Courier New", Courier, monospace}pre{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fdf6f2;padding:0.6em 1em;white-space:pre-wrap;word-wrap:break-word}blockquote{margin:0}blockquote>p{font-size:0.92857em;margin-bottom:0.92308em;font-weight:100;margin:0 0 0.4em 0}blockquote small{font-size:.813em;line-height:1.4}button,input,select,textarea{font-family:Ubuntu,Arial,"libra sans",sans-serif;margin:0;vertical-align:baseline;*vertical-align:middle}select{font-size:1em;font-weight:300}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="search"]{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-moz-box-sizing:content-box;-webkit-appearance:none;-webkit-box-sizing:content-box;box-sizing:content-box;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-weight:300;outline:none;padding:0.69565em 0.86957em}input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}form fieldset{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-repeat:no-repeat;background-color:#EFEEEC;background-position:-15px -15px;border:0;margin-bottom:8px;padding:15px 20px}form fieldset h3{border-bottom:1px dotted #dfdcd9;margin-bottom:9px;padding-bottom:10px}form fieldset li:first-child{margin-top:0}form input[type="text"],form input[type="email"],form input[type="tel"],form textarea{-webkit-appearance:none;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;background:#fff;border:1px solid #999;display:block;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-size:1em;font-weight:300;padding:0.69565em 0.86957em}form input:focus,form textarea:focus{border:1px solid #dd4814}form textarea[readonly='readonly']{color:#999}form input[type="checkbox"],form input[type="radio"]{margin:0;width:auto}form input[type="checkbox"]+label,form input[type="radio"]+label{display:inline;margin-left:5px;vertical-align:middle;width:auto}form input[type="submit"]{font-size:1.14286em;margin-bottom:0.75em;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background-color:#dd4814;background-image:-moz-linear-gradient(#f26120, #dd4814);background-image:-webkit-gradient(linear, 0% 0%, 0% 100%, from(#f26120), to(#dd4814));background-image:-webkit-linear-gradient(#f26120, #dd4814);background-image:-o-linear-gradient(#f26120, #dd4814);-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;border:0;color:#fff;display:block;padding:10px 14px;text-shadow:none;width:auto;margin-bottom:0}form input[type="submit"]:hover{background:#dd4814}form label{cursor:pointer;display:block;margin-bottom:4px}form label span{color:#df382c}form ul{margin-left:0}form li{list-style:none outside none;margin-top:14px}form button[type="submit"]{border:0;display:inline-block;font-family:Ubuntu, Arial, "libra sans", sans-serif;text-decoration:none;font-weight:300}form input[type="reset"]{display:none}table{border-collapse:collapse;border-spacing:0;overflow-x:scroll;margin-bottom:20px;margin:0 0 2.85714em 0;width:100%}table th,table td{padding:15px 10px;background:#f0edea;border:1px dotted #888888}table td{text-align:center;vertical-align:middle}table thead th{border-collapse:separate;border-spacing:0 10px;background:#fee3d2;color:#333333;font-weight:normal}table tbody th{text-align:left;font-weight:normal;font-weight:300}table th[scope="col"]{text-align:center}table thead th:first-of-type{text-align:left}@media only screen and (max-width: 768px){table{display:block}}@media only screen and (min-width: 984px){form fieldset{padding:15px 20px}img{max-width:none}}.audience-consumer{color:#333333}.audience-consumer .row-box,.audience-consumer .main-content{color:#333333}.audience-consumer .inner-wrapper{background:#fff}.audience-consumer .quote-right-top{padding:60px 60px 0 40px;background:url("/sites/ubuntu/latest/u/img/patterns/quote-orange-br-287x287.png") no-repeat;height:287px;position:absolute;right:-40px;text-align:left;top:-90px;width:31.91489%}.audience-consumer .quote-right-top p{font-size:1.14286em;margin-bottom:0.75em;margin:0.769em;padding-bottom:0;color:#fff}.audience-consumer .quote-right-top p cite{font-size:0.85714em;margin-bottom:1em;color:#fff;padding:0}.audience-consumer .quote-right-top p a,.audience-consumer .quote-right p a{color:#fff}.audience-consumer .quote-right{font-size:1.28571em;margin-bottom:0.66667em;color:#fff;padding:50px 100px 0 50px;text-indent:-6px;background:url("/sites/ubuntu/latest/u/img/patterns/quote-orange-bl-287x287.png") no-repeat;min-height:287px;position:absolute;right:-20px;text-align:left;top:-90px;width:21.2006% em}.audience-consumer .quote-right cite{font-style:normal;margin-left:6px}.audience-consumer .quote-right-alt{background:url(/sites/ubuntu/latest/u/img/patterns/quote-white-br-360x360.png) 0 -100px no-repeat;color:#dd4814;padding:50px 50px 0 50px}.audience-consumer .quote-right-right{background:url("/sites/ubuntu/latest/u/img/patterns/quote-orange-br-287x287.png") no-repeat}.audience-enterprise h1{margin:0 0 18px 0}.audience-enterprise td{background:#fff}.audience-enterprise th,.audience-enterprise td{padding:6px 10px;background:#fff}.audience-enterprise th[scope="col"]{background:#E2D4DC;color:#772953}.audience-enterprise tbody th[rowspan]{background:#F7F2F6}.audience-enterprise tfoot th[rowspan]{background:#dfdcd9}.audience-enterprise tfoot td,.audience-enterprise tfoot th{font-weight:normal;background:#dfdcd9}.audience-enterprise .inner-wrapper{background:#2c001e;color:#fff}.audience-enterprise .row-box{background:#fff;color:#333333}.row-enterprise{background:#772953;color:#fff;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.row-enterprise .box,.row-enterprise div{background:#772953;color:#fff}.row-enterprise a{color:#fff}.enterprise-dot-pattern{background:url("/sites/ubuntu/latest/u/img/patterns/enterprise-dot-pattern.png")}.developer-dot-pattern{background:url("/sites/ubuntu/latest/u/img/patterns/developer-dot-pattern.png")}.wrapper,header.banner .nav-primary,nav div.footer-a div,.inline-lists ul,.legal{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:auto}.inner-wrapper{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;clear:both;display:block;float:left;width:100%;margin:0;padding-bottom:20px;position:relative;z-index:1}@media only screen and (min-width: 768px){.med-six-col .three-col{width:48%}.med-six-col .three-col:nth-of-type(2n){margin-right:0}}@media only screen and (min-width: 769px){.inner-wrapper{border-radius:4px;padding-bottom:20px}}@media only screen and (min-width: 984px){.wrapper{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;margin:0 auto;position:relative;text-align:left;width:984px}.inner-wrapper{-moz-box-shadow:0 0 3px #c9c9c9;-webkit-box-shadow:0 0 3px #c9c9c9;box-shadow:0 0 3px #c9c9c9;margin:10px 0 30px}.three-col,.med-six-col .three-col{width:23.30%}.three-col.last-col:nth-of-type(2n){margin-right:0}.med-six-col .three-col:nth-of-type(2n){margin-right:20px}.med-six-col .three-col.last-col{margin-right:0}}.left{float:left}.right{float:right}.caps{text-transform:uppercase}img{border:0 none;height:auto;max-width:100%}img.left{margin-right:0}img.touch-border{margin-bottom:-3px}.accessibility-aid,.off-left{position:absolute;left:-999em}a.external{-moz-background-size:0.7em 0.7em;-webkit-background-size:0.7em 0.7em;-o-background-size:0.7em 0.7em;background-size:0.7em 0.7em;padding-right:.9em;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/external-link-orange.svg");background-position:right 1px;background-repeat:no-repeat}.opera-mini a.external,.no-svg a.external{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/external-link-orange.png")}.text-center,.align-center{text-align:center}.no-margin{margin:0}.no-margin-bottom{margin-bottom:0}.no-padding-bottom{padding-bottom:0}.pull-left-20{margin-left:-20px}.pull-right-20{margin-right:-20px}.pull-left-40{margin-left:-40px}.pull-right-40{margin-right:-41px}.no-border{border:0}.link-top{font-size:1em;margin-bottom:0.85714em;clear:both;margin-bottom:40px;margin-top:-40px}.link-top a{background:#fff;margin-right:10px;margin-top:-17px;padding:5px;float:right}.pull-bottom-right{position:absolute;right:0;bottom:0;left:auto}.box .pull-bottom-right{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0}.pull-bottom-left{margin-left:-20px;margin-bottom:-21px}.pull-top-right{margin-left:-20px;margin-top:-21px}div.box-image-centered span img.priority-0,div.row-image-centered span img.priority-0,div.row.row-image-centered span img.priority-0,img.priority-0{position:absolute;left:-999em}.priority-0,.not-for-small{position:absolute;left:-999em}.video-container{position:relative;padding-bottom:56.25%;padding-top:30px;height:0;overflow:hidden}.video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}.video-container+h3,.video-container+.video-title{margin-top:20px}@media only screen and (max-width: 768px){.pull-right-40{margin-right:-30px}.pull-bottom-right,.pull-bottom-left{position:static}img.pull-bottom-left{margin-bottom:0;margin-left:0}}@media only screen and (min-width: 768px){div.box-image-centered span img.priority-0,div.row-image-centered span img.priority-0,div.row.row-image-centered span img.priority-0,img.priority-0{position:relative;left:auto}.priority-0,.not-for-small{position:relative;left:auto}.for-mobile,.for-small{position:absolute;left:-999em}.pull-right{float:right;margin-right:-30px}img.pull-left{margin-left:-30px}img.touch-border{float:left;margin-bottom:-30px}}@media only screen and (min-width: 769px){img.left{margin-right:20px}}@media only screen and (min-width: 984px){img.touch-border{float:left;margin-bottom:-40px}img.pull-left{margin-left:-40px}.pull-right{float:right;margin-right:-40px}.for-tablet,.for-medium{display:none}.no-border{border:0}}.caps-centered,.muted-heading{font-size:.875em;margin-bottom:20px;text-align:center;text-transform:uppercase}p.intro{font-size:1.14286em;margin-bottom:0.75em;line-height:1.4}.row div p:last-child,.row div ul:last-child{margin-bottom:0}.four-col p:last-child{margin-bottom:0}.note{color:#888888;font-size:.813em}@media only screen and (min-width: 768px){p.intro{font-size:1.13333em}}@media only screen and (min-width: 984px){h1{font-size:2.8125em}h2{font-size:2em;margin-bottom:.375em}h3{font-size:1.438em;margin-bottom:.522em}h4{font-size:1em;margin-bottom:.75em}h5{font-size:1em}p,li,code,pre{font-size:16px;line-height:1.5;margin-bottom:.75em}p.intro{font-size:1.25em}}header.banner{border-top:0;min-width:100%;width:auto;background:#dd4814;display:block;position:relative;z-index:2}header.banner .nav-primary{border:0;margin:0 auto;overflow:hidden}header.banner .nav-primary ul{border-right:1px solid #ed6637;float:left;margin:0;position:relative}header.banner .nav-primary ul li{border-left:1px solid #c64012;float:left;list-style-image:none;margin:0;text-indent:0;vertical-align:bottom}header.banner .nav-primary ul li:last-child{border-right:1px solid #c64012}header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited{font-size:14px;border-left:1px solid #ec5b29;color:#fff;display:block;margin-bottom:0;padding:14px 14px 13px;position:relative;text-align:center;text-decoration:none;-webkit-font-smoothing:subpixel-antialiased;-moz-font-smoothing:subpixel-antialiased;-o-font-smoothing:subpixel-antialiased;font-smoothing:subpixel-antialiased}header.banner .nav-primary ul a.active{background:#B83A10;border-left:1px solid #ec5b29}header.banner .nav-primary ul li a:hover{background:#e1662f;border-top:0;-moz-box-shadow:inset 0 2px 2px -2px #777;-webkit-box-shadow:inset 0 2px 2px -2px #777;box-shadow:inset 0 2px 2px -2px #777}#main-navigation-link{display:none}header.banner .nav-toggle{position:absolute;right:0;display:block;width:48px;height:48px;text-indent:-99999px;background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.svg);-moz-background-size:25px auto;-webkit-background-size:25px auto;-o-background-size:25px auto;background-size:25px auto;background-repeat:no-repeat;background-position:center center;cursor:pointer}header.banner .no-script{display:none}.opera-mini header.banner .nav-toggle,.no-svg header.banner .nav-toggle{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.png)}header.banner nav ul{background-color:#f0f0f0;display:none;float:left}header.banner .nav-primary.active{-moz-box-shadow:0 1px 2px 1px rgba(120,120,120,0.2);-webkit-box-shadow:0 1px 2px 1px rgba(120,120,120,0.2);box-shadow:0 1px 2px 1px rgba(120,120,120,0.2);padding:0;border-bottom:1px solid #d4d7d4}header nav ul.active{display:block}header.banner .nav-primary ul li,header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:active{display:block;padding:0;margin:0;border:none}header.banner .nav-primary ul li a:hover{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background-color:#d0d0d0}header.banner .nav-primary ul li a.active{background-color:#ddd}header.banner .nav-primary ul li{border-bottom:1px solid #F2F2F4;font-size:16px}header.banner .nav-primary ul li:last-child{border:0}header.banner nav.nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:active{padding:14px 14px 13px;text-align:left}header.banner nav.nav-primary ul.active li ul{display:none}#menu.active:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-arrow.svg);background-repeat:no-repeat;background-position:50% 26px;content:"";display:block;height:23px;margin-left:0;padding-bottom:17px;position:relative;top:-3px;width:48px;z-index:999}html.no-svg #menu.active:after,.opera-mini #menu.active:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-arrow.png)}.nav-secondary{border-bottom:1px solid #dfdcd9;margin-bottom:0}.nav-secondary ul{float:left;margin-bottom:10px;margin-left:2px}.nav-secondary ul li{float:left;margin-top:16px;font-size:14px;margin-right:15px}.nav-secondary ul li a:link,.nav-secondary ul li a:visited{color:#333;font-size:14px;float:left}.nav-secondary ul li a:hover,.nav-secondary ul li a:active{color:#dd4814;text-decoration:none}.nav-secondary ul li,.nav-secondary ul li.active a:link,.nav-secondary ul li.active a:visited{color:#dd4814;text-decoration:none}.nav-secondary ul.breadcrumb{margin-left:20px}.nav-secondary ul.breadcrumb li,.nav-secondary ul.breadcrumb li a:link,.nav-secondary ul.breadcrumb li a:visited{color:#888888;margin-right:8px}.nav-secondary ul.breadcrumb li.active a:link,.nav-secondary ul.breadcrumb li.active a:visited{color:#dd4814}header.banner h2{font-size:1.78571em;margin-bottom:0.48em;display:block;left:4px;margin-bottom:0;position:relative;text-transform:lowercase;top:14px}header.banner h2 a:link,header.banner h2 a:visited,header.banner a{color:#fff;float:left;text-decoration:none}header.banner .logo{border-left:0;float:left;height:48px;overflow:hidden}header.banner .logo-ubuntu{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/ubuntu-logo.png") no-repeat scroll 0 10px transparent;font-size:18px;margin-bottom:0;position:relative;text-transform:lowercase;float:left;margin:0;display:inline-block;height:32px;min-width:128px;margin-right:-20px;margin-left:10px;padding:7px 14px 9px 0}header.banner .logo-ubuntu img{margin-right:8px;position:absolute;left:-999em}header.banner .logo-ubuntu span{float:left;font-size:23px;font-weight:300;padding-left:122px;padding-right:20px;position:relative;top:5px}header.banner .nav-primary.nav-left .logo-ubuntu{float:right}header.banner .nav-primary.nav-right .logo-ubuntu{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-white.svg");background-size:107px 25px;float:left}html.no-svg header.banner .nav-primary.nav-right .logo-ubuntu,.opera-mini header.banner .nav-primary.nav-right .logo-ubuntu{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-white.png")}@media only screen and (max-width: 295px){header.banner .nav-primary.nav-right .logo-ubuntu,header.banner .logo-ubuntu{-moz-background-size:20px 20px;-webkit-background-size:20px 20px;-o-background-size:20px 20px;background-size:20px 20px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu_cof-white_orange-hex.svg") 0 50% no-repeat;min-width:0;width:38px}header.banner .logo-ubuntu span{padding-left:38px}}html.no-svg header.banner .logo-ubuntu,.opera-mini header.banner .logo-ubuntu{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu_cof-white_orange-hex.png")}@media only screen and (max-width: 768px){header.banner .nav-primary{-moz-box-shadow:0 1px 2px 1px rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 2px 1px rgba(0,0,0,0.2);box-shadow:0 1px 2px 1px rgba(0,0,0,0.2)}header.banner .nav-primary.active{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;padding:0}header nav ul.active{float:left}header nav ul.active li:last-child a:link,header nav ul.active li:last-child a:visited{border-bottom:0}header.banner .nav-primary ul{position:relative;width:100%}header.banner .nav-primary ul li.active a:link,header.banner .nav-primary ul li.active a:visited{color:#333;font-weight:700}header.banner .nav-primary ul li,header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:active{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:transparent;border:none;display:block;font-weight:300;margin:0;padding:0;width:100%}header.banner .nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:active{background-color:#f0f0f0;border-bottom:1px solid #d4d7d4;color:#333333;font-size:1em}header.banner .nav-primary ul li:nth-last-child(-n+2) a:link,header.banner .nav-primary ul li:nth-last-child(-n+2) a:visited{border:0}header.banner .nav-primary ul li a:hover{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background:#f8f8f8}header.banner .nav-primary ul li a.active{background-color:#ddd}header.banner nav.nav-primary ul li a:link,header.banner .nav-primary ul li a:visited,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:active{padding:8px 10px;text-align:left}header.banner .nav-primary ul li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:transparent;border-bottom:0;border-right:1px solid #d4d7d4;float:left;width:50%}.nav-secondary{background:#fff}.nav-secondary ul.second-level-nav{border-top:1px solid #d4d7d4;display:none;margin-bottom:0;margin-left:0;padding-bottom:10px;padding-top:10px;width:100%}.nav-secondary ul.second-level-nav li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:50%;margin:0;float:left}.nav-secondary ul.second-level-nav li a,.nav-secondary ul.second-level-nav li a:link,.nav-secondary ul.second-level-nav li a:visited{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;height:100%;padding:10px 10px 10px 20px;width:100%}.nav-secondary ul.second-level-nav li.active a,.nav-secondary ul.second-level-nav li.active a:link,.nav-secondary ul.second-level-nav li.active a:visited{color:#333;font-weight:700}.nav-secondary ul.third-level-nav{display:none;margin-bottom:0;width:100%;padding-bottom:20px}.nav-secondary ul.third-level-nav li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:50%;margin:0;float:left;padding-left:30px}.nav-secondary ul.third-level-nav li a,.nav-secondary ul.third-level-nav li a:link,.nav-secondary ul.third-level-nav li a:visited{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:10px 10px 10px 0;display:block;width:100%;height:100%}.nav-secondary ul.third-level-nav li.active a,.nav-secondary ul.third-level-nav li.active a:link,.nav-secondary ul.third-level-nav li.active a:visited{color:#333;font-weight:700}.nav-secondary ul.third-level-nav li.single-link{width:100%}.nav-secondary ul.third-level-nav li:only-child{width:100%}.nav-secondary ul.breadcrumb{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;margin-left:0;margin-bottom:0}.nav-secondary ul.breadcrumb li:first-of-type{border-bottom:1px solid #d4d7d4;margin-bottom:-1px}.nav-secondary ul.breadcrumb li{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#fff;width:100%;display:block;height:40px;margin:0}.nav-secondary ul.breadcrumb li a,.nav-secondary ul.breadcrumb li a:link,.nav-secondary ul.breadcrumb li a:visited{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:16px;width:100%;color:#333333;display:block;margin-right:0;text-decoration:none;padding:8px 10px 0 10px}.nav-secondary ul.breadcrumb li.active{margin-top:12px}.nav-secondary ul.breadcrumb li.active a,.nav-secondary ul.breadcrumb li.active a:link,.nav-secondary ul.breadcrumb li.active a:visited{color:#333;font-weight:700}.nav-secondary ul.breadcrumb li:nth-of-type(2n){margin-top:12px}.nav-secondary ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-down-arrow.svg);background-position:center center;background-repeat:no-repeat;background-size:18px;float:right;height:18px;margin-right:-5px;margin-top:-6px;padding:10px;position:relative;right:0;top:0;width:18px}.nav-secondary ul.breadcrumb li+li{display:none}.nav-secondary ul.breadcrumb li+li a:link,.nav-secondary ul.breadcrumb li+li a:active,.nav-secondary ul.breadcrumb li+li a:visited{padding-left:20px}.nav-secondary ul.breadcrumb li+li a.after{background-image:none}.nav-secondary.open ul.breadcrumb li a:after,.nav-secondary.open ul.breadcrumb li a:link:after,.nav-secondary.open ul.breadcrumb li a:visited:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.svg)}.nav-secondary.open ul.breadcrumb li+li a.after{background-image:none}.nav-secondary.open ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.svg);margin-top:-7px}.nav-secondary.open ul.second-level-nav,.nav-secondary.open ul.third-level-nav,.nav-secondary.open ul.breadcrumb li+li{display:block}.no-js .nav-secondary ul.second-level-nav{display:block}.no-js #main-navigation-link{position:absolute;right:10px;top:12px;width:20px;height:28px;z-index:999;text-indent:-999em;display:block}.no-js #main-navigation-link a{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.svg");background-position:center center;background-repeat:no-repeat;background-size:25px auto;display:block;width:28px;height:28px;position:absolute}html.no-svg .nav-secondary ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-down-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg header.banner .nav-primary #google-appliance-search-form button[type="submit"],.opera-mini header.banner .nav-primary #google-appliance-search-form button[type="submit"]{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-black.png")}html.no-svg .nav-secondary ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-down-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:link:after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li a:visited:after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after,.opera-mini .nav-secondary ul.breadcrumb.open ul.breadcrumb li .after{background-image:url(//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/nav-up-arrow.png)}html.no-svg header.banner .nav-primary #google-appliance-search-form button[type="submit"],.opera-mini header.banner .nav-primary #google-appliance-search-form button[type="submit"]{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-black.png")}header.banner .nav-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.svg");background-position:center center;background-repeat:no-repeat;background-size:25px auto;cursor:pointer;display:block;height:48px;position:absolute;right:0;text-indent:-99999px;width:48px}html.no-svg header.banner .nav-toggle,.opera-mini header.banner .nav-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/navigation-menu-plain.png")}}@media only screen and (min-width: 768px){header.banner .nav-primary ul li{border-bottom:0}}@media only screen and (min-width: 769px){header.banner{-moz-box-shadow:0 2px 2px -2px #777777 inset,2px 1px #FFFFFF;-webkit-box-shadow:0 2px 2px -2px #777777 inset,2px 1px #FFFFFF;box-shadow:0 2px 2px -2px #777777 inset,2px 1px #FFFFFF}header.banner nav.nav-primary{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;border-bottom:0}header.banner .nav-toggle{display:none}header.banner nav ul{background-color:transparent;display:block}header.banner .nav-primary ul li{border-left:1px solid #C64012}header.banner .nav-primary ul li a:active,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:visited,header.banner nav.nav-primary ul li a:link{border-left:1px solid #EC5B29}header.banner .nav-primary ul li:last-child{border-right:1px solid #C64012;border-left:1px solid #C64012}header.banner .nav-primary ul li a.active{background-color:#B83A10}header.banner .nav-primary ul li a:hover{background-color:#E1662F}.nav-secondary ul:last-child li:last-child{padding-bottom:10px}.nav-secondary ul.breadcrumb li,.nav-secondary ul.second-level-nav li,.nav-secondary ul.third-level-nav li{margin-right:15px}.nav-secondary ul.breadcrumb{float:left}.nav-secondary ul.breadcrumb li{margin-bottom:10px}.nav-secondary ul{float:none;margin-bottom:0}.nav-secondary ul li{margin-bottom:5px}}@media only screen and (min-width: 984px){header.banner{margin-bottom:20px}header.banner nav.nav-primary ul{display:block}header.banner .nav-primary,#nav-global .nav-global-wrapper{width:984px}header.banner .nav-primary.nav-right .logo-ubuntu{margin-left:0}}header.banner .nav-primary ul{position:static}header.banner .nav-primary li ul{-moz-box-shadow:0 2px 2px -1px #777777;-webkit-box-shadow:0 2px 2px -1px #777777;box-shadow:0 2px 2px -1px #777777;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;background:#f7f7f7;border:1px solid #d5d5d5;display:none;float:none;margin:0;padding:5px 0;position:absolute;top:51px;width:200px}header.banner .nav-primary li:hover ul:after{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-up-smaller.png") no-repeat;content:'';display:block;height:8px;left:20px;position:relative;top:-13px;width:200px;z-index:999}.no-generatedcontent header.banner .nav-primary li ul{-webkit-border-radius:0 0 10px 10px;-moz-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px;top:48px}header.banner .nav-primary li ul .arrow-up{display:none}header.banner .nav-primary li ul li{border:0;float:none}header.banner .nav-primary li ul li a:link,header.banner .nav-primary li ul li a:visited{border:0;color:#333333;padding:0 0 11px 14px;text-align:left;width:170px}header.banner .nav-primary li ul li a:hover{background:none repeat scroll 0 0 transparent;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;color:#DD4814}header.banner .nav-primary li ul li.first a:link,header.banner .nav-primary li ul li.first a:visited,header.banner .nav-primary li ul li:first-of-type a:link{padding:10px 14px}header.banner .nav-primary li ul li.active a:link,header.banner .nav-primary li ul li.active a:visited{background:none repeat scroll 0 0 transparent !important}header.banner .nav-primary li ul .promo{border-top:1px solid #D5D5D5;float:left;margin-top:5px;padding:15px 0 0}header.banner .nav-primary li ul .promo a:link,header.banner .nav-primary li ul .promo a:visited{background:none repeat scroll 0 0 transparent;border-left:0 none;color:#333333;height:auto;padding:0;text-align:left}header.banner .nav-primary li ul .promo p{margin:0 10px}header.banner .nav-primary li ul .promo a:hover{box-shadow:none;color:#DD4814}header.banner .nav-primary li ul .promo img{margin-top:14px;margin-bottom:-6px;-webkit-border-radius:0 0 10px 10px;-moz-border-radius:0 0 10px 10px;border-radius:0 0 10px 10px;position:relative;top:1px}header.banner .nav-primary li ul .promo .category{color:#888888;font-size:11px;margin:0 10px;text-transform:uppercase}header.banner .nav-primary li:hover ul{display:block}html.lt-ie8 header.banner .nav-primary li:hover ul{display:none}.header-search,#box-search{padding:7px 0 7px 14px;overflow:hidden}.header-search input[type="search"],.header-search input[type="text"],#box-search input[type="search"],#box-search input[type="text"]{-webkit-appearance:none;-moz-box-shadow:inset 0 1px 4px rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 4px rgba(0,0,0,0.2);box-shadow:inset 0 1px 4px rgba(0,0,0,0.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-transition:all 0.5s ease-out;-moz-transition:all 0.5s ease-out;-ms-transition:all 0.5s ease-out;-o-transition:all 0.5s ease-out;transition:all 0.5s ease-out;background-color:#be3d00;border:none;color:#fff;display:block;float:left;font-size:16px;height:2.1em;margin-bottom:0;padding:0.5em 2.5em 0.5em 0.5em;width:100%}.header-search ::-webkit-input-placeholder,#box-search ::-webkit-input-placeholder{color:white;opacity:0.4}.header-search ::-webkit-input-placeholder,#box-search ::-webkit-input-placeholder{color:white;opacity:0.4}.header-search ::-moz-placeholder,#box-search ::-moz-placeholder{color:white;opacity:0.4}.header-search :-ms-input-placeholder,#box-search :-ms-input-placeholder{color:white;opacity:0.4}.header-search input:-moz-placeholder,#box-search input:-moz-placeholder{color:white;opacity:0.4}.header-search ::placeholder,#box-search ::placeholder{color:white;opacity:0.4}.header-search input[type="search"]:focus,#box-search input[type="search"]:focus{background-color:#a63603}.header-search button[type=submit],#box-search button[type=submit]{padding:3px 2px;line-height:0;float:left;margin-left:-40px;display:block;background:none;overflow:visible}.header-search button[type=submit]:hover,#box-search button[type=submit]:hover{background:none}.header-search button[type=submit] img,#box-search button[type=submit] img{height:28px;width:28px}header.banner .search-toggle{-moz-background-size:20px 20px;-webkit-background-size:20px 20px;-o-background-size:20px 20px;background-size:20px 20px;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search_icon_white_64.png");background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search.svg");background-position:center center;background-repeat:no-repeat;display:block;height:48px;outline:none;overflow:hidden;position:absolute;right:58px;text-indent:-999em;top:0;width:24px}.search-toggle:link,.search-toggle:active{outline:none}#box-search,.header-search{background:#f0f0f0;border:0;display:none;float:left;margin-bottom:0;position:relative;margin:0 0 -1px 0;padding:0;width:100%;z-index:3}#box-search.active,.header-search.active,.header-search.open{display:block}#box-search div,.header-search div{-moz-box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);-webkit-box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);box-shadow:inset 0 -4px 4px -4px rgba(0,0,0,0.3),inset 0 5px 5px -5px rgba(0,0,0,0.3);background:#f0f0f0;margin:10px;position:relative;z-index:1}#box-search form input[type="search"],.header-search form input[type="search"]{font-size:1.14286em;margin-bottom:0.75em;-webkit-border-radius:4px 4px 4px 4px;-moz-border-radius:4px 4px 4px 4px;border-radius:4px 4px 4px 4px;-moz-box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);-webkit-box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);box-shadow:0 2px 2px rgba(0,0,0,0.3) inset,0 -1px 3px rgba(0,0,0,0.2) inset,0 2px 0 rgba(255,255,255,0.4);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;border:0;color:#333;font-size:16px;height:auto;margin:0;float:left;padding:9px 10px;width:100%}.yes-js .header-inner #box-search,.yes-js .header-inner .header-search{display:none}.yes-js .header-inner #box-search form,.yes-js .header-inner .header-search form{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin-left:0;margin-right:0;overflow:hidden;padding:10px;top:0;z-index:999;position:relative;width:100%}@media only screen and (max-width: 768px){header.banner .search-toggle{right:48px}html.no-svg .search-toggle,.opera-mini .search-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-white.png")}}@media only screen and (min-width: 768px){header.banner .search-toggle{display:none}}@media only screen and (min-width: 960px){#box-search,.header-search{background:none;overflow:hidden;padding:7px 0 7px 14px;border-right:0 none;float:right;margin-bottom:0;padding-bottom:5px;padding-right:0;padding-top:7px;max-width:220px}#box-search form input[type="text"],#box-search form input[type="search"],.header-search form input[type="text"],.header-search form input[type="search"]{-moz-box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-search.png") no-repeat scroll 5px center,none repeat scroll 0 0 #BE3D00;border:6px solid #DE6532;border-width:0 0 1px;color:#fff;font-size:0.813em;height:24px;margin-bottom:0;padding:4px 4px 4px 30px;transition:all 0.5s ease 0s;width:86px}}@media only screen and (max-width: 960px){header.banner nav.nav-primary .header-search{padding:0;position:relative;top:0;width:100%}header.banner nav.nav-primary .header-search input[type="search"]{border-radius:0;background:#f7f7f7;color:#333}header.banner nav.nav-primary .header-search button[type="submit"]{width:32px;height:38px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-black.svg") no-repeat scroll center center transparent;background-size:28px 28px}header.banner nav.nav-primary .header-search button[type="submit"] img{max-width:none;display:none}header.banner nav.nav-primary .header-search.open{display:block}header.banner .search-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/search-white.svg");background-position:center center;background-repeat:no-repeat;background-size:25px auto;cursor:pointer;right:0;display:block;height:48px;position:absolute;text-indent:-99999px;width:48px}html.no-svg header.banner .search-toggle,.opera-mini header.banner .search-toggle{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/img/search-white.png")}.opera-mini x:-o-prefocus,.opera-mini header.banner .search-toggle{-o-background-size:25px auto;background-size:25px auto}}@media only screen and (min-width: 984px){#box-search,.header-search{display:block;margin-right:0}#box-search form input[type="text"]:focus,.header-search form input[type="text"]:focus{width:160px}}@media only screen and (max-width: 768px){header.banner .search-toggle{right:48px}}body.ubuntu-search .nav-secondary,body.search-results .nav-secondary,body.search-no-results .nav-secondary{display:none}body.ubuntu-search section>h1,body.ubuntu-search section article h1,body.search-results section>h1,body.search-results section article h1,body.search-no-results section>h1,body.search-no-results section article h1{padding-bottom:10px;font-size:1.438em;margin-bottom:0}body.ubuntu-search section>h1,body.search-results section>h1,body.search-no-results section>h1{border-bottom:1px dotted #dfdcd9}body.ubuntu-search .main-search,body.search-results .main-search,body.search-no-results .main-search{padding:20px 0;margin:0 0 20px 0;background-color:transparent}body.ubuntu-search .main-search input[type="search"],body.search-results .main-search input[type="search"],body.search-no-results .main-search input[type="search"]{float:left;width:100%;font-size:2em;border:1px solid #999;-moz-box-sizing:border-box;box-sizing:border-box;padding:0.2em 65px 0.2em 0.2em}body.ubuntu-search .main-search button[type=submit],body.search-results .main-search button[type=submit],body.search-no-results .main-search button[type=submit]{padding:4px;line-height:0;float:left;margin-left:-53px;display:block;background:none;overflow:visible;width:auto;margin-top:-4px}body.ubuntu-search .main-search button[type=submit]:hover,body.search-results .main-search button[type=submit]:hover,body.search-no-results .main-search button[type=submit]:hover{background:none}body.ubuntu-search .main-search button[type=submit] img,body.search-results .main-search button[type=submit] img,body.search-no-results .main-search button[type=submit] img{height:45px;width:45px}body.ubuntu-search .search-result h1 .title-main,body.search-results .search-result h1 .title-main,body.search-no-results .search-result h1 .title-main{margin-right:20px}body.ubuntu-search .search-result h1 .result-url,body.search-results .search-result h1 .result-url,body.search-no-results .search-result h1 .result-url{color:#999;overflow:hidden;text-overflow:ellipsis;display:block;vertical-align:bottom;padding-bottom:2px}body.ubuntu-search .search-result h1 .result-url a,body.search-results .search-result h1 .result-url a,body.search-no-results .search-result h1 .result-url a{color:#999}body.ubuntu-search .search-result p,body.search-results .search-result p,body.search-no-results .search-result p{margin-bottom:0}body.ubuntu-search .num-results,body.search-results .num-results,body.search-no-results .num-results{display:inline-block;margin-left:20px}body.ubuntu-search .bottom-results-total,body.search-results .bottom-results-total,body.search-no-results .bottom-results-total{text-align:center;width:100%;overflow:visible;padding-top:20px;margin:0}body.ubuntu-search .bottom-nav,body.search-results .bottom-nav,body.search-no-results .bottom-nav{overflow:hidden;margin-top:-26px}body.ubuntu-search .bottom-nav ul,body.search-results .bottom-nav ul,body.search-no-results .bottom-nav ul{margin-bottom:0;margin-left:0;padding:0;overflow:hidden}body.ubuntu-search .bottom-nav li,body.search-results .bottom-nav li,body.search-no-results .bottom-nav li{float:left;margin-left:15px}body.ubuntu-search .bottom-nav li:first-child,body.search-results .bottom-nav li:first-child,body.search-no-results .bottom-nav li:first-child{margin-left:0}body.ubuntu-search .nav-back,body.search-results .nav-back,body.search-no-results .nav-back{float:left}body.ubuntu-search .nav-back li:before,body.search-results .nav-back li:before,body.search-no-results .nav-back li:before{content:"\2039";color:#dd4814;margin-right:5px}body.ubuntu-search .nav-back li.item-extreme:before,body.search-results .nav-back li.item-extreme:before,body.search-no-results .nav-back li.item-extreme:before{content:"\2039\2039"}body.ubuntu-search .nav-forward,body.search-results .nav-forward,body.search-no-results .nav-forward{float:right}body.ubuntu-search .nav-forward li:after,body.search-results .nav-forward li:after,body.search-no-results .nav-forward li:after{content:"\203A";color:#dd4814;margin-left:5px}body.ubuntu-search .nav-forward li.item-extreme:after,body.search-results .nav-forward li.item-extreme:after,body.search-no-results .nav-forward li.item-extreme:after{content:"\203A\203A"}body.ubuntu-search .error-notification,body.search-results .error-notification,body.search-no-results .error-notification{background-color:#fdffdc;color:#333;padding:20px;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;margin-top:20px;display:block}body.ubuntu-search .result-line,body.search-results .result-line,body.search-no-results .result-line{color:#ada69e}body.ubuntu-search .results-top,body.search-results .results-top,body.search-no-results .results-top{border-bottom:1px dotted #dfdcd9;padding-bottom:0.5em}body.ubuntu-search .search-container,body.search-results .search-container,body.search-no-results .search-container{padding-bottom:0}@media only screen and (min-width: 768px){.ubuntu-search .main-search button[type=submit]{margin-left:-60px;margin-top:0}}body footer.global #nav-global li:first-of-type a{margin-left:0}footer.global{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-moz-box-shadow:inset 0 2px 2px -1px #d3d3d3;-webkit-box-shadow:inset 0 2px 2px -1px #d3d3d3;box-shadow:inset 0 2px 2px -1px #d3d3d3;background:none;border-top:0;clear:both;display:block;padding:30px 10px 20px;position:relative;width:100%}footer.global .legal{margin:0 auto;width:100%}footer.global .legal{background-image:none;position:relative;clear:both;min-height:40px}footer.global .legal p,footer.global .legal ul{padding-left:0}footer.global h2{font-size:0.75em;line-height:1.4;margin-bottom:0;padding-bottom:0.5em}footer.global h2,footer.global h2 a:link,footer.global h2 a:visited{color:#333333;font-weight:normal}footer.global nav ul li h2 a:after{content:""}footer.global ul{margin:0}footer.global nav ul li.two-col{display:inline-block;min-height:10em;vertical-align:top}footer.global nav ul li li{font-size:0.85714em;margin-bottom:1em;font-size:0.75em;margin-bottom:0}footer.global ul li li a:link,footer.global ul li li a:visited{color:#333333;margin-bottom:0}footer.global ul li li a:hover,footer.global ul li li a:active,footer.global h2 a:hover,footer.global h2 a:active{color:#dd4814}footer.global .inline li{display:inline}footer.global p,footer.global ul.inline li a{color:#333333;font-size:12px;margin-bottom:0}footer.global ul.inline li a:hover{color:#dd4814}footer.global ul.inline li:after{color:#888888;content:"\00b7";vertical-align:middle;margin:0 5px}footer.global ul.inline li:last-child{width:120px}footer.global ul.inline li:last-child:after{content:""}footer.global .inline li{float:none;margin-bottom:0}footer.global .top-link{-moz-box-shadow:0 -4px 4px -4px rgba(0,0,0,0.3) inset;-webkit-box-shadow:0 -4px 4px -4px rgba(0,0,0,0.3) inset;box-shadow:0 -4px 4px -4px rgba(0,0,0,0.3) inset;background:none repeat scroll 0 0 transparent;border:0 none;float:left;font-size:0.75em;letter-spacing:0.05em;margin:0 0 0 -10px;padding-right:20px;text-transform:uppercase;width:100%}footer.global .top-link a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-upload-warmgrey.svg");background-position:10px center;background-repeat:no-repeat;background-size:14px 14px;border-bottom:0 none;color:#888888;display:block;float:none;font-weight:400;padding:12px 0 12px 28px}html.no-svg footer.global .top-link a,.opera-mini footer.global .top-link a{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-upload-warmgrey.png")}@media only screen and (max-width: 768px){footer.no-global .legal{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;box-shadow:0 2px 2px -1px #D3D3D3 inset;padding-top:10px;margin-left:-10px;padding-left:10px;padding-right:10px}#livechat-eye-catcher{display:block}}@media only screen and (min-width: 768px){footer.global .inline li{display:inline;float:left}}@media only screen and (min-width: 769px){footer.global .top-link{display:none}footer.global .footer-b h2 a i{font-style:normal;display:inline}}@media only screen and (min-width: 984px){footer.global .legal{width:984px}footer.global{padding:30px 0 20px}footer.global .legal{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/logos/logo-ubuntu-grey.png") 100% 0 no-repeat}footer.global .footer-a{display:block}}#context-footer{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:1em;margin-bottom:0.85714em;border-bottom:0;clear:both;padding-bottom:1px;padding-top:0;position:relative;margin-bottom:0;margin-left:0;margin-right:0;width:100%}#context-footer hr{-moz-box-shadow:inset 0 2px 2px -2px #333;-webkit-box-shadow:inset 0 2px 2px -2px #333;box-shadow:inset 0 2px 2px -2px #333;background:#dd4814;height:14px;margin:0 0 10px;border:0;clear:both}#context-footer div.twelve-col{display:table;float:none;margin-bottom:7px}#context-footer div div{display:block;padding-left:0;margin-bottom:20px}#context-footer div div div{display:block;padding-left:0;margin-bottom:0}#context-footer div div.feature-one{padding-left:0}#context-footer div div.feature-four{margin-bottom:0;margin-right:0}#context-footer>div{padding-left:10px;padding-right:10px}#context-footer ul{margin-bottom:5px}#context-footer li.active{display:none}#context-footer h3{font-size:1.14286em;margin-bottom:0.75em;font-weight:normal}#context-footer .list a:after,#context-footer a.link-arrow:after,#context-footer nav ul li h2 a:after{content:' \203A'}@media only screen and (min-width: 768px){#context-footer{margin-bottom:12px;padding-left:30px;padding-right:30px}#context-footer div+div{width:31%}#context-footer div div.feature-four{padding-bottom:20px}#context-footer hr{margin:0 -30px 40px}#context-footer>div{padding-left:0;padding-right:0}}@media only screen and (min-width: 984px){#context-footer{padding:0 40px 10px}#context-footer div div{display:table-cell;float:none;padding-left:20px;margin-bottom:0}#context-footer hr{margin:0 -40px 40px}}a.link-cta-ubuntu,a.link-cta-canonical,a.link-cta-inverted,button.cta-ubuntu,button.cta-canonical,form button[type="submit"],form input[type="submit"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:1.14286em;margin-bottom:0.75em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background:#dd4814;color:#fff;text-decoration:none;display:inline-block;margin:0;font-family:Ubuntu, Arial, 'libra sans', sans-serif;font-weight:300;-webkit-font-smoothing:subpixel-antialiased;-moz-font-smoothing:subpixel-antialiased;-o-font-smoothing:subpixel-antialiased;font-smoothing:subpixel-antialiased;padding:8px 14px;width:100%;text-align:center}a.cta-large,button.cta-large{font-size:1.28571em;margin-bottom:0.66667em;padding:10px 20px}a.link-cta-canonical,button.cta-canonical,form button.cta-canonical[type="submit"],form input.cta-canonical[type="submit"]{background:#772953;color:#fff}a.link-cta-inverted,button.cta-inverted{background:#fff;color:#333333}.row-enterprise a.link-cta-canonical,.row-enterprise button.link-cta-canonical{background:#fff;color:#772953}a.link-cta-ubuntu:hover,a.link-cta-ubuntu:hover,button.cta-ubuntu:hover,form button[type="submit"]:hover,form input[type="submit"]:hover{background:#c03f11;text-decoration:none}a.link-cta-canonical:hover,button.cta-canonical:hover{background:#5f2143;text-decoration:none}a.link-cta-inverted:hover,.row-enterprise a.link-cta-canonical:hover,button.cta-inverted:hover,.row-enterprise button.cta-canonical:hover{background:#fff;text-decoration:underline}a.cta-deactivated,a.cta-deactivated:hover,button.cta-deactivated,button.cta-deactivated:hover{background:#efefef;color:#fff;cursor:not-allowed}@media only screen and (min-width: 768px){a.link-cta-ubuntu,a.link-cta-canonical,a.link-cta-inverted,button.cta-ubuntu,button.cta-canonical,form button[type="submit"],form input[type="submit"]{width:auto}}@media only screen and (min-width: 984px){a.link-cta-ubuntu,a.link-cta-canonical,a.link-cta-inverted,button.cta-ubuntu,button.cta-canonical,form button[type="submit"],form input[type="submit"]{width:auto}}form input,form select,form textarea{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%}form .fieldset-submit ul{margin-bottom:0}form fieldset .mktError,form fieldset .errMsg,form fieldset .reqMark{color:#df382c}form fieldset .mktFormMsg{clear:both;display:block}.row{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-bottom:1px dotted #888888;clear:both;padding:20px 10px 0;position:relative}.row br{display:none}.row.no-padding-bottom{padding-bottom:0 !important}.row-grey{background:#f7f7f7}.no-border{border:0}#main-content .row-hero{margin-top:20px;padding-top:0}.row-background{color:#fff;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/backgrounds/image-background-wallpaper.jpg") no-repeat scroll 50% 50% #4b1827}.row-background a.alternate{color:#fff;text-decoration:underline}.row-background a.alternate:hover{color:rgba(255,255,255,0.6)}@media only screen and (min-width: 768px){.row-background{background-position:center 50%;background-size:100% auto}}.strip{width:100%;display:block}.strip-dark{background-color:#2c001e;background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/backgrounds/background-grid.png");background-repeat:repeat;color:#fff}.strip-dark .list-ubuntu li{border:0}.strip-dark .resource{color:#333;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.strip-dark .resource:before{border-right-color:#2c001e}#main-content .strip-dark .resource:before{border-bottom-width:29px;right:-2px;top:-1px}#main-content .strip-dark .resource:hover:before{border-bottom-width:34px}#main-content .strip-dark .resource h2{padding-right:20px}.row-aux{background-color:rgba(255,255,255,0.6);text-align:center}.row-aux h2,.row-aux p{text-align:left}.row-aux a p{color:#333;margin-bottom:30px}.row-step h2{position:relative;top:5px}.row-step .step{position:relative;top:-5px;height:32px;width:32px;border-radius:50%;border:3px solid #dd4814;color:#dd4814;line-height:32px;text-align:center;background-color:#fff;font-size:23px;font-weight:400}@media only screen and (min-width: 768px){.row{padding:30px}#main-content .row-hero{margin-top:40px}}@media only screen and (min-width: 769px){.row-step .step{height:42px;width:42px;line-height:42px}.row br{display:block}}@media only screen and (min-width: 984px){.row br{display:block}.row{padding:60px 40px 40px}.no-border{border:0}}.box,.box-grey{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:1.333em 20px}.box{background:#fff;border:1px solid #dfdcd9}.box-grey{background:#f7f7f7;color:#333333}.box-orange{background:#dd4814;color:#fff}.box-highlight{-moz-box-shadow:0 2px 2px 0 #c2c2c2;-webkit-box-shadow:0 2px 2px 0 #c2c2c2;box-shadow:0 2px 2px 0 #c2c2c2;border:1px solid #f7f7f7}.box-textured{-moz-box-shadow:0 2px 2px 0 #c2c2c2;-webkit-box-shadow:0 2px 2px 0 #c2c2c2;box-shadow:0 2px 2px 0 #c2c2c2;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/grey-textured-background.jpg");border:0}.box-padded{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#efefef;border:0;margin-bottom:20px;padding:6px 5px}.box-padded h3{font-size:1.39286em;margin-bottom:0.61538em;margin-left:5px;margin-top:5px}.box-padded li h3{font-size:1.39286em;margin-bottom:0.61538em;margin:0}.box-padded div{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff;overflow:hidden;padding:8px 8px 2px}.box-padded-feature{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/soft-centre-bkg.gif") repeat scroll 0 0 #a09f9f;border:0;margin-bottom:20px;padding:11px 5px 6px}.box-padded-feature h3{color:#fff;margin-left:5px;font-size:1.39286em;margin-bottom:0.61538em}.box-padded-feature h4{font-size:1.14286em;margin-bottom:0.75em;font-weight:normal}.box-padded-feature>div{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff;overflow:hidden;padding:20px 8px}.box-padded-feature div div{margin-bottom:0}.box-padded-feature .inline-icons{display:table;width:100%;margin:0;text-align:center}.box-padded-feature .inline-icons li{display:table-cell;text-align:left;float:none}.box-padded-feature .one-col{width:48px;float:left}.resource{cursor:pointer;padding-bottom:40px;position:relative;-moz-transition:background 0.2s ease-out;-webkit-transition:background 0.2s ease-out;transition:background 0.2s ease-out}.resource h2{padding-right:20px}.resource.five-col h2 a:link,.resource.five-col h2 a:visited,.resource.four-col h2 a:link,.resource.four-col h2 a:visited{font-size:inherit !important}.resource.four-col h2 a:link,.resource.four-col h2 a:visited{font-size:1.125em}.resource.twelve-col h2 a:link,.resource.twelve-col h2 a:visited{font-size:1.40625em}.resource:hover{background-color:#fafafa}.resource:after{-moz-box-shadow:0 -1px 2px 0 #ddd;-webkit-box-shadow:0 -1px 2px 0 #ddd;box-shadow:0 -1px 2px 0 #ddd;content:'';height:1px;position:absolute;right:-6px;top:14px;-ms-transform:rotate(45deg);-webkit-transform:rotate(45deg);transform:rotate(45deg);-moz-transition:all 0.2s ease-out;-webkit-transition:all 0.2s ease-out;transition:all 0.2s ease-out;width:41px;z-index:2}.resource:hover:after{right:-9px;top:18px;width:48px}.resource:before{content:'';position:absolute;-moz-transition:border-width 0.2s ease-out;-webkit-transition:border-width 0.2s ease-out;transition:border-width 0.2s ease-out;top:-2px;right:-3px;width:0;height:0;border-bottom:30px solid #fdfdfd;border-right:30px solid #fff;-webkit-box-shadow:-2px 2px 2px rgba(176,176,176,0.4);-moz-box-shadow:-2px 2px 2px rgba(176,176,176,0.4);box-shadow:-2px 2px 2px rgba(176,176,176,0.4);z-index:2;-webkit-border-radius:0 0 0 0;-moz-border-radius:0 0 0 0;border-radius:0 0 0 0}.resource:hover:before{border-bottom-width:35px;border-right-width:35px}.resource:last-of-type{margin-bottom:30px}.resource .content-cat{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-resource-hub-icon-document.png") left center no-repeat;color:#aea79f;font-size:14px;letter-spacing:1px;margin:0;padding-left:20px;padding:0;position:absolute;text-transform:uppercase}.resource .content-cat-webinar{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-resource-hub-webinar.png") left center no-repeat}.resource.box-image-centered div+span img{margin-top:40px}html.yui3-js-enabled .resource:hover a{text-decoration:underline}.row-grey .resource:before{border-right-color:#f7f7f7}@media only screen and (max-width: 768px){.box-padded-feature .inline-icons li{float:left;display:block}.box-padded-feature .one-col{width:48px;float:left}}.arrow-up,.arrow-down,.arrow-right,.arrow-left{height:11px;position:absolute;width:18px}.arrow-up{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-up.png") 0 0 no-repeat;left:20px;top:-11px}.arrow-down{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-down.png") 0 0 no-repeat;bottom:-11px;right:20px}.arrow-right{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-right.png") 0 0 no-repeat;height:18px;right:-11px;top:20px;width:11px}.arrow-left{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/arrow-left.png") 0 0 no-repeat;bottom:20px;height:18px;left:-11px;width:11px}div>.arrow-left{left:-10px}@media only screen and (min-width: 769px){html.yui3-js-enabled .arrow{visibility:visible}}.list,.list-ubuntu,.list-canonical{list-style:none;margin-left:0}.list li,.list-ubuntu li,.list-canonical li{border-bottom:1px dotted #888888;margin-bottom:0;padding:10px 0}.list li:last-of-type,.list li.last-item,.list-ubuntu li:last-of-type,.list-ubuntu li.last-item,.list-canonical li:last-of-type,.list-canonical li.last-item{border:0;padding-bottom:0}.list article{border-bottom:1px dotted #888888;margin-bottom:0;padding:10px 0}.list-spaced article,.list-spaced li{padding:30px 0}nav .list a{display:block}.list-ubuntu li,.list-canonical li{background-repeat:no-repeat;background-position:0 1em;padding-left:25px}.list-ubuntu li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-orange.svg")}.list-canonical li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-midaubergine.svg")}.list-warm li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-warmgrey.svg")}.list-dark li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-darkaubergine.svg")}.vertical-divider .list-canonical li,.vertical-divider .list-ubuntu li{padding-left:25px}html.no-svg .list-ubuntu li,.opera-mini .list-ubuntu li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-orange.png")}html.no-svg .list-canonical li,.opera-mini .list-canonical li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-midaubergine.png")}html.no-svg .list-warm li,.opera-mini .list-warm li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-warmgrey.png")}html.no-svg .list-dark li,.opera-mini .list-dark li{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/tick-darkaubergine.png")}.no-bullets{list-style:none;margin-left:0}.row .combined-list ul,.row .combined-list div{margin-bottom:0}.row .combined-list li.last-item{border-bottom:1px dotted #888888;padding-bottom:10px}.row .combined-list div.last-col,.row .combined-list ul.last-col{margin-bottom:20px}.row .combined-list div.last-col li.last-item,.row .combined-list ul.last-col li.last-item{border-bottom:0;padding-bottom:0}.inline{margin-left:0}.inline li{display:inline;list-style:none;margin-left:0;float:left}@media only screen and (min-width: 768px){.row .combined-list ul,.row .combined-list div{margin-bottom:20px}.row .combined-list li.last-item{border-bottom:0;padding-bottom:0}}ul.inline-logos{float:left;margin-left:0;padding:0;text-align:center;width:100%}ul.inline-logos li{clear:none;display:inline-block;float:none;margin:10px 20px;padding:0}ul.inline-logos li.clear-row{clear:left}ul.inline-logos li.last-item{border:0}ul.inline-logos img{-webkit-transition:all 0.5s ease-out;-moz-transition:all 0.5s ease-out;-ms-transition:all 0.5s ease-out;-o-transition:all 0.5s ease-out;transition:all 0.5s ease-out;vertical-align:middle;max-width:115px;max-height:32px}.inline-icons{margin:0 0 20px}.inline-icons li{margin-right:20px;margin-bottom:20px;text-align:left;display:inline-block}.inline-icons li.last-item{margin-right:0}.inline-icons.no-margin-bottom li{margin-bottom:0}.inline-icons img{vertical-align:middle;max-width:115px;max-height:32px}@media only screen and (max-width: 768px){ul.inline-logos img{max-width:172px;max-height:48px}}@media only screen and (min-width: 769px){ul.inline-logos li{clear:none;display:inline-block;height:auto;margin:20px 0;line-height:60px;padding:0 40px}ul.inline-logos li img{float:none;vertical-align:middle;max-width:200px;max-height:45px}}@media only screen and (min-width: 984px){.inline-icons{text-align:left;margin-bottom:20px}}blockquote.pull-quote{text-indent:0}blockquote.pull-quote p{color:#333333;padding-left:10px;padding-right:10px;font-size:1.77379em;margin-bottom:0.48323em;text-indent:-.4em;margin-left:.4em;line-height:1.3}blockquote.pull-quote p span{font-weight:bold;color:#dd4814;line-height:0;position:relative;left:-5px}blockquote.pull-quote p span+span{left:5px}blockquote.pull-quote p cite{margin:10px 0 0;font-weight:300;display:block;font-size:.75em;text-indent:0}blockquote.pull-quote.js{padding-left:60px;display:table-cell}blockquote.quote-canonical,blockquote.quote-canonical-white{font-size:1.14286em;margin-bottom:0.75em;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-white-360x360.png") no-repeat 20px -130px;color:#772953;float:right;font-size:1em;height:215px;margin-top:0;padding:20px 60px 0;position:relative;width:236px}blockquote.quote-canonical-white{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-aubergine-345x345.png") no-repeat 0 0;color:#fff;padding:80px 60px 0;height:265px}blockquote.quote p:first-child{font-size:1.28571em;margin-bottom:0.66667em;line-height:1.3;text-indent:-7px}blockquote.quote-right-bottom{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-quote-orange.svg");background-repeat:no-repeat;background-size:287px 286px;color:#fff;height:167px;padding:60px 40px;position:static;right:-40px;top:-90px;width:207px}blockquote.quote-right-bottom p{color:#fff}blockquote.quote-grey{font-size:2.57143em;margin-bottom:0.33333em;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-grey-br-211x211.png") no-repeat scroll 0 0 transparent;color:#fff;height:152px;line-height:40px;margin-left:20px;padding:60px 0 0;text-align:center;width:211px}blockquote.quote-bottom-left{background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/quote-orange-bl-287x287.png") no-repeat;color:#fff;height:167px;padding:55px 40px 70px 45px;width:225px}html.no-svg blockquote.quote-right-bottom,.opera-mini blockquote.quote-right-bottom{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/picto-pack/picto-quote-orange.png")}.row-quote{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.row-quote blockquote{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;margin:0;padding:0}.row-quote blockquote p{margin-bottom:.75em;line-height:1.3;color:#333333;padding-left:10px;padding-right:10px;text-indent:0}.row-quote blockquote span{font-weight:bold;color:#dd4814;line-height:0;position:relative;left:-5px}.row-quote blockquote span+span{left:5px}.row-quote blockquote cite{color:#333333;font-style:normal;margin-bottom:0;font-size:.75em;text-indent:-14px;text-indent:0}.row-quote .quote-twitter{background:#fcece7 url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/pictogram-twitter-115x139.png") 20px bottom no-repeat;padding:20px 20px 20px 23.40425%}.row-quote .quote-twitter-small{background:#fcece7 url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/pictograms/pictogram-twitter-54x63.png") 99% bottom no-repeat;padding:20px 20px 20px 80px}.row-quote .quote-twitter-small p{margin:0;padding:0}blockquote.quote-canonical,blockquote.quote-canonical-white{background:none;color:#333333;width:auto;height:auto;padding:0 30px;margin-top:20px}@media only screen and (min-width: 768px){.row-quote blockquote{text-indent:-7px}.pull-quote{text-indent:-.4em}.row-quote blockquote p{font-size:1.77357em;margin-bottom:0.48329em}blockquote.pull-quote p,.row-quote blockquote p{padding-left:0;padding-right:0;text-indent:-.7em}blockquote.pull-quote p span,.row-quote blockquote p span{font-size:1.391304348em}blockquote.pull-quote p cite,.row-quote blockquote p cite{margin-left:0;text-indent:0}blockquote.pull-quote p span,.row-quote blockquote p span{top:5px}}@media only screen and (min-width: 769px){.row-quote blockquote p{font-size:1.77357em;margin-bottom:0.48329em;text-indent:-.4em}}@media only screen and (min-width: 984px){.row-quote blockquote{padding:0 80px 20px;text-indent:-10px}blockquote.pull-quote p span,.row-quote blockquote p span{top:10px}}html.js .tabbed-content .accordion-button{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;height:auto;padding-bottom:.6em;padding-right:20px}html.yui3-js-enabled .tabbed-menu{display:none;padding-bottom:20px;padding-top:20px}html.yui3-js-enabled .arrow{display:none;position:absolute;visibility:hidden}html.yui3-js-enabled .tabbed-content{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:8px 8px 0;background:#f7f7f7;margin-bottom:8px}html.yui3-js-enabled .tabbed-content.hide{display:block;opacity:1 !important}html.yui3-js-enabled .tabbed-content .title{display:none}html.yui3-js-enabled .tabbed-content div{display:none}html.yui3-js-enabled .tabbed-content .accordion-button{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-down.svg") no-repeat scroll right 3px #f7f7f7;color:#333333;display:block;font-size:16px;padding-bottom:.6em;padding-right:20px;width:100%}html.yui3-js-enabled .tabbed-content.open .accordion-button{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-up.svg");margin-bottom:10px}html.yui3-js-enabled .tabbed-content.open div{display:block}html.yui3-js-enabled html.yui3-js-enabled.opera-mini .tabbed-content .accordion-button,html.yui3-js-enabled html.yui3-js-enabled.no-svg .tabbed-content .accordion-button{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-right.png")}html.yui3-js-enabled html.yui3-js-enabled.opera-mini .tabbed-content.open .accordion-button,html.yui3-js-enabled html.yui3-js-enabled.no-svg .tabbed-content.open .accordion-button{background-image:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/icons/icon-arrow-up.png")}html.yui3-js-enabled html.yui3-js-enabled.opera-mini.tabbed-content .accordion-button{background-image:none;margin-bottom:10px}html.yui3-js-enabled html.yui3-js-enabled.opera-mini.tabbed-content div{display:block}@media only screen and (min-width: 768px){html.yui3-js-enabled .tabbed-menu{display:block}html.yui3-js-enabled .tabbed-content{margin-bottom:20px;padding:40px}html.yui3-js-enabled .tabbed-content.hide{display:none;opacity:0 !important}html.yui3-js-enabled .tabbed-content .title{display:block}html.yui3-js-enabled .tabbed-content div{display:block}html.yui3-js-enabled .tabbed-content .vertical-divider div{display:table-cell}html.yui3-js-enabled .tabbed-content .accordion-button{display:none}}html.yui3-js-enabled .accordion-button.active{background-color:transparent}@media only screen and (min-width: 768px){.tabbed-menu{-moz-box-shadow:0 -1px 10px #cfcfcf inset;-webkit-box-shadow:0 -1px 10px #cfcfcf inset;box-shadow:0 -1px 10px #cfcfcf inset;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;background:none repeat scroll 0 0 #f7f7f7;padding-bottom:20px;padding-top:20px;position:relative}.tabbed-menu ul{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:table;margin-bottom:0;padding:0;position:relative;table-layout:fixed;width:100%}.tabbed-menu li{text-align:center;display:table-cell}.tabbed-menu a{color:#666;display:block;outline:none}.tabbed-menu a .active{color:#772953;text-decoration:none}.tabbed-menu a:hover{text-decoration:none}.tabbed-menu .arrow{bottom:0;position:absolute}.tabbed-content{*zoom:1;padding:20px 40px 0}.tabbed-content:before,.tabbed-content:after{content:"";display:table}.tabbed-content:after{clear:both}.tabbed-content .row{padding-left:0;padding-right:0}.tabbed-content .main-content{padding-bottom:40px}html.yui3-js-enabled .tabbed-content.hide{display:none;opacity:0}.tabbed-content-bg{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#fff;margin-left:20px;margin-right:20px}.tabbed-content-bg .row-box{padding-left:0;padding-right:0}html.yui3-js-enabled .arrow{visibility:visible}}.row.vertical-divider{padding-bottom:40px}.vertical-divider div,.vertical-divider li{border-right:0;display:block;padding-left:0;padding-right:0}.vertical-divider-full{padding-bottom:0}.vertical-divider-full>div{padding-bottom:40px}.row.vertical-divider-full{padding-bottom:0}@media only screen and (max-width: 767px){.vertical-divider>div,.vertical-divider>li{border-bottom:1px dotted #888888;padding-bottom:20px}.vertical-divider div:last-of-type,.vertical-divider li:last-of-type,.inline-icons li:last-of-type{border-bottom:0;padding-bottom:5px}.row.vertical-divider{padding-bottom:0}.equal-height div,.equal-height li{height:auto !important}}@media only screen and (min-width: 984px){.row.vertical-divider{padding-bottom:60px}.vertical-divider>div,.vertical-divider>li{border-right:1px dotted #888888;display:table-cell;float:none;margin-right:0;padding-left:20px;padding-right:20px;vertical-align:top}.vertical-divider>div:last-child,.vertical-divider>li:last-child,.vertical-divider>div.last-col,.vertical-divider>li.last-col,.vertical-divider>div:last-of-type,.vertical-divider>li:last-of-type{border-right:0;padding-right:0}.vertical-divider>div:first-child,.vertical-divider>li:first-child,.vertical-divider>div.first-col,.vertical-divider>li.first-col,.vertical-divider>div:first-of-type,.vertical-divider>li:first-of-type{padding-left:0}}.slider{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#f7f7f7;padding-top:40px}.slider .slide-window{overflow:hidden;position:relative;height:450px;-moz-transition:left 1s;-webkit-transition:left 1s;-o-transition:left 1s;transition:left 1s}.slider .slide-container{position:absolute;width:2800 px;-moz-transition:left 1s;-webkit-transition:left 1s;-o-transition:left 1s;transition:left 1s;left:0}.slider .slider-dots ul{position:absolute;top:550px;left:220px;z-index:5}.slider .slider-dots li{background-position:0 -8px;background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/sprite-pager.png") no-repeat;float:left;height:7px;list-style-type:none;margin-right:.75em;text-indent:-9999em;width:7px}.slider .slider-dots li.active{background-position:0 0}.slider .slider-dots a{display:block;outline:0}.slider .slide{float:right;width:700px}.slider .slide h3{margin-top:65px;display:inline-block}.slider .slide p{width:350px}.slider .arrow-prev,.slider .arrow-next{font-size:5em;margin-top:150px;display:block;color:#888888;outline:0}.slider .arrow-prev:hover,.slider .arrow-next:hover{text-decoration:none;color:#333333}.slider .arrow-prev:active,.slider .arrow-next:active{padding-top:1px;text-decoration:none}.slider .arrow-prev:focus,.slider .arrow-next:focus{text-decoration:none}.yui3-tooltip-hidden{display:none}.yui3-tooltip-content{-moz-box-shadow:0 2px 8px rgba(0,0,0,0.2);-webkit-box-shadow:0 2px 8px rgba(0,0,0,0.2);box-shadow:0 2px 8px rgba(0,0,0,0.2);background:url("//assets.ubuntu.com/sites/ubuntu/latest/u/img/patterns/grey-textured-background.jpg") repeat scroll 0 0 transparent;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;border:1px solid #e3e3e3;color:#333333;margin-top:-30px;max-width:520px;position:relative}.yui3-tooltip .yui3-widget-bd{padding:20px;width:320px}.yui3-tooltip .yui3-widget-bd *{max-width:100%}.yui3-tooltip .yui3-widget-bd h5{margin-bottom:10px;font-size:22px;font-weight:300}.yui3-tooltip .yui3-widget-bd img{float:left;margin-right:10px}.yui3-tooltip .yui3-widget-bd q{border-bottom:1px dotted #888888;border-top:1px dotted #888888;display:block;font-size:16px;font-style:italic;margin-bottom:0;margin-top:20px;padding:10px 0}.yui3-tooltip .yui3-widget-bd p:last-child{margin-bottom:0}.yui3-tooltip .yui3-widget-ft,.yui3-tooltip .yui3-widget-ft div{position:absolute;width:0;height:0;border-style:solid;line-height:0;font-size:0}.yui3-tooltip .yui3-tooltip-align-bottom .yui3-widget-ft,.yui3-tooltip .yui3-tooltip-align-bottom .yui3-widget-ft div{top:-10px;left:50%;margin:0 0 0 -10px;border-width:0 10px 10px;border-color:#efefef transparent}.yui3-tooltip .yui3-tooltip-align-bottom .yui3-widget-ft div{top:0;border-color:#efefef transparent}.tooltip-label{-moz-box-shadow:3px 3px 6px rgba(0,0,0,0.3);-webkit-box-shadow:3px 3px 6px rgba(0,0,0,0.3);box-shadow:3px 3px 6px rgba(0,0,0,0.3);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;background:#fff;border:1px solid #dfdcd9;display:none;font-size:13px;line-height:1;margin:0;padding:6px 5px;position:absolute;top:-20px;white-space:nowrap;z-index:1000}body,a:link,a:visited{-webkit-font-smoothing:antialiased}code,pre,p{line-height:1.5}body{font-size:16px}@media only screen and (min-width: 768px){code,pre,p{line-height:1.6}body{font-size:16px}}@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi){body{font-size:18px}}.not-for-medium{display:none}@media only screen and (min-width: 985px){.not-for-medium{display:block}}header.banner{background:#000000;-moz-box-shadow:inset 0 2px 2px -2px #000;-webkit-box-shadow:inset 0 2px 2px -2px #000;box-shadow:inset 0 2px 2px -2px #000;margin-bottom:0}header.banner .nav-primary{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;*zoom:1}header.banner .nav-primary:before,header.banner .nav-primary:after{content:"";display:table}header.banner .nav-primary:after{clear:both}header.banner nav.nav-primary{border-bottom:1px solid #262626;overflow:visible}header.banner nav.nav-primary .user-nav{float:right;margin-right:20px}header.banner nav.nav-primary .user-dropdown:hover ul:after{display:none}header.banner nav.nav-primary .user-dropdown .menu-link img{margin-right:10px}header.banner nav.nav-primary .user-dropdown .menu-link img.hover{display:none}header.banner nav.nav-primary .user-dropdown .menu-link img.normal{display:inline-block}header.banner nav.nav-primary .user-dropdown .open .menu-link img.hover,header.banner nav.nav-primary .user-dropdown .menu-link:hover img.hover{display:inline-block}header.banner nav.nav-primary .user-dropdown .open .menu-link img.normal,header.banner nav.nav-primary .user-dropdown .menu-link:hover img.normal{display:none}header.banner nav.nav-primary .user-dropdown ul{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;margin-top:-2px;background-color:#fff;border-width:0}header.banner nav.nav-primary .user-dropdown ul a:hover{background-color:transparent}header.banner nav.nav-primary #user-dropdown .dropdown ul{width:auto}header.banner .nav-primary.nav-right .logo-ubuntu{-moz-background-size:73px 30px;-webkit-background-size:73px 30px;-o-background-size:73px 30px;background-size:73px 30px;background-image:url(../img/logos/logo.svg);background-position:20px;background-repeat:no-repeat;min-width:120px;padding-top:6px;margin-left:0}body.no-svg header.banner .nav-primary.nav-right .logo-ubuntu{background-image:url(../img/logos/logo.png)}input[type=text]::-ms-reveal,input[type=text]::-ms-clear{display:none;width:0;height:0}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-results-button,input[type="search"]::-webkit-search-results-decoration{display:none}.contextual-bar{overflow:hidden;background-color:#ffffff;border-bottom:1px solid #d4d4d4}form.search-form{overflow:hidden;float:right;width:100%;position:relative}form.search-form input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:0;border-left:0;margin:0;width:100%;height:50px;float:left;font-size:1em;padding-top:0;padding-bottom:0;padding-right:30px;background-color:transparent;-webkit-appearance:none}form.search-form input:focus{border-color:#dd4814}form.search-form button[type=submit],form.search-form button[type=submit]:hover{position:absolute;top:10px;right:10px;display:block;height:30px;width:30px;padding:0;line-height:0;-webkit-appearance:none;background:transparent}form.search-form button img{height:16px}.contextual-nav{border:0;display:block;margin:0;padding-left:10px;background-color:transparent;overflow:hidden;float:left}.contextual-nav li,.contextual-nav li:last-child{font-size:0.875em;float:left;list-style-type:none;margin:0;margin-left:5px}.contextual-nav li a:link,.contextual-nav li a:visited,.contextual-nav .contextual-nav__label{display:block;color:#333333;font-weight:300;text-align:center;padding:16px 10px 10px 10px;border-bottom:3px solid transparent}.contextual-nav .contextual-nav__label{color:#cdcdcd}.contextual-nav li a:hover{border-bottom-color:#dd4814;text-decoration:none;color:#dd4814}.contextual-nav li a.active{border-bottom:3px solid #dd4814}.opera-mini header.banner .logo-ubuntu,.no-svg header.banner .logo-ubuntu{background-image:url(../img/logos/logo.png)}@media only screen and (min-width: 769px){header.banner .nav-primary ul li,header.banner .nav-primary ul li:last-child{border-bottom:0;width:auto}header.banner nav.nav-primary li a:link,header.banner nav.nav-primary li a:visited{border-left:1px solid #262626;font-weight:400}header.banner nav.nav-primary ul li a.active{padding-bottom:10px;background-color:#0e0c0b;border-bottom:3px solid #dd4814;border-left:1px solid #262626}header.banner nav.nav-primary ul li{border-left:1px solid #262626}header.banner nav.nav-primary ul li a:hover{background-color:#dd4814}header.banner nav.nav-primary ul{background-color:transparent;border-right:1px solid #262626;display:block}header.banner nav.nav-primary ul li:last-child{border-left:1px solid #262626;border-right:0}header.banner .nav-primary ul li a:active,header.banner .nav-primary ul li a:hover,header.banner .nav-primary ul li a:visited,header.banner nav.nav-primary ul li a:link{border-left:0}header.banner .nav-primary ul li a.external:hover{background-image:url("../img/icons/external-link-grey.png")}form.search-form{width:325px}form.search-form input{border-left:1px solid #d4d4d4;margin:0 20px;width:250px;font-size:0.875em}}@media only screen and (min-width: 1030px){header.banner{height:48px;overflow:hidden}header.banner .nav-primary{width:100%}}body{background-repeat:repeat}.row{border:0;background-color:rgba(255,255,255,0.6)}@media only screen and (min-width: 769px){.append-one{margin-right:10.6%}.row{padding:50px 40px 30px}}.inner-wrapper{*zoom:1;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background-color:transparent;background-image:none;margin:0 auto;padding-bottom:0;float:none}.inner-wrapper:before,.inner-wrapper:after{content:"";display:table}.inner-wrapper:after{clear:both}.wrapper{position:static;background:transparent;width:100%;overflow:hidden}img.touch-border{margin-bottom:-50px}.inner-wrapper,footer.global .legal{max-width:1030px;width:auto;padding-left:0;padding-right:0}.touch-top{margin-top:-50px}@media only screen and (max-width: 1030px){.inner-wrapper,footer.global .legal{padding-left:8px;padding-right:8px;width:auto}}.footer-cta{background:#fff;padding-bottom:20px}.footer-wrapper.strip-light{background-color:#fff}.solutions-cta{height:60px;background-color:#dd4814;line-height:60px;text-align:center}.solutions-cta a{color:#fff;font-size:1.25em}footer.global{background-color:white;box-shadow:none;padding-top:0}footer.global .row{padding:10px 0 0}footer.global .two-col{width:46%;float:left;display:inline-block;min-height:200px}footer.global h2{padding-bottom:0;color:#888888;font-size:16px}footer.global nav .canonlist ul li,footer.global nav .additional-info ul li{min-height:0;width:48%;float:left}footer.global ul.bullets li:after{line-height:1;color:#888888;content:"•";vertical-align:middle;margin:0 5px}footer.global ul.inline li:last-child{width:auto}footer.global a.external{background-image:url("../img/icons/external-link-dark.png")}footer.global .top-link{margin-bottom:10px}footer.global a{color:#333333}footer.global a:hover{color:#dd4814}footer.global .legal{background-image:none}footer.global .legal.has-cookie{padding-bottom:70px}footer.global .inner-wrapper{overflow:visible}footer.global a.link-cta-positive,footer.global a.link-cta-negative{width:auto;margin-top:10px;padding-left:20px;padding-right:20px;color:#fff;font-size:14px}footer.global .section__title{background:none;cursor:default}.legal-inner{clear:both;overflow:hidden;float:left;width:100%;padding:20px 10px 0;margin:-3px -10px 0}.social,.social--right{margin-left:0}.social .social__item,.social--right .social__item{display:inline;float:left;padding-right:1em}.social .social__google,.social .social__facebook,.social .social__twitter,.social--right .social__google,.social--right .social__facebook,.social--right .social__twitter{background-image:url("../img/icons/icon-social.png");display:block;width:45px;height:44px}.social .social__google.social__twitter:hover,.social .social__facebook.social__twitter:hover,.social .social__twitter.social__twitter:hover,.social--right .social__google.social__twitter:hover,.social--right .social__facebook.social__twitter:hover,.social--right .social__twitter.social__twitter:hover{background-position:0 -45px}.social .social__google.social__facebook,.social .social__facebook.social__facebook,.social .social__twitter.social__facebook,.social--right .social__google.social__facebook,.social--right .social__facebook.social__facebook,.social--right .social__twitter.social__facebook{background-position:90px 0}.social .social__google.social__facebook:hover,.social .social__facebook.social__facebook:hover,.social .social__twitter.social__facebook:hover,.social--right .social__google.social__facebook:hover,.social--right .social__facebook.social__facebook:hover,.social--right .social__twitter.social__facebook:hover{background-position:90px -45px}.social .social__google.social__google,.social .social__facebook.social__google,.social .social__twitter.social__google,.social--right .social__google.social__google,.social--right .social__facebook.social__google,.social--right .social__twitter.social__google{background-position:135px 0}.social .social__google.social__google:hover,.social .social__facebook.social__google:hover,.social .social__twitter.social__google:hover,.social--right .social__google.social__google:hover,.social--right .social__facebook.social__google:hover,.social--right .social__twitter.social__google:hover{background-position:135px -45px}@media only screen and (min-width: 768px){.social--right{float:right}}#additional-info{border-bottom:0}#additional-info h2:before{background-image:url("../img/icons/external-link-grey.svg"),none;background-repeat:no-repeat;background-size:14px 14px;content:"";display:inline-block;height:15px;margin-right:3px;position:relative;top:3px;width:15px}#additional-info div li{border-left:1px solid #d4d7d4;box-sizing:border-box;display:block;float:left;margin:0;padding:0;width:50%}#additional-info div li a{border-bottom:1px solid #d4d7d4;box-sizing:border-box;color:#333333;display:block;float:left;margin:0;overflow:hidden;padding:8px 10px;text-align:left;white-space:normal;width:100%}#additional-info .section__title{border-bottom:1px solid #d4d7d4;background-position:100% 0.1em}html.opera-mini footer #nav-global h2:before,html.opera-mini footer #additional-info h2:before,html.no-svg footer #nav-global h2:before,html.no-svg footer #additional-info h2:before{background-image:url("../img/icons/external-link-grey.png")}@media only screen and (min-width: 769px){.footer-wrapper.strip-light{white-space:nowrap}footer.global{padding-top:40px;padding-bottom:40px}footer.global .two-col{width:14.89361%;display:inline-block;min-height:0}footer.global .section{min-height:160px;margin-right:40px;padding-bottom:0;border-right:1px dotted #aaa;border-bottom:0}footer.global .section:last-child{margin-right:0;border-right:0}footer.global li{display:inline;float:left}footer.global ul.no-bullets li{border-right:1px dotted #aaa;padding-right:15px;padding-left:15px}footer.global ul.no-bullets li a{font-size:16px}footer.global ul.no-bullets li a:hover{color:#dd4814}footer.global ul.no-bullets li:last-child{border-right:none}footer.global ul.no-bullets li:first-child{padding-left:0px}#additional-info .section__title{border-bottom:0}#additional-info div li,#additional-info div a:link{width:100%;border:0}}.actions .actions__social-item--twitter,.actions .actions__social-item--google-plus{text-indent:-99999px;background-image:url("../img/icons/icon-social.svg");background-repeat:no-repeat;height:44px;width:44px;overflow:hidden;display:block}.actions .actions__social-item--twitter{background-position:0 0}.actions .actions__social-item--twitter:hover{background-position:0 -45px}.actions .actions__social-item--google-plus{background-position:-45px 0}.actions .actions__social-item--google-plus:hover{background-position:-45px -45px}.anchor{display:inline-block;margin-left:3px;opacity:.0;position:relative;top:1px;width:1em;height:1em;background:url("../img/icons/anchor_16.svg") 0 80% no-repeat;background-size:16px;-moz-transition:opacity 0.1s;-webkit-transition:opacity 0.1s;transition:opacity 0.1s}h1:hover .anchor,h2:hover .anchor,h3:hover .anchor,h4:hover .anchor,dt:hover .anchor,li:hover .anchor{opacity:1}.box{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;display:block;margin-bottom:0;border-top:0;border-left:0;border-right:0;padding-left:0;padding-right:0}.box-dim{background-color:#fafafa}@media only screen and (min-width: 768px){.box{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-moz-box-shadow:0px 1px 1px 0px rgba(0,0,0,0.15);-webkit-box-shadow:0px 1px 1px 0px rgba(0,0,0,0.15);box-shadow:0px 1px 1px 0px rgba(0,0,0,0.15);display:inline-block;margin-bottom:20px;padding-left:20px;padding-right:20px;border:0}}a.indent{-moz-box-shadow:inset 0 1px 2px 0 #333;-webkit-box-shadow:inset 0 1px 2px 0 #333;box-shadow:inset 0 1px 2px 0 #333;background:rgba(0,0,0,0.1);padding:10px 30px;text-weight:normal}a.indent:hover{background:rgba(0,0,0,0.2)}a.link-cta-positive,a.link-cta-negative{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#dd4814;color:#fff;display:inline-block;font-size:1.14286em;font-weight:300;text-decoration:none;margin:0;padding:8px 14px;text-align:center;-moz-transition:background 0.2s;-webkit-transition:background 0.2s;transition:background 0.2s;width:100%}a.link-cta-positive:hover,a.link-cta-negative:hover{background-color:#ae3910}a.link-cta-positive .external,a.link-cta-negative .external{padding-right:1em;background-image:url("../img/icons/external-link-white.svg");background-repeat:no-repeat;background-size:11px;background-position:right top}@media only screen and (min-width: 769px){a.link-cta-positive .external,a.link-cta-negative .external{padding-right:.7em}}a.link-cta-negative{background-color:#b2b2b2}a.link-cta-negative:hover{background-color:#888888}.charms__list{list-style:none;margin-bottom:1em;margin-left:0;border-bottom:1px dotted #d4d4d4}.charms__list .charms__list--config{display:none}.charms__list .charms__list--toggle{display:block}.charms__list .charms__list--toggle.is-open+.charms__list--config{display:block}.charms__list .charms__list--config-name{border-top:0}.charms__list--item{font-size:1em;border-top:1px dotted #d4d4d4;padding:10px 0 0 10px;margin-bottom:10px}.charms__list--item:last-of-type{margin-bottom:10px}.charms__list--icon{margin-right:.4em;width:25px;height:25px}.charms__list--toggle{background:url("../img/shared/icon-arrow-down.svg") no-repeat center center;width:16px;height:100%;float:right;text-indent:-99999px;margin-right:20px}.charms__list--toggle.is-open{background-image:url("../img/shared/icon-arrow-up.svg");background-size:14px}.charms__list--config{padding-left:35px;padding-bottom:20px}.charms__list--config-name{font-size:1em;margin-top:15px;padding-top:15px;font-weight:400;border-top:1px dotted #d4d4d4}.charms__list--config-name:first-of-type{border-top:0}.charms__list--config-type{font-weight:400}.charms__list--config-description,.charms__list--config-setting{margin-left:30px;margin-top:8px}.charms__list--config-setting{font-size:0.875em;color:#888888;font-family:"Ubuntu Mono","Consolas","Monaco","Lucida Console","Courier New",Courier,monospace}body.no-svg .charms__list .charms__list--toggle{background-image:url("../img/shared/icon-arrow-down.png")}body.no-svg .charms__list .charms__list--toggle.is-open{background-image:url("../img/shared/icon-arrow-up.png")}pre{background:transparent;border:1px solid #888888;margin:0 0 1.5em 0}pre:not(:first-child){margin-top:1.5em}code.language-bash .comment{color:#888888}.cookie-policy{-moz-box-shadow:0 -1px 2px rgba(0,0,0,0.2);-webkit-box-shadow:0 -1px 2px rgba(0,0,0,0.2);box-shadow:0 -1px 2px rgba(0,0,0,0.2);background-color:#fae4dc;bottom:0;position:fixed;width:100%;z-index:100}.cookie-policy p{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;font-size:13px;margin-bottom:0;margin-left:0;padding:8px 0;width:100%}.cookie-policy .link-cta{background-image:url(../img/icons/close-orange.svg);background-repeat:no-repeat;color:#fff;float:right;font-size:1em;height:15px;margin:12px 0;margin-top:12px;padding:0;text-decoration:none;text-indent:-9999px;width:16px}html.no-svg .cookie-policy .link-cta,html.opera-mini .cookie-policy .link-cta{background-image:url(../img/icons/close-orange.png)}html.opera-mini .cookie-policy{position:relative;top:0}.deploy-command{margin-bottom:10px;position:relative}.deploy-command .deploy-command__field{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px 4px 4px 4px;-moz-border-radius:4px 4px 4px 4px;border-radius:4px 4px 4px 4px;-moz-box-shadow:inset 0 1px 2px 0 rgba(0,0,0,0.12);-webkit-box-shadow:inset 0 1px 2px 0 rgba(0,0,0,0.12);box-shadow:inset 0 1px 2px 0 rgba(0,0,0,0.12);background-image:url("../img/icons/code-snippet_16.svg");background-repeat:no-repeat;background-position:5px center;background-color:#fff;background-size:1.142857143em;width:100%;height:37px;border:1px solid #c1c1c1;padding:.6em;color:#888888;padding-left:2em;font-size:0.875em;white-space:nowrap;overflow:hidden;cursor:text}.deploy-command .command2clipboard__clip{cursor:pointer;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;line-height:1;position:absolute;right:1px;top:1px;background-color:#ffffff;padding:9px 8px 7px;border-left:1px solid #b2b2b2;display:none}.deploy-command .command2clipboard__clip.zeroclipboard-is-hover{background-color:#eeeeee}@media only screen and (min-width: 1030px){.deploy-command .command2clipboard__clip{display:inline-block}}.dropdown-menu{position:relative;display:block}.dropdown-menu.open .menu-link{background-color:#000000}.dropdown-menu.open .dropdown{display:block}.dropdown-menu .menu-link .border-box{display:block;color:#f2f2f4}.dropdown-menu .dropdown{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;display:none;position:absolute;z-index:1000;top:0;left:0;right:0;width:auto;background-color:#ffffff;box-shadow:0 1px 5px rgba(0,0,0,0.2)}.dropdown-menu .dropdown.right{left:auto;right:0;text-align:right}.dropdown-menu .dropdown.narrow{min-width:140px;width:auto}.dropdown-menu .dropdown a,.dropdown-menu .dropdown p,.dropdown-menu .dropdown li{color:#333333}.dropdown-menu .dropdown p{padding:11px 20px}.dropdown-menu .dropdown header,.dropdown-menu .dropdown footer{background-color:#ffffff}.dropdown-menu .dropdown header{padding:11px 20px;color:#f2f2f4;font-size:16px;font-weight:300}.dropdown-menu .dropdown footer{padding:20px}.dropdown-menu .dropdown ul{width:auto;left:0;right:0}.dropdown-menu .dropdown ul li a{width:auto;display:block;padding:15px 20px}.files .files__list{list-style:none;margin-bottom:1em;border-left:1px solid #cbcbcb;margin-left:1em}@media only screen and (min-width: 768px){.files .files__list{margin-left:0}}.files .files__list li{position:relative}.files .files__list li a:link,.files .files__list li a:visited{color:#333;text-decoration:none}.files .files__list li:before{content:'';width:12px;height:1px;background:#d4d4d4;display:inline-block;position:relative;top:-4px;margin-right:5px}.files .files__list li:last-child:after{content:'';width:4px;height:1em;position:absolute;display:block;left:-2px;top:.85em;background:#fff}.files .files__list ul:last-child>li a:after{content:'';width:4px;height:3em;position:absolute;display:block;left:-1.8em;top:-1.45em;background:white;cursor:default}.files .files__list .files__list{margin-left:1.3em}.files .files__list .files__list--item,.files .files__list .files__list--item-folder{font-size:0.875em;margin-bottom:0.75em}.files .files__list .files__list--item-folder{background-position:center right;background-size:12px;cursor:pointer}.files .files__list .files__list--item-folder:after{font-size:14px;display:block;content:"-";position:absolute;left:-7px;top:4px;padding:0 4px;line-height:0.9em;background:#ffffff;border:1px solid #888888}.files .files__list .files__list--item-folder.is-closed+ul{display:none}.files .files__list .files__list--item-folder.is-closed:after{content:"+";padding:0 2px}.files .files__actions--launchpad{background:url("../img/icons/icon-launchpad.svg") no-repeat;padding-left:1.4em}#main-content .row-hero{padding-top:20px;margin-top:0}#main-content .row-hero .intro{font-size:16px}@media only screen and (min-width: 769px){#main-content .row-hero{padding-top:60px}#main-content .row-hero .intro{font-size:1.4375em;margin-bottom:40px}}.how-to div div img{float:left;margin:0 20px 20px 0}header.banner a.external,header.banner a.external:hover{background-image:url("../img/icons/external-link-grey.png")}a.external,a.external:hover,header.banner nav.nav-primary ul li a.external:link,header.banner nav.nav-primary ul li a.external:visited,header.banner nav.nav-primary ul li a.external:hover{background-repeat:no-repeat}a.external,a.external:hover header.banner nav.nav-primary ul li a.external:link,header.banner nav.nav-primary ul li a.external:visited,header.banner nav.nav-primary ul li a.external:hover{background-position:right 14px top 14px;padding-right:35px;background-size:auto}@media only screen and (max-width: 769px){header.banner nav.nav-primary ul li a.external:link,header.banner nav.nav-primary ul li a.external:visited,header.banner nav.nav-primary ul li a.external:hover{background:none}header.banner nav.nav-primary ul li a.external:after{display:inline-block;width:11px;height:11px;margin-left:0.25em;background-image:url("../img/icons/external-link-dark.png");vertical-align:text-top}}.list__icons{margin-left:0;margin-bottom:5px}.list__icons li{list-style:none;float:left;padding:8px 8px 0 0;margin-bottom:0}.list__icons li img{width:24px;height:24px;vertical-align:top}.list__tick{list-style-image:url("../img/icons/tick.png")}.list__middot{margin-left:0;list-style:none}.list__middot li{display:inline}.list__middot li:after{content:"•";color:#888;margin:0 5px 0 8px;vertical-align:middle}.list__middot li.files__actions--last:after{content:""}.combined-list .list li{border-bottom:1px dotted #888;padding:10px 0}@media only screen and (max-width: 767px){.combined-list .last-col .list li:last-of-type{border-bottom:0;padding-bottom:0}}@media only screen and (min-width: 768px){.combined-list .list li:last-of-type{border-bottom:0;padding-bottom:0}}.events-list li{position:relative;padding-bottom:20px}.events-list dd{margin-left:0;background-position:0 center;background-repeat:no-repeat;background-size:20px 20px;padding:6px 20px 6px 24px}.events-list .event-map{display:none}.events-list .event-date{background-image:url("../img/icons/calendar.svg")}.events-list .location{background-image:url("../img/icons/location.svg")}@media only screen and (min-width: 769px){.events-list .event-details-wrapper{padding-left:120px}.events-list .event-map{-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;position:absolute;left:0;top:0;height:100px;width:100px;float:left;margin-right:10px;margin-top:5px;overflow:hidden;display:block}}body.no-svg .events-list .event-date{background-image:url("../img/icons/calendar.png")}body.no-svg .events-list .location{background-image:url("../img/icons/location.png")}.maintainers .maintainer__email{display:block}.ratings ul{margin-left:2px;margin-bottom:0}.ratings ul li{margin-bottom:0}.ratings ul li img{vertical-align:text-top}.ratings ul li:first-of-type{margin-left:0}.revisions__list{list-style:none;margin-left:0}.revisions__list .revisions__list-item{margin-bottom:1em}.revisions__list .revisions__list_meta{color:#888;margin-bottom:.2em}.revisions__list .revisions__list_meta_date{float:right}.section{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;overflow:hidden;padding-bottom:20px;padding-top:20px}.section .section__title{background:url(../img/shared/icon-arrow-up.svg) no-repeat center right;cursor:pointer;margin-bottom:1em}.section.is-closed{height:60px}.section.is-closed .section__title{background-image:url(../img/shared/icon-arrow-down.svg)}.no-svg .row.section .section__title{background:url(../img/shared/icon-arrow-up.png)}.no-svg .row.section.is-closed .section__title{background:url(../img/shared/icon-arrow-down.png)}footer .section{margin-bottom:1em;padding-bottom:1em}footer .section.is-closed{height:auto;padding-bottom:0}footer .section.is-closed ul{display:none}@media only screen and (min-width: 769px){.row .section .section__title{background-image:none;cursor:auto}.row .section.is-closed{height:auto}}.list--concealed .list-item{display:none}.list--concealed .list-item:first-of-type{display:list-item}.list--concealed.list--visible-6 .list-item:nth-child(-n+6){display:list-item}.list--concealed.list--visible-4 .list-item:nth-child(-n+4){display:list-item}.list--concealed.list--visible-2 .list-item:nth-child(-n+2){display:list-item}.list--concealed a.btn__see--less{display:none}.list--concealed a.btn__see--more{display:inline}.list--revealed .list__controls,.list--concealed .list__controls{display:block;margin-top:2em}.list--revealed .list--item{display:list-item}.list--revealed a.btn__see--less{display:inline}.list--revealed a.btn__see--more{display:none}a.btn__see--more,a.btn__see--less{-moz-transition:background 0.2s;-webkit-transition:background 0.2s;transition:background 0.2s;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;color:#333;border-radius:2px;border:1px solid #b2b2b2;background:#fff;padding:0.38462em 1.15385em}a.btn__see--more:hover,a.btn__see--less:hover{background:#eee;text-decoration:none}.strip-dark,.strip-light{clear:both}.strip-dark{background-color:#2c001e;background-image:none;background-repeat:repeat;color:#fff}.strip-dark.solid{background-image:none;background-color:#2c001e}.strip-dark ul,.strip-dark ol{margin:0;padding:0}.strip-dark .icon,.strip-dark ol span{-moz-background-size:40px 40px;-webkit-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;background-image:url(../img/icons/list-icon-background.png);background-repeat:no-repeat;display:block;margin:0 20px 20px 0;padding:24px;float:left;width:16px;height:16px;padding:12px}.strip-light .icon,.strip-dark .icon{position:absolute}.strip-light{background-color:rgba(255,255,255,0.6)}.strip-dark ol,.strip-dark ul{padding:20px 0}.strip-light .icon{display:block;background-image:url(../img/icons/list-icon-background.png);padding:24px;margin:0 auto 48px}.strip-dark .connected-list li,.strip-light .connected-list li{margin-bottom:10px;min-height:52px}.strip-dark .connected-list li p,.strip-light .connected-list li p,.strip-dark .connected-list li h3,.strip-light .connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li p .strip-dark ol.connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li span{float:left;font-size:22px;font-weight:normal;height:26px;margin-left:0;margin-right:20px;padding-top:2px;position:absolute;text-align:center;width:16px}.strip-white{background:#fff}.strip-trans{background:transparent}.strip-green{background-image:linear-gradient(to right, #6fad23 0%, #7cc227 100%);overflow:hidden}.strip-green,.strip-green a{color:#fff}.strip-blue{background-image:linear-gradient(to right, #1076a2 0%, #359fcd 100%);overflow:hidden}.strip-blue,.strip-blue a{color:#fff}.tag-list{list-style:none;margin:0}.tag-list--item{display:inline-block;text-transform:lowercase}.tag-list--item a:link,.tag-list--item a:visited{color:#333}.tag-list--item a:after{content:','}.tag-list--item:last-child a:after{content:''}#twitter-feed,#blog-feed{margin:35px 0}#twitter-feed>ul,#blog-feed>ul{list-style:none;margin-left:0}#twitter-feed>ul li,#blog-feed>ul li{position:relative;margin-bottom:30px}#twitter-feed .user,#blog-feed .user{font-size:0.875em;margin-bottom:0.5em}#twitter-feed .user img,#blog-feed .user img{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;width:24px;height:24px;vertical-align:middle;margin-right:5px}#twitter-feed .user a:link,#twitter-feed .user a:visited,#twitter-feed .user a:hover,#blog-feed .user a:link,#blog-feed .user a:visited,#blog-feed .user a:hover{text-decoration:none}#twitter-feed .user span[data-scribe="element:name"],#blog-feed .user span[data-scribe="element:name"]{color:#333}#twitter-feed .tweet,#blog-feed .tweet{padding-left:33px;margin-bottom:.3em}#twitter-feed .timePosted,#blog-feed .timePosted{padding-left:33px;font-size:0.875em}#twitter-feed .interact,#blog-feed .interact{padding-left:33px}#twitter-feed .interact a:link,#twitter-feed .interact a:visited,#blog-feed .interact a:link,#blog-feed .interact a:visited{margin-right:20px}@media only screen and (min-width: 769px){#twitter-feed .timePosted{position:absolute;top:0;right:0;padding-left:0}}.spaced-segment{margin-bottom:50px}.spaced-segment h3{margin-bottom:1.3em}.strip-dark,.strip-light{clear:both}.strip-dark{background-color:#2c001e;background-image:none;background-repeat:repeat;color:#fff}.strip-dark.solid{background-image:none;background-color:#2c001e}.strip-dark ul,.strip-dark ol{margin:0;padding:0}.strip-dark .icon,.strip-dark ol span{-moz-background-size:40px 40px;-webkit-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;background-image:url(../img/icons/list-icon-background.png);background-repeat:no-repeat;display:block;margin:0 20px 20px 0;padding:24px;float:left;width:16px;height:16px;padding:12px}.strip-light .icon,.strip-dark .icon{position:absolute}.strip-light{background-color:rgba(255,255,255,0.6)}.strip-dark ol,.strip-dark ul{padding:20px 0}.strip-light .icon{display:block;background-image:url(../img/icons/list-icon-background.png);padding:24px;margin:0 auto 48px}.strip-dark .connected-list li,.strip-light .connected-list li{margin-bottom:10px;min-height:52px}.strip-dark .connected-list li p,.strip-light .connected-list li p,.strip-dark .connected-list li h3,.strip-light .connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li p .strip-dark ol.connected-list li h3{padding-left:50px}.strip-dark ol.connected-list li span{float:left;font-size:22px;font-weight:normal;height:26px;margin-left:0;margin-right:20px;padding-top:2px;position:absolute;text-align:center;width:16px}.strip-white{background:#fff}.strip-trans{background:transparent}.strip-green{background-image:linear-gradient(to right, #6fad23 0%, #7cc227 100%);overflow:hidden}.strip-green,.strip-green a{color:#fff}.strip-blue{background-image:linear-gradient(to right, #1076a2 0%, #359fcd 100%);overflow:hidden}.strip-blue,.strip-blue a{color:#fff}@media only screen and (min-width: 769px){.tip,.command2clipboard__clip{position:relative;display:inline-block}.tip .tip-content,.command2clipboard__clip .tip-content{position:absolute;z-index:98;left:-1000px;right:-1000px;top:-30px;font-weight:300;margin:auto;display:block;text-align:center;white-space:nowrap}.tip:hover .tip-content:after,.command2clipboard__clip.zeroclipboard-is-hover .tip-content:after{display:table;z-index:98;margin:auto;color:#fff;border-radius:3px;background:#000;box-shadow:none;font-size:12px;content:attr(data-tooltip);padding:4px 6px;white-space:nowrap;text-align:center}.tip:hover .tip-content:before,.command2clipboard__clip.zeroclipboard-is-hover .tip-content:before{position:absolute;top:100%;left:50%;margin-left:-5px;content:'';border:solid transparent;border-width:5px;border-top-color:#000}}.fake{display:block}*{-webkit-backface-visibility:hidden;margin:0}html{height:100%}body{height:100%;font-size:1.0em;font-family:'Ubuntu', Arial, 'libra sans', sans-serif;font-weight:300}hr{border:none;background:#B2B2B2;width:100%;height:1px;display:block;width:100%;float:left;margin-bottom:20px}ul,ol{margin-left:0}a.alt{color:#333}a.alt:hover{color:#dd4814}a:active,a:focus{outline:none}::selection{color:#FFF;background:#dd4814}::-moz-selection{color:#FFF;background:#dd4814}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:300;src:url("../fonts/ubuntu-l-webfont.eot?") format("eot"),url("../fonts/ubuntu-l-webfont.woff2") format("woff2"),url("../fonts/ubuntu-l-webfont.woff") format("woff"),url("../fonts/ubuntu-l-webfont.ttf") format("truetype"),url("../fonts/ubuntu-l-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:italic;font-weight:300;src:url("../fonts/ubuntu-li-webfont.eot?") format("eot"),url("../fonts/ubuntu-li-webfont.woff2") format("woff2"),url("../fonts/ubuntu-li-webfont.woff") format("woff"),url("../fonts/ubuntu-li-webfont.ttf") format("truetype"),url("../fonts/ubuntu-li-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:400;src:url("../fonts/ubuntu-r-webfont.eot?") format("eot"),url("../fonts/ubuntu-r-webfont.woff2") format("woff2"),url("../fonts/ubuntu-r-webfont.woff") format("woff"),url("../fonts/ubuntu-r-webfont.ttf") format("truetype"),url("../fonts/ubuntu-r-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:500;src:url("../fonts/ubuntu-m-webfont.eot?") format("eot"),url("../fonts/ubuntu-m-webfont.woff2") format("woff2"),url("../fonts/ubuntu-m-webfont.woff") format("woff"),url("../fonts/ubuntu-m-webfont.ttf") format("truetype"),url("../fonts/ubuntu-m-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:italic;font-weight:500;src:url("../fonts/ubuntu-mi-webfont.eot?") format("eot"),url("../fonts/ubuntu-mi-webfont.woff2") format("woff2"),url("../fonts/ubuntu-mi-webfont.woff") format("woff"),url("../fonts/ubuntu-mi-webfont.ttf") format("truetype"),url("../fonts/ubuntu-mi-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:"Ubuntu";font-style:normal;font-weight:700;src:url("../fonts/ubuntu-b-webfont.eot?") format("eot"),url("../fonts/ubuntu-b-webfont.woff2") format("woff2"),url("../fonts/ubuntu-b-webfont.woff") format("woff"),url("../fonts/ubuntu-b-webfont.ttf") format("truetype"),url("../fonts/ubuntu-b-webfont.svg#Ubuntu") format("svg")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:400;src:url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/GZMdC02DTXXx8AdUvU2etw.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:700;src:url("https://themes.googleusercontent.com/static/fonts/ubuntu/v5/pqisLQoeO9YTDCNnlQ9bfz8E0i7KZn-EPnyo3HZu7kw.woff") format("woff")}.accordion{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;background:#FFF;box-shadow:0 1px 1px rgba(0,0,0,0.1);margin-bottom:40px}.disabled .accordion{opacity:.5;pointer-events:none}.accordion .accordion__title{border-bottom:1px dotted #B2B2B2;padding:13px 20px 12px;margin:0;font-size:1.3em}.accordion .accordion__tab{border-bottom:1px dotted #B2B2B2}.accordion .accordion__tab:last-of-type{border:none}.accordion .accordion__tab .accordion__tab-title{padding:12px 20px;margin:0;color:#888;cursor:pointer;background:transparent url("../img/icons/accordion-open.svg") top 20px right 20px no-repeat}.accordion .accordion__tab .accordion__tab-title.active{background-image:url("../img/icons/accordion-close.svg")}.accordion .accordion__tab .accordion__tab-title.active+.accordion__tab-content{max-height:3000px;transition:max-height 0.5s ease-in}.accordion .accordion__tab .accordion__tab-content{max-height:0;transition:max-height 0.5s ease-out;overflow:hidden}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list{list-style-type:none;padding:0 20px 14px;margin:0}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item{margin-bottom:0.15em}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;color:#333;width:100%;display:inline-block;padding-right:20px}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link:hover{color:#dd4814;text-decoration:none}.disabled .accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link{color:#333}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active{font-weight:400}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active .accordion__tab-link{background:transparent url("../img/icons/cross.svg") top 7px right 0px no-repeat}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active:hover{color:#dd4814}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.active:hover .accordion__tab-link{color:#dd4814;background-image:url("../img/icons/cross-orange.svg")}.cta-group .cta-group__link{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:3px 0px 0px 3px;-moz-border-radius:3px 0px 0px 3px;border-radius:3px 0px 0px 3px;display:inline-block;padding:10px 14px;text-align:center;color:#ffffff;background-color:#dd4814}.cta-group .cta-group__link:hover{cursor:pointer;text-decoration:none;background-color:#c03f11}.cta-group.secondary .cta-group__link{color:#dd4814;border:1px solid #b2b2b2;background-color:#FFF;line-height:1}.cta-group.secondary .cta-group__link:hover{cursor:pointer;background-color:#F2F2F2}a.link-cta-ubuntu,button.cta-ubuntu,input[type='submit'],form button[type='submit'],form input[type='submit']{font-size:1em;border:none;max-height:37px}a.link-cta-ubuntu[disabled],a.link-cta-ubuntu.disabled,button.cta-ubuntu[disabled],button.cta-ubuntu.disabled,input[type='submit'][disabled],input[type='submit'].disabled,form button[type='submit'][disabled],form button[type='submit'].disabled,form input[type='submit'][disabled],form input[type='submit'].disabled{cursor:default;opacity:.5}a.link-cta-ubuntu.clear,button.cta-ubuntu.clear,input[type='submit'].clear,form button[type='submit'].clear,form input[type='submit'].clear{background:none;color:#333}a.link-cta-ubuntu.secondary,button.cta-ubuntu.secondary,input[type='submit'].secondary,form button[type='submit'].secondary,form input[type='submit'].secondary{color:#dd4814;border:1px solid #b2b2b2;background:#FFF}a.link-cta-ubuntu.secondary.external,button.cta-ubuntu.secondary.external,input[type='submit'].secondary.external,form button[type='submit'].secondary.external,form input[type='submit'].secondary.external{background-image:url("../img/external-link-black.svg");background-size:16px 16px;background-repeat:no-repeat;background-position:top 8px right 8px}a.link-cta-ubuntu.secondary:hover,button.cta-ubuntu.secondary:hover,input[type='submit'].secondary:hover,form button[type='submit'].secondary:hover,form input[type='submit'].secondary:hover{background-color:#F2F2F2;cursor:pointer}a.link-cta-ubuntu.secondary[disabled],a.link-cta-ubuntu.secondary .disabled,button.cta-ubuntu.secondary[disabled],button.cta-ubuntu.secondary .disabled,input[type='submit'].secondary[disabled],input[type='submit'].secondary .disabled,form button[type='submit'].secondary[disabled],form button[type='submit'].secondary .disabled,form input[type='submit'].secondary[disabled],form input[type='submit'].secondary .disabled{cursor:default;color:#fff;border:1px solid #b2b2b2;background:#eee}a.link-cta-ubuntu.secondary[disabled]:hover,a.link-cta-ubuntu.secondary .disabled:hover,button.cta-ubuntu.secondary[disabled]:hover,button.cta-ubuntu.secondary .disabled:hover,input[type='submit'].secondary[disabled]:hover,input[type='submit'].secondary .disabled:hover,form button[type='submit'].secondary[disabled]:hover,form button[type='submit'].secondary .disabled:hover,form input[type='submit'].secondary[disabled]:hover,form input[type='submit'].secondary .disabled:hover{background:#EEE}a.link-cta-ubuntu.text-button,button.cta-ubuntu.text-button,input[type='submit'].text-button,form button[type='submit'].text-button,form input[type='submit'].text-button{background-color:transparent;color:#dd4814}a.link-cta-ubuntu.text-button:hover,button.cta-ubuntu.text-button:hover,input[type='submit'].text-button:hover,form button[type='submit'].text-button:hover,form input[type='submit'].text-button:hover{text-decoration:underline}a.link-cta-ubuntu.full,button.cta-ubuntu.full,input[type='submit'].full,form button[type='submit'].full,form input[type='submit'].full{display:block;width:100%}@media screen and (max-width: 768px){a.link-cta-ubuntu,button.cta-ubuntu,input[type='submit'],form button[type='submit'],form input[type='submit']{margin-bottom:20px}}a.link-cta-ubuntu{line-height:20px}.cta-group{float:left;width:auto;clear:both;position:relative;overflow:hidden}.cta-group .cta-group__link{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;max-height:36px;padding-right:49px;width:100%;line-height:1.2;position:relative;margin:0;text-align:left}.cta-group .cta-group__link:after{-webkit-border-radius:0px 3px 3px 0px;-moz-border-radius:0px 3px 3px 0px;border-radius:0px 3px 3px 0px;content:'';display:block;height:36px;width:34px;background:red;position:absolute;top:0;right:0;background-image:url("../img/chevron-white.svg");background-color:#dd4814;background-repeat:no-repeat;background-position:center}.cta-group .cta-group__link:hover{background-color:#dd4814}.cta-group .cta-group__link:hover:after{background-color:#c03f11}.cta-group .cta-group__dropdown{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;right:0;list-style:none;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);z-index:20;max-height:1000px;transition:max-height 0.3s ease-in;overflow:hidden;position:relative;clear:both}.cta-group .cta-group__dropdown.ng-hide{display:block !important;max-height:0;overflow:hidden;transition:max-height 0.3s ease-out}.cta-group .cta-group__dropdown .cta-group__item{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;clear:both;padding:5px 10px;margin:0}.cta-group .cta-group__dropdown .cta-group__item a{color:#333;cursor:pointer;width:100%;float:left;margin:0}.cta-group .cta-group__dropdown .cta-group__item a:hover{color:#dd4814;text-decoration:none}.cta-group.secondary .cta-group__link{float:left;max-height:36px;width:100%}.cta-group.secondary .cta-group__link:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background-image:url("../img/icons/accordion-open.svg");background-repeat:no-repeat;background-color:#fff;border:1px solid #b2b2b2;border-left:none;top:-1px;right:-1px}.cta-group.secondary .cta-group__link:hover{background-color:#FFF}.cta-group.secondary .cta-group__link:hover:after{background-color:#F2F2F2}.flash-messages{margin:0px auto;padding:0;max-width:1440px}@media screen and (max-width: 1030px){.flash-messages{margin:0px 10px 20px}}.flash-messages .flash-messages__item{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;margin:0 0 20px;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.flash-messages .flash-messages__item.info{background-image:url("../img/icons/info.png");background-image:url("../img/icons/info.svg"),none}.flash-messages .flash-messages__item.success{background-image:url("../img/icons/success.png");background-image:url("../img/icons/success.svg"),none}.flash-messages .flash-messages__item.warning{background-image:url("../img/icons/warning.png");background-image:url("../img/icons/warning.svg"),none}.flash-messages .flash-messages__item.error{background-image:url("../img/icons/error.png");background-image:url("../img/icons/error.svg"),none}form input[type='text'],form input[type='number'],form input[type='search'],form input[type='password'],form input[type='email'],form input[type='url'],form textarea,form select,tags-input .tags .input,.accounts .api li input[type='text']{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;background:#FFF;color:#333;border:1px solid #D2D2D2;display:block;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-size:1em;font-weight:300;padding:0px 13px}form input[type='text']:active,form input[type='number']:active,form input[type='search']:active,form input[type='password']:active,form input[type='email']:active,form input[type='url']:active,form textarea:active,form select:active,tags-input .tags .input:active,.accounts .api li input[type='text']:active{border-color:#B2B2B2;outline:none}form input[type='text']:focus,form input[type='number']:focus,form input[type='search']:focus,form input[type='password']:focus,form input[type='email']:focus,form input[type='url']:focus,form textarea:focus,form select:focus,tags-input .tags .input:focus,.accounts .api li input[type='text']:focus{border-color:#B2B2B2;outline:none}form input.invalid[type='text'],form input.invalid[type='number'],form input.invalid[type='search'],form input.invalid[type='password'],form input.invalid[type='email'],form input.invalid[type='url'],form textarea.invalid,form select.invalid,tags-input .tags .invalid.input,.accounts .api li input.invalid[type='text'],form input.ng-invalid[type='text'],form input.ng-invalid[type='number'],form input.ng-invalid[type='search'],form input.ng-invalid[type='password'],form input.ng-invalid[type='email'],form input.ng-invalid[type='url'],form textarea.ng-invalid,form select.ng-invalid,tags-input .tags .ng-invalid.input,.accounts .api li input.ng-invalid[type='text']{border-color:#d90000}form input[disabled="disabled"][type='text'],form input[disabled="disabled"][type='number'],form input[disabled="disabled"][type='search'],form input[disabled="disabled"][type='password'],form input[disabled="disabled"][type='email'],form input[disabled="disabled"][type='url'],form textarea[disabled="disabled"],form select[disabled="disabled"],tags-input .tags [disabled="disabled"].input,.accounts .api li input[disabled="disabled"][type='text']{-webkit-text-fill-color:#333;border-color:#D2D2D2;background-color:transparent}label{position:relative}.disabled label{cursor:default}form li.help-msg{margin-bottom:1em}form li.help-msg .help{color:#888;font-size:0.875em}form label span{color:#333}form input[type='text'],form input[type='number'],form input[type='search'],form input[type='password'],form input[type='email'],form input[type='url']{padding:7px 10px}form input[type='text']::-webkit-input-placeholder,form input[type='number']::-webkit-input-placeholder,form input[type='search']::-webkit-input-placeholder,form input[type='password']::-webkit-input-placeholder,form input[type='email']::-webkit-input-placeholder,form input[type='url']::-webkit-input-placeholder{color:#888}form input[type='text']:-moz-placeholder,form input[type='number']:-moz-placeholder,form input[type='search']:-moz-placeholder,form input[type='password']:-moz-placeholder,form input[type='email']:-moz-placeholder,form input[type='url']:-moz-placeholder{color:#888}form input[type='text']::-moz-placeholder,form input[type='number']::-moz-placeholder,form input[type='search']::-moz-placeholder,form input[type='password']::-moz-placeholder,form input[type='email']::-moz-placeholder,form input[type='url']::-moz-placeholder{color:#888}form input[type='text']:-ms-input-placeholder,form input[type='number']:-ms-input-placeholder,form input[type='search']:-ms-input-placeholder,form input[type='password']:-ms-input-placeholder,form input[type='email']:-ms-input-placeholder,form input[type='url']:-ms-input-placeholder{color:#888}form input[type='number']{padding-right:15px}form input[type='search']{-webkit-appearance:textfield}form input[type='search']::-webkit-search-decoration,form input[type='search']::-webkit-search-cancel-button{-webkit-appearance:none}form input[type='radio'],form input[type='image']{display:inline-block;margin-right:10px}form textarea{overflow:auto;height:auto;min-height:175px;padding:7px 10px;vertical-align:top}form select{display:block;clear:both;cursor:pointer;margin:0;background-image:url("../img/icons/accordion-open.svg");background-repeat:no-repeat;background-position:top 16px right 10px;padding:6px 30px 7px 10px;-moz-appearance:none;text-indent:0.01px;text-overflow:''}form select[multiple],form select[size]{height:auto;background-image:none;padding-top:10px}form select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}form select[disabled]{color:#888;background-image:none}form select::-ms-expand{display:none}form fieldset{background:none;margin-left:0;padding:0}.checkbox{visibility:hidden;width:0;height:0;margin-right:0;position:absolute}.checkbox+.checkbox-label{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-left:20px;position:relative}.checkbox+.checkbox-label:before{content:"";display:inline-block;width:20px;height:20px;position:absolute;top:0;left:0;background:url("../img/checkbox.svg") no-repeat;background-size:13px 13px;background-position:0px 3px}.checkbox:checked+.checkbox-label:before{background:url("../img/checkbox-checked.svg") no-repeat;background-position:0px 3px}.checkbox[disabled="disabled"]+.checkbox-label:before{cursor:default;opacity:0.5}.field-error,.errors{color:#DF382C}.field-error .errorlist,.errors .errorlist{margin:0}.field-error .errorlist li,.errors .errorlist li{margin:0 0 14px 0}.inline{display:inline-block;width:100%;font-size:0;margin-bottom:10px}.inline.error{background-color:#fdf5f5;box-shadow:0px 0px 0px 5px #fdf5f5}.inline.error .ng-invalid{border-color:#D2D2D2}.inline:last-of-type{margin-bottom:0}.inline label{display:inline-block;float:none;font-size:16px;margin:0}.inline input[type='submit'],.inline input[type='text'],.inline input[type='number'],.inline input[type='search'],.inline input[type='password'],.inline input[type='email'],.inline input[type='checkbox'],.inline select{display:inline-block;clear:none;margin:0;float:none;font-size:16px}.inline input[type='submit']:invalid,.inline input[type='text']:invalid,.inline input[type='number']:invalid,.inline input[type='search']:invalid,.inline input[type='password']:invalid,.inline input[type='email']:invalid,.inline input[type='checkbox']:invalid,.inline select:invalid{-moz-box-shadow:none}.inline input[type='submit']:-moz-submit-invalid,.inline input[type='text']:-moz-submit-invalid,.inline input[type='number']:-moz-submit-invalid,.inline input[type='search']:-moz-submit-invalid,.inline input[type='password']:-moz-submit-invalid,.inline input[type='email']:-moz-submit-invalid,.inline input[type='checkbox']:-moz-submit-invalid,.inline select:-moz-submit-invalid{box-shadow:none}.inline input[type='submit']:-moz-ui-invalid,.inline input[type='text']:-moz-ui-invalid,.inline input[type='number']:-moz-ui-invalid,.inline input[type='search']:-moz-ui-invalid,.inline input[type='password']:-moz-ui-invalid,.inline input[type='email']:-moz-ui-invalid,.inline input[type='checkbox']:-moz-ui-invalid,.inline select:-moz-ui-invalid{box-shadow:none}.inline div{float:none;margin:0}.inline input.cta-ubuntu,.inline a.link-cta-ubuntu,.inline button.cta-ubuntu{font-size:16px}.inline .icon{position:absolute;top:11px;right:10px;cursor:pointer}.inline .error-message{font-size:12px;color:#e85232;margin-top:10px;margin-bottom:10px;font-weight:normal}.form-inline label,.form-inline button,.form-inline input[type='submit'],.form-inline input[type='text'],.form-inline input[type='number'],.form-inline input[type='search'],.form-inline input[type='password'],.form-inline input[type='email'],.form-inline input[type='checkbox'],.form-inline select{display:inline-block;width:auto;vertical-align:middle;margin-bottom:0}.form-inline input[type='submit'] input[type='text'],.form-inline input[type='number'],.form-inline input[type='search'],.form-inline input[type='password'],.form-inline input[type='email'],.form-inline input[type='checkbox'],.form-inline select{margin-left:10px}.controls{position:absolute;top:0;right:20px}.controls a,.controls button{margin-left:20px}.icon{background-size:16px 16px;width:16px;height:16px;padding:0;display:inline-block}.icon.icon__loading{background:url("../img/in_progress.png") no-repeat;-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;animation:spin 1s infinite linear}a.icon{cursor:pointer}dl dt{clear:left}dl dd{color:#888;margin-left:0}dl dt,dl dd{display:inline-block;float:left;line-height:37px;margin-bottom:10px !important}tags-input{outline:none}tags-input .host:focus{outline:none}tags-input .tags:focus,tags-input .tags.focused{outline:none}tags-input .tags .tag-list{margin:4px 0 0;padding:0;list-style-type:none;width:100%;float:left}tags-input .tags .tag-item{display:inline-block;float:left;font-family:Ubuntu,Arial,"libra sans",sans-serif;font-size:1em;font-weight:300;height:30px;line-height:30px;cursor:default;color:#000;padding-right:15px;position:relative;margin:0 11px 0 0}tags-input .tags .tag-item .remove-button{display:inline-block;width:12px;height:12px;text-indent:-999em;background:url("../img/icons/cross.svg") no-repeat;background-size:12px 12px;position:absolute;right:0;top:9px;cursor:pointer}tags-input .tags .tag-item .remove-button:hover{text-decoration:none}tags-input .tags .input{padding:7px 10px;width:100% !important;float:left;position:relative !important;left:0}tags-input .tags .input::-ms-clear{display:none}tags-input .suggestion-list{background:#FFF;padding:10px 8px;border:1px solid #D2D2D2;border-top:0;border-radius:0 0 2px 2px;display:none}tags-input .suggestion-list li:hover{background:#EEE;cursor:pointer}tags-input[disabled] .host:focus{outline:none}tags-input[disabled] .tags{cursor:default}tags-input[disabled] .tags .tag-item .remove-button{cursor:default}tags-input[disabled] .tags .input{cursor:default}.tag-link{margin-right:10px}.tag-link:last-of-type:after{content:''}.pagination{margin:10px 0;text-align:center}.pagination .inactive{color:#AEA79F}.pagination a,.pagination span{margin:0 5px}.search{position:relative;padding-bottom:20px}.search input[type='search']{-webkit-appearance:textfield}.search .search__input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;list-style:none;background:#FFF;box-shadow:0 1px 1px rgba(0,0,0,0.1);width:100%;border:none;padding:13px 20px;font-size:1.25em}.search .search__input::-webkit-input-placeholder{color:#000 !important}.search .search__input:-moz-placeholder{color:#000 !important}.search .search__input::-moz-placeholder{color:#000 !important}.search .search__input:-ms-input-placeholder{color:#000 !important}.search .search__input[disabled="disabled"]{background-color:#fff;opacity:.5;pointer-events:none}.search .search__input[disabled="disabled"]+.search__submit.close{pointer-events:none;opacity:.5}.search .search__submit{position:absolute;top:15px;right:25px;background-color:transparent;background-image:url("../img/search-icon.svg");background-repeat:no-repeat;text-indent:-999em;display:block;width:21px;height:20px;overflow:hidden;outline:none;padding:0;border:none}.search .search__submit:hover{background-color:transparent;background-image:url("../img/search-icon.svg")}.search .search__submit.close{background-image:url("../img/icons/cross.svg");background-size:21px;margin-top:2px}.search .search__submit.close:hover{background-image:url("../img/icons/cross.svg")}.spinner-col{width:10px}.spinner{float:left;margin:0 auto;text-indent:-9999em}.spinner.spin{background:url("../img/in_progress.png") no-repeat;background-size:16px 16px;width:16px;height:16px;-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;animation:spin 1s infinite linear;padding:0}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}table{text-align:left;width:100%;margin-bottom:40px;border-collapse:separate;border-spacing:0;font-size:16px}table th,table td{background:transparent;text-align:left;padding:13px 10px}table th .checkbox+.checkbox-label::before,table td .checkbox+.checkbox-label::before{top:-2px}table thead th{background:transparent;color:#888;border:none;border-bottom:1px solid #B2B2B2}table tbody tr:hover .icon-controls a{opacity:1}table tbody td{border:none;border-bottom:1px dotted #B2B2B2;position:relative}table tbody td.icon-controls{text-align:right}table tbody td.icon-controls a{opacity:0}table tbody td input[type="text"]{position:absolute;left:10px;top:6px;width:80%}.table-listing{text-align:left;width:100%;margin:0 0 40px 0;border-collapse:separate;border-spacing:0}.table-listing .table-listing__row:hover .table-listing__cell{background-color:#FFF}.table-listing .table-listing__row.error{background-color:#F3E3E2}.table-listing .table-listing__row.error .status{color:#DD3832}.table-listing .table-listing__row.progress{background-color:rgba(25,182,238,0.1)}.table-listing .table-listing__row.selected{background-color:#FFF}.table-listing .table-listing__header{background:transparent;color:#888;border:none;border-bottom:1px solid #B2B2B2}.table-listing .table-listing__header .table-listing__header-link{background-repeat:no-repeat;background-position:top 8px right 0;color:#888}.table-listing .table-listing__header .table-listing__header-link:hover{color:#333;text-decoration:none;border-bottom:1px solid #333}.table-listing .table-listing__header .table-listing__header-link:focus,.table-listing .table-listing__header .table-listing__header-link:active,.table-listing .table-listing__header .table-listing__header-link:visited{text-decoration:none}.table-listing .table-listing__header .table-listing__header-link.active{color:#333}.table-listing .table-listing__header .table-listing__header-link.sort{border-bottom:1px solid #333}.table-listing .table-listing__header .divide{width:1px;display:inline-block;background:#D2D2D2 none repeat scroll 0% 0%;height:10px;padding:0px;margin:0px 5px}.table-listing .table-listing__cell{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border:none;border-bottom:1px dotted #B2B2B2;position:relative}.table-listing .table-listing__cell.icon-controls{text-align:right;opacity:0}.table-listing .table-listing__cell input,.table-listing .table-listing__cell select{position:absolute;left:10px;top:5px;width:80%}.table-listing .fixed{max-width:200px;min-width:200px;width:200px;padding-left:0}.table-listing__header .table-listing .fixed{padding-left:0}.table-listing.no-hover .table-listing__row:hover .table-listing__cell,.table-listing.no-hover .table-listing__row:hover td{background-color:transparent}.t1{width:1%}.t5{width:5%}.t10{width:10%}.t12{width:12.5%}.t15{width:15%}.t19{width:19%}.t20{width:20%}.t24{width:24%}.t25{width:25%}.t30{width:30%}.t33{width:33.333%}.t35{width:35%}.t37{width:37.5%}.t40{width:40%}.t45{width:45%}.t50{width:50%}.t55{width:55%}.t60{width:60%}.t62{width:62.5%}.t65{width:65%}.t66{width:66.666%}.t70{width:70%}.t75{width:75%}.t80{width:80%}.t85{width:85%}.t87{width:87.5%}.t90{width:90%}.t95{width:95%}#commissioning_scripts .script-content.slider{overflow:hidden}#commissioning_scripts .script-content.slider pre{margin-top:20px}h1 span,h2 span,h3 span,h4 span,h5 span{color:#888;font-size:75%;padding-left:20px}pre{border:0;background-color:#FFF;border-radius:2px}.yui3-node-add-widget{width:65.9292%;margin-right:2.21238%}@media screen and (max-width: 768px){.yui3-node-add-widget{width:100%;margin:0}}.yui3-node-add-widget .buttons{margin-top:30px}.yui3-node-add-widget .add-link img.icon{margin-right:6px}.yui3-overlay{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;background-color:#fff;-webkit-box-shadow:0 0 10px 0 rgba(0,0,0,0.5);box-shadow:0 0 10px 0 rgba(0,0,0,0.5)}.yui3-overlay ul{padding:5px 0}.yui3-overlay li{float:none}.yui3-overlay li:last-child a{border-bottom:none}.yui3-overlay a{display:block;padding:6px 20px;color:#dd4814 !important;border-bottom:1px solid #e5e2e0}.yui3-overlay a:focus,.yui3-overlay a:hover{background-color:#f2f2f2}.yui3-overlay-hidden{display:none}.yui3-widget-mask{background-color:#000;opacity:0.3}.yui3-panel{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;background-color:#FFF;padding:50px 80px 50px 80px;-webkit-box-shadow:0 0 15px 0 #000;box-shadow:0 0 15px 0 #000}.yui3-panel .yui3-button{float:right}.yui3-panel .yui3-button.link-button{float:left;padding-left:0;padding-right:0;color:#dd4814;border:none;background:none;-webkit-box-shadow:none;box-shadow:none;font-size:13px}.yui3-widget-hd{margin-bottom:30px;font-size:24px}.yui3-widget-ft{margin-top:50px}.yui3-widget-button-wrapper{width:100%}.icon{margin-left:5px;width:16px;height:16px;display:inline-block;text-indent:999em;overflow:hidden;background-repeat:no-repeat;background-size:16px 16px;vertical-align:middle}.icon.info{background-image:url("../img/icons/info.png");background-image:url("../img/icons/info.svg"),none}.icon.edit{background-image:url("../img/icons/edit.png");background-image:url("../img/icons/edit.svg"),none}.icon.delete{background-image:url("../img/icons/delete.png");background-image:url("../img/icons/delete.svg"),none}.icon.remove{background-image:url("../img/icons/cross.svg"),none}.icon.warning{background-image:url("../img/icons/warning.png");background-image:url("../img/icons/warning.svg"),none}.icon.debug{background-image:url("../img/icons/debug.png");background-image:url("../img/icons/debug.svg"),none}.icon.success,.icon.tick{background-image:url("../img/icons/success.png");background-image:url("../img/icons/success.svg"),none}.icon.error{background-image:url("../img/icons/error.png");background-image:url("../img/icons/error.svg"),none}.clear{clear:both}.hidden{display:none}.align-right{text-align:right}.align-center{text-align:center}.align-left{text-align:left}.border{border-top:1px dotted #B2B2B2;padding-top:20px}.border.bottom{border-bottom:1px dotted #B2B2B2}.border.solid{border-style:solid}.vertical-align{position:relative;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.margin-top{margin-top:20px}.margin-top--ten{margin-top:10px}.margin-right{margin-right:20px !important}.margin-right--ten{margin-right:10px !important}.margin-bottom{margin-bottom:20px}.margin-left{margin-left:20px}.padding-top{padding-top:20px}.padding-right{padding-right:20px}.padding-bottom{padding-bottom:20px}.padding-left{padding-left:20px}.border-top{border-top:1px dotted #888}.add-machine__list .add-machine__details,.border-bottom{border-bottom:1px dotted #888}.no-padding{padding:0}.no-padding-left{padding-left:0}.no-margin-bottom{margin-bottom:0}.footer-wrapper{border-top:1px dotted #b2b2b2}.footer-wrapper footer.global{background-color:transparent;padding-top:0px;padding-right:20px;padding-left:20px;background-image:url("../img/logos/logo-ubuntu-orange.png");background-image:url("../img/logos/logo-ubuntu-orange.svg"),none;background-size:107px 25px;background-position:top 20px right 20px;background-repeat:no-repeat;max-width:1480px}.footer-wrapper footer.global p{font-size:0.875em}.footer-wrapper footer.global a{margin:0 5px;color:#dd4814}.footer-wrapper footer.global .version{font-weight:500;margin-right:5px}.footer-wrapper footer.global .copy{margin-top:10px}.footer-wrapper footer.global .legal{max-width:1440px}.wrapper{min-height:100%;height:auto !important;height:100%;margin:0 auto -112px;position:relative;background:rgba(255,255,255,0.6);padding-top:172px}.wrapper:after{content:'';position:absolute;display:block;top:0;right:0;bottom:0;left:0;background:url("../img/backgrounds/image-background-paper.png");height:100%;width:100%;z-index:-1}.inner-wrapper{max-width:1480px;padding:0px 20px;margin:0 auto;position:relative}.push,.footer-wrapper{height:112px}.row{background-color:transparent;border-bottom:1px dotted #CCC}.row:last-child{border-bottom:none}header.banner{overflow:visible;z-index:20;position:fixed;top:0}header.banner nav.nav-primary{border-bottom:none}header.banner .nav-primary.nav-right .logo-ubuntu{-moz-background-size:100px 30px;-webkit-background-size:100px 30px;-o-background-size:100px 30px;background-size:100px 30px;background-position:5px 9px;background-image:url("../img/logos/logo.png");background-image:url("../img/logos/logo.svg"),none}header.banner .nav-primary li:hover ul:after{display:none}@media screen and (max-width: 768px){header.banner .nav-primary ul{border-right:none}}header.banner #right-nav{float:right;margin-right:20px}@media screen and (max-width: 768px){header.banner #right-nav{margin-right:0}}header.banner #user-link{position:relative}@media screen and (max-width: 768px){header.banner #user-link{border-top:1px solid #d4d7d4;width:100%}}header.banner #user-link>a{padding-bottom:12px}@media screen and (max-width: 768px){header.banner #user-link>a{display:none}}header.banner #user-link .normal,header.banner #user-link .hover{margin-right:7px}@media screen and (max-width: 768px){header.banner #user-link .normal,header.banner #user-link .hover{display:none}}header.banner #user-link .hover{display:none}header.banner #user-link .nav{-webkit-border-radius:0px 0px 4px 4px;-moz-border-radius:0px 0px 4px 4px;border-radius:0px 0px 4px 4px;background-color:#FFF;border:none;display:none;position:absolute;right:0;top:48px;box-shadow:0px 2px 4px rgba(0,0,0,0.15)}@media screen and (min-width: 769px){header.banner #user-link .nav a.active{background:none;border:none}}header.banner #user-link .nav a:hover{background-color:transparent}@media screen and (max-width: 768px){header.banner #user-link .nav a:hover{background-color:#F8F8F8;color:#333}}@media screen and (max-width: 768px){header.banner #user-link .nav{background:none;position:relative;top:inherit;width:100%;box-shadow:none;float:left;padding:0}header.banner #user-link .nav li{border-bottom:1px solid #d4d7d4;width:100%;float:left}header.banner #user-link .nav li a{padding:10px 14px;width:100%}}@media screen and (max-width: 768px){header.banner #user-link:hover>a{background-color:transparent}}header.banner #user-link:hover .normal{display:none}header.banner #user-link:hover .hover{display:inline-block}@media screen and (max-width: 768px){header.banner #user-link:hover .hover{display:none}}header.banner #user-link:hover .nav{display:block}header.banner .nav-toggle{background-image:url("../img/icons/navigation-menu-plain.png");background-image:url("../img/icons/navigation-menu-plain.svg"),none;top:0}@media screen and (max-width: 768px){header.banner .nav-toggles .open{display:block}header.banner .nav-toggles .close{display:none}header.banner #canonlist:target ul{display:block}header.banner #canonlist:target+.nav-toggles .open{display:none}header.banner #canonlist:target+.nav-toggles .close{display:block}}.page-header{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;background:#FFF;box-shadow:0 1px 1px rgba(0,0,0,0.1);width:100%;float:left;position:fixed;z-index:10;top:48px}.page-header .page-header__nav{position:absolute;top:10px;z-index:1000}.page-header .page-header__nav a{font-weight:300}.page-header .page-header__title{font-size:2em;width:auto;padding:31px 0;margin:0;float:left;font-size:32px}.page-header .page-header__title [contenteditable="true"]{display:inline-block;padding:8px 10px;width:auto;box-sizing:border-box;border:1px solid transparent;margin:-10px 0 -10px -10px;border-radius:2px;color:#333;cursor:default;font-size:32px}.page-header .page-header__title [contenteditable="true"].editable:hover{border:1px solid #D2D2D2;cursor:text}.page-header .page-header__title [contenteditable="true"]:active,.page-header .page-header__title [contenteditable="true"]:focus{outline:none;background-color:#FFF;border:1px solid #B2B2B2}.page-header .page-header__title [contenteditable="true"].invalid,.page-header .page-header__title [contenteditable="true"].invalid:hover,.page-header .page-header__title [contenteditable="true"].invalid:active,.page-header .page-header__title [contenteditable="true"].invalid:focus{border-color:#d90000}.page-header .page-header__title [contenteditable="true"] br{display:none}.page-header .page-header__title .icon{vertical-align:3px;margin-right:10px}.page-header .page-header__title .page-header__title--identicator{font-size:0.6em;width:auto;display:inline-block;position:relative;top:0px;padding-left:20px;margin-left:10px}.page-header .page-header__title .page-header__title--identicator a{color:#888}.page-header .page-header__title .page-header__title--identicator a:hover{text-decoration:none;border-bottom:3px solid #888}.page-header .page-header__title .page-header__title--identicator a:focus,.page-header .page-header__title .page-header__title--identicator a:active{text-decoration:none}.page-header .page-header__title .page-header__title--identicator a.active{color:#333;border-bottom:3px solid #dd4814}.page-header .page-header__title .page-header__title--identicator a.active:hover{text-decoration:none;cursor:default}.page-header .page-header__title .page-header__title--identicator .divide{width:1px;display:inline-block;background:#D2D2D2;height:11px;padding:0;margin:0 5px}.page-header .page-header__title .page-header__title--identicator .page-header__title-loadmore{font-size:14px;margin-left:10px}.page-header .page-header__title .page-header__title--identicator .page-header__title-loadmore:hover{border:0;text-decoration:underline}.page-header .page-header__title .link-cta-ubuntu,.page-header .page-header__title .alt{font-size:16px;margin-left:20px;position:relative;vertical-align:middle;margin-top:-5px}.page-header .page-header__actions{float:right;padding:34px 0;margin-bottom:0}.page-header .page-header__actions .page-header__cta{float:right;position:relative;height:auto;max-height:36px}.page-header .page-header__actions .page-header__cta .cta-group{float:right}.page-header .page-header__actions .page-header__cta .page-header__cta-feedback{display:inline-block;position:relative;line-height:36px;text-align:right;color:#dd4814;margin-right:20px;cursor:pointer}.page-header .page-header__actions .page-header__cta .page-header__cta-feedback:hover{text-decoration:underline}.page-header .page-header__dropdown{float:left;width:100%;max-height:1000px;transition:max-height 0.3s ease-in;overflow:hidden;border-color:#888 !important}.page-header .page-header__dropdown.ng-hide{display:block !important;max-height:0;overflow:hidden;transition:max-height 0.3s ease-out;border-top:none}.page-header .page-header__dropdown .page-header__feedback{border-top:1px dotted #888;display:inline-block;width:100%;padding:20px 0}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin:0;background-position:top 3px left 0px;background-repeat:no-repeat;padding:6px 0 5px 25px;width:auto;display:inline-block;position:relative}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.info,.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.error{background-image:url("../img/icons/error.png");background-image:url("../img/icons/error.svg"),none;background-position:0px 9px}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.info.progress,.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.error.progress{width:100%}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.progress{padding-left:0}.page-header .page-header__dropdown .page-header__feedback .page-header__feedback-message.progress .loader{position:relative;top:1px}.title .title__indicator .title__link{color:#888;font-size:20px}.title .title__indicator .title__link:hover{color:#333;text-decoration:none;border-bottom:1px solid #333}.title .title__indicator .title__link:focus,.title .title__indicator .title__link:active{text-decoration:none}.title .title__indicator .title__link.active{color:#333;border-bottom:1px #dd4814 solid}.title .title__indicator .divide{width:1px;display:inline-block;background:#D2D2D2;height:11px;padding:0;margin:0 5px}.accounts .logout .divide{padding:0 20px 0 30px;display:inline-block}.accounts .api li{position:relative}.accounts .api li input[type='text']{line-height:30px;padding-right:30px;width:100%}.accounts .api li input[type='text']::-webkit-input-placeholder{color:#333}.accounts .api li input[type='text']:-moz-placeholder{color:#333}.accounts .api li input[type='text']::-moz-placeholder{color:#333}.accounts .api li input[type='text']:-ms-input-placeholder{color:#333}.accounts .api li .delete-link{position:absolute;top:7px;right:7px}form.page-title-form{margin-bottom:30px}form.page-title-form input{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;border:1px solid transparent;background-color:transparent;font-size:36px;line-height:26px;color:#333;margin:6px 10px;padding:4px;height:auto;box-shadow:none}form.page-title-form input:hover{outline:none;background:#FFF;border-color:#D2D2D2;box-shadow:inset 0 1px 1px rgba(0,0,0,0.1)}form.page-title-form input:focus{border:1px solid #dd4814;background-color:#fff;outline:none}.small-icon{width:12px}.images-info{text-align:center;padding:10px}.images-warning{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;margin:0 0 10px;box-shadow:0 1px 1px rgba(0,0,0,0.1);border:1px solid #EEE;background-image:url("../img/icons/warning.png");background-image:url("../img/icons/warning.svg"),none}#loader{width:10px;margin:16px auto 0 auto}#importing{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;margin:0 0 10px;box-shadow:0 1px 1px rgba(0,0,0,0.1);border:1px solid #EEE;position:relative}#importing .spinner{position:absolute;left:15px}.importing-dot{opacity:0;-webkit-animation:dot 1.3s infinite;animation:dot 1.3s infinite}.selector{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;padding:20px;background:#FFF;margin:0 0 20px;box-shadow:0 1px 1px rgba(0,0,0,0.1);border:1px solid #EEE;width:100%;float:left}.selector h2{font-size:1em;font-weight:300}.selector h2 img{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;background:url("../img/icons/help.svg") no-repeat;width:16px;height:16px;padding-left:16px;margin-left:5px}.selector .selector-available,.selector .selector-chosen{width:46%;float:left;margin:0;text-align:left}@media screen and (max-width: 768px){.selector .selector-available,.selector .selector-chosen{width:100%}}.selector .selector-available h2,.selector .selector-chosen h2{background:none;border:none}.selector .selector-available select,.selector .selector-chosen select{margin-bottom:10px}.selector ul.selector-chooser{width:8%;float:left;margin:20% 0 0}@media screen and (max-width: 768px){.selector ul.selector-chooser{width:100%;margin:0 0 10px;text-align:center}}.selector ul.selector-chooser li{width:100%;text-align:center}@media screen and (max-width: 768px){.selector ul.selector-chooser li{width:auto;display:inline-block;height:16px;width:16px;margin:0 20px}}.selector ul.selector-chooser li a{display:block;text-indent:999em;width:16px;height:16px;overflow:hidden;margin:0 auto}.selector ul.selector-chooser li a.selector-add{background-image:url("../img/icons/chevron_right.svg")}@media screen and (max-width: 768px){.selector ul.selector-chooser li a.selector-add{background-image:url("../img/icons/chevron_down.svg")}}.selector ul.selector-chooser li a.selector-remove{background-image:url("../img/icons/chevron_left.svg")}@media screen and (max-width: 768px){.selector ul.selector-chooser li a.selector-remove{background-image:url("../img/icons/chevron_up.svg")}}.selector .selector-filter img{display:none}.selector .selector-filter input{background-image:url("../img/search-orange.png");background-repeat:no-repeat;background-position:top 7px right 8px}.selector select#id_mac_addresses_to.filtered{height:269px !important}.nodes{position:relative}.nodes .search{position:absolute;right:0}.nodes .search input[type='submit']{position:absolute;top:8px;right:12px;background-color:transparent;background-image:url("../img/search-icon.svg");background-repeat:no-repeat;text-indent:-999em;display:block;width:21px;height:20px;overflow:hidden;outline:none;padding:0}.nodes .search input[type='submit']:hover{color:transparent;background-color:transparent;background-image:url("../img/search-icon.svg");background-repeat:no-repeat}@media screen and (max-width: 768px){.nodes .search{position:relative}}@media screen and (max-width: 768px){.nodes .actions select{width:100%;margin-bottom:20px}.nodes .actions input{position:absolute;right:0;top:0}}.powerstates{width:14px;height:15px;display:inline-block}.powerstates.power-on{background:transparent url("../img/icons/power-on.svg") left top no-repeat}.powerstates.power-off{background:transparent url("../img/icons/power-off.svg") left top no-repeat}.powerstates.power-unknown{background:none}.powerstates.power-error{background:transparent url("../img/icons/power-error.svg") left top no-repeat}.powerstates.power-check-ok{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;width:10px;height:10px;color:#33CC00}.powerstates.power-check-error{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;width:10px;height:10px;color:#FF0000}.node-actions .link-cta-ubuntu,.node-actions .cta-ubuntu{margin-bottom:10px;float:left;font-size:16px}.buttons{margin-top:30px}#network-interfaces li{list-style-type:none}#content-discovery-data{padding-top:20px;margin-top:20px;border-top:1px dotted #B2B2B2}#content-discovery-data .slider{height:0;overflow:hidden}.slider{padding-top:0 !important}.slider .content{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;box-shadow:0 1px 1px rgba(0,0,0,0.1);background:#FFF;border:1px solid #EEE;border-top:none;padding:20px}.slider .content pre{margin:0}.slider .tabs{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;padding:8px 20px;margin:0;font-weight:400;font-size:0.875em;background:#FFF;background-position:top 50% left 15px;background-repeat:no-repeat;border:1px solid #EEE}.add-machine__list{padding:13px 0 20px;border-top:1px dotted #888;margin-bottom:0}.add-machine__list .add-machine__details{background:transparent url("../img/icons/accordion-open.svg") top 12px right 10px no-repeat}.add-machine__list .add-machine__details>div{margin-bottom:0}.add-machine__list .add-machine__details .add-machine__details-form{display:none}.add-machine__list .add-machine__details.active{background-image:url("../img/icons/accordion-close.svg")}.add-machine__list .add-machine__details.active .add-machine__details-form{display:block}.power-status{display:inline-block;font-size:100%;padding-left:0}.power-status--power{display:inline-block;margin-left:20px;position:relative;font-size:100%}.power-status--power.checking{color:#2AB7EC;background:url("../img/status_in_progress.svg");padding-left:20px}.power-status--power.on{padding-left:20px;color:#38B44A;background:transparent url("../img/icons/power-on.svg") left top 4px no-repeat}.power-status--power.off{padding-left:20px;color:#D2D2D2;background:transparent url("../img/icons/power-off.svg") left top 4px no-repeat}.power-status--power.error{padding-left:20px;color:#DB3832;background:transparent url("../img/icons/power-error.svg") left top 4px no-repeat}.power-status--power .power-check{font-size:0.75em;color:#D2D2D2;display:inline-block;padding:0}.power-status--power .power-check .power-check__link{color:#888;text-decoration:none;margin-left:5px}.power-status--power .power-check .power-check__link:hover{border-bottom:0 !important;text-decoration:underline !important}.loading,.loader{background:url("../img/in_progress.png") no-repeat;background-size:16px 16px;width:16px;height:16px;-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;animation:spin 1s infinite linear;padding:0;display:inline-block}
1390+>>>>>>> MERGE-SOURCE
1391
1392=== added file 'src/maasserver/static/img/icons/tag-close.svg'
1393--- src/maasserver/static/img/icons/tag-close.svg 1970-01-01 00:00:00 +0000
1394+++ src/maasserver/static/img/icons/tag-close.svg 2015-09-25 14:32:35 +0000
1395@@ -0,0 +1,18 @@
1396+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
1397+<svg width="11px" height="10px" viewBox="0 0 11 10" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
1398+ <!-- Generator: Sketch 3.3.2 (12043) - http://www.bohemiancoding.com/sketch -->
1399+ <title>Imported Layers Copy</title>
1400+ <desc>Created with Sketch.</desc>
1401+ <defs></defs>
1402+ <g id="Machine-details" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
1403+ <g id="06-maas-machine-details-copy-7" sketch:type="MSArtboardGroup" transform="translate(-390.000000, -456.000000)" stroke="#888888" stroke-width="3" stroke-linejoin="round">
1404+ <g id="tags" sketch:type="MSLayerGroup" transform="translate(0.000000, 50.000000)">
1405+ <g id="field" transform="translate(300.000000, 393.000000)" sketch:type="MSShapeGroup">
1406+ <g id="production-tag" transform="translate(0.000000, 9.000000)">
1407+ <path d="M92,5 L100,13 M100,5 L92,13" id="Imported-Layers-Copy"></path>
1408+ </g>
1409+ </g>
1410+ </g>
1411+ </g>
1412+ </g>
1413+</svg>
1414\ No newline at end of file
1415
1416=== modified file 'src/maasserver/static/partials/node-details.html'
1417--- src/maasserver/static/partials/node-details.html 2015-09-24 17:13:07 +0000
1418+++ src/maasserver/static/partials/node-details.html 2015-09-25 14:32:35 +0000
1419@@ -166,6 +166,7 @@
1420 </select>
1421 </div>
1422 </div>
1423+<<<<<<< TREE
1424 <div class="inline">
1425 <label for="min_hwe_kernel" class="two-col">Minimum Kernel</label>
1426 <div class="three-col">
1427@@ -178,6 +179,9 @@
1428 </div>
1429 </div>
1430 <dl class="margin-top--ten">
1431+=======
1432+ <dl class="margin-top--ten">
1433+>>>>>>> MERGE-SOURCE
1434 <dt class="two-col">Owner</dt>
1435 <dd class="four-col last-col">
1436 {$ node.owner || "Unassigned" $}
1437@@ -896,6 +900,7 @@
1438 <h4>
1439 No storage information. Commissioning this node will gather the storage information.
1440 </h4>
1441+<<<<<<< TREE
1442 </div>
1443 <div class="twelve-col padding-bottom">
1444 <h4>File System</h4>
1445@@ -1526,6 +1531,57 @@
1446 </div>
1447 </div>
1448 -->
1449+=======
1450+ <table class="table-listing ng-hide" data-ng-show="storage.physicalDisks.length">
1451+ <thead>
1452+ <tr>
1453+ <th class="t20">Name</th>
1454+ <th class="t25">Path</th>
1455+ <th class="t10">Size (GB)</th>
1456+ <th class="table-listing__header" class="t25" colspan="2">
1457+ <!-- XXX blake_r 2015-02-18 - Need to add e2e test. -->
1458+ <a class="table-listing__header-link" href="" data-ng-click="storage.column = 'model'" data-ng-class="{active: storage.column === 'model'}">
1459+ Model
1460+ </a>
1461+ <span class="divide"></span>
1462+ <a class="table-listing__header-link" href="" data-ng-click="storage.column = 'serial'" data-ng-class="{active: storage.column === 'serial'}">
1463+ Serial
1464+ </a>
1465+ </th>
1466+ <th class="t20">Tags</th>
1467+ </tr>
1468+ </thead>
1469+ <tbody>
1470+ <tr class="table-listing__row" data-ng-repeat="disk in storage.physicalDisks">
1471+ <td class="t20">{$ disk.name $}</td>
1472+ <td class="t25">{$ disk.path $}</td>
1473+ <td class="t10">{$ disk.size_gb $}</td>
1474+ <td class="t25" colspan="2" data-ng-show="storage.column === 'model'">{$ disk.model $}</td>
1475+ <td class="t25 ng-hide" colspan="2" data-ng-show="storage.column === 'serial'">{$ disk.serial $}</td>
1476+ <td class="t20">
1477+ <span class="tag-link" data-ng-repeat="tag in disk.tags" data-ng-hide="storage.editing">
1478+ <a href="#/nodes/?query=storage_tags:({$ tag.text $})">{$ tag.text $}</a>
1479+ </span>
1480+ <tags-input ng-model="disk.tags"
1481+ data-ng-show="storage.editing" allowed-tags-pattern="[\w-]+">
1482+ </tags-input>
1483+ </td>
1484+ </tr>
1485+ </tbody>
1486+ </table>
1487+ </div>
1488+ <div class="controls" data-ng-show="storage.physicalDisks.length && !storage.editing">
1489+ <a href="" class="link-cta-ubuntu secondary"
1490+ data-ng-show="canEdit()"
1491+ data-ng-click="editStorage()">Edit</a>
1492+ </div>
1493+ <div class="controls ng-hide" data-ng-show="storage.editing">
1494+ <a href="" class="link-cta-ubuntu clear"
1495+ data-ng-click="cancelEditStorage()">Cancel</a>
1496+ <button class="cta-ubuntu"
1497+ data-ng-click="saveEditStorage()">Save changes</button>
1498+ </div>
1499+>>>>>>> MERGE-SOURCE
1500 </form>
1501 </div>
1502 </div>
1503@@ -1539,8 +1595,14 @@
1504 <table class="table-listing no-hover" data-ng-show="node.events.length">
1505 <thead>
1506 <tr class="table-listing__row">
1507+<<<<<<< TREE
1508 <th class="t80" colspan="2">Event</th>
1509 <th class="t20">Time</th>
1510+=======
1511+ <th class="t1"></th>
1512+ <th class="t75" colspan="2">Event</th>
1513+ <th class="t24">Time</th>
1514+>>>>>>> MERGE-SOURCE
1515 </tr>
1516 </thead>
1517 <tbody>
1518@@ -1549,8 +1611,13 @@
1519 <td class="t1 no-padding-right no-padding-left">
1520 <span class="icon {$ event.type.level $}"></span>
1521 </td>
1522+<<<<<<< TREE
1523 <td class="t79">{$ getEventText(event) $}</td>
1524 <td class="t20">{$ event.created $}</td>
1525+=======
1526+ <td class="t75">{$ getEventText(event) $}</td>
1527+ <td class="t24 align-right">{$ event.created $}</td>
1528+>>>>>>> MERGE-SOURCE
1529 </tr>
1530 </tbody>
1531 </table>
1532
1533=== modified file 'src/maasserver/static/partials/node-events.html'
1534--- src/maasserver/static/partials/node-events.html 2015-08-10 10:03:04 +0000
1535+++ src/maasserver/static/partials/node-events.html 2015-09-25 14:32:35 +0000
1536@@ -45,7 +45,11 @@
1537 <td class="t79">
1538 {$ getEventText(event) $}
1539 </td>
1540+<<<<<<< TREE
1541 <td class="t20">
1542+=======
1543+ <td class="t24 align-right">
1544+>>>>>>> MERGE-SOURCE
1545 {$ event.created $}
1546 </td>
1547 </tr>
1548
1549=== modified file 'src/maasserver/static/partials/nodes-list.html'
1550--- src/maasserver/static/partials/nodes-list.html 2015-09-24 16:44:04 +0000
1551+++ src/maasserver/static/partials/nodes-list.html 2015-09-25 14:32:35 +0000
1552@@ -153,6 +153,7 @@
1553 data-ng-options="arch for arch in architectures">
1554 </select>
1555 </div>
1556+<<<<<<< TREE
1557 <div class="inline">
1558 <label for="min_hwe_kernel" class="two-col">Minimum Kernel</label>
1559 <select name="min_hwe_kernel" id="min_hwe_kernel" class="three-col" placeholder="No minimum kernel"
1560@@ -168,6 +169,15 @@
1561 data-ng-options="zone as zone.name for zone in zones">
1562 </select>
1563 </div>
1564+=======
1565+ <div class="inline">
1566+ <label for="zone" class="two-col">Zone</label>
1567+ <select name="zone" id="zone" class="three-col" placeholder="Choose a zone"
1568+ data-ng-model="machine.zone"
1569+ data-ng-options="zone as zone.name for zone in zones">
1570+ </select>
1571+ </div>
1572+>>>>>>> MERGE-SOURCE
1573 <div class="inline five-col" data-ng-repeat="mac in machine.macs">
1574 {$ mac $}
1575 <label for="mac-address" class="two-col"><span data-ng-hide="mac !== machine.macs[0]">MAC Address</span></label>
1576
1577=== modified file 'src/maasserver/static/scss/maas/components/_accordion.scss'
1578=== modified file 'src/maasserver/static/scss/maas/components/_button.scss'
1579=== modified file 'src/maasserver/static/scss/maas/components/_forms.scss'
1580=== modified file 'src/maasserver/static/scss/maas/components/_placeholders.scss'
1581--- src/maasserver/static/scss/maas/components/_placeholders.scss 2015-09-22 13:39:18 +0000
1582+++ src/maasserver/static/scss/maas/components/_placeholders.scss 2015-09-25 14:32:35 +0000
1583@@ -36,7 +36,11 @@
1584 }
1585
1586 &.remove {
1587+<<<<<<< TREE
1588 background-image: url('../img/icons/filter-remove.svg'), none;
1589+=======
1590+ background-image: url('../img/icons/cross.svg'), none;
1591+>>>>>>> MERGE-SOURCE
1592 }
1593
1594 &.warning {
1595
1596=== modified file 'src/maasserver/static/scss/maas/components/_tables.scss'
1597=== modified file 'src/maasserver/static/scss/maas/pages/_nodes.scss'
1598=== modified file 'src/maasserver/templates/maasserver/index.html'
1599=== modified file 'src/maasserver/testing/factory.py'
1600--- src/maasserver/testing/factory.py 2015-09-23 20:58:24 +0000
1601+++ src/maasserver/testing/factory.py 2015-09-25 14:32:35 +0000
1602@@ -254,6 +254,7 @@
1603 device.save()
1604 return device
1605
1606+<<<<<<< TREE
1607 def make_Node(
1608 self, interface=False, hostname=None, status=None,
1609 architecture="i386/generic", min_hwe_kernel=None, hwe_kernel=None,
1610@@ -262,6 +263,15 @@
1611 sortable_name=False, power_type=None, power_parameters=None,
1612 power_state=None, power_state_updated=undefined, disable_ipv4=None,
1613 with_boot_disk=False, vlan=None, **kwargs):
1614+=======
1615+ def make_Node(
1616+ self, mac=False, hostname=None, status=None,
1617+ architecture="i386/generic", installable=True, updated=None,
1618+ created=None, nodegroup=None, routers=None, zone=None,
1619+ networks=None, boot_type=None, sortable_name=False,
1620+ power_type=None, power_parameters=None, power_state=None,
1621+ power_state_updated=undefined, disable_ipv4=None, **kwargs):
1622+>>>>>>> MERGE-SOURCE
1623 """Make a :class:`Node`.
1624
1625 :param sortable_name: If `True`, use a that will sort consistently
1626@@ -300,10 +310,17 @@
1627 hostname=hostname, status=status, architecture=architecture,
1628 min_hwe_kernel=min_hwe_kernel, hwe_kernel=hwe_kernel,
1629 installable=installable, nodegroup=nodegroup, routers=routers,
1630+<<<<<<< TREE
1631 zone=zone, boot_type=boot_type, power_type=power_type,
1632 power_parameters=power_parameters, power_state=power_state,
1633 power_state_updated=power_state_updated, disable_ipv4=disable_ipv4,
1634 **kwargs)
1635+=======
1636+ zone=zone, boot_type=boot_type, power_type=power_type,
1637+ power_parameters=power_parameters, power_state=power_state,
1638+ power_state_updated=power_state_updated,
1639+ disable_ipv4=disable_ipv4, **kwargs)
1640+>>>>>>> MERGE-SOURCE
1641 self._save_node_unchecked(node)
1642 # We do not generate random networks by default because the limited
1643 # number of VLAN identifiers (4,094) makes it very likely to
1644
1645=== modified file 'src/maasserver/tests/test_fields.py'
1646--- src/maasserver/tests/test_fields.py 2015-09-21 20:29:36 +0000
1647+++ src/maasserver/tests/test_fields.py 2015-09-25 14:32:35 +0000
1648@@ -526,6 +526,7 @@
1649 field = LargeObjectField()
1650 self.assertRaises(
1651 AssertionError, field.to_python, factory.make_string())
1652+<<<<<<< TREE
1653
1654
1655 class TestCIDRField(TestModelMixin, MAASServerTestCase):
1656@@ -610,3 +611,40 @@
1657 def test_separators_dont_conflict_with_ipv6_address(self):
1658 self.assertIsNone(re.search(
1659 IPListFormField.separators, factory.make_ipv6_address()))
1660+=======
1661+
1662+
1663+class IPListFormFieldTest(MAASServerTestCase):
1664+
1665+ def test_accepts_none(self):
1666+ self.assertIsNone(IPListFormField().clean(None))
1667+
1668+ def test_accepts_single_ip(self):
1669+ ip = factory.make_ip_address()
1670+ self.assertEquals(ip, IPListFormField().clean(ip))
1671+
1672+ def test_accepts_space_separated_ips(self):
1673+ ips = [factory.make_ip_address() for _ in range(5)]
1674+ input = ' '.join(ips)
1675+ self.assertEquals(input, IPListFormField().clean(input))
1676+
1677+ def test_accepts_comma_separated_ips(self):
1678+ ips = [factory.make_ip_address() for _ in range(5)]
1679+ input = ','.join(ips)
1680+ self.assertEquals(' '.join(ips), IPListFormField().clean(input))
1681+
1682+ def test_rejects_invalid_input(self):
1683+ invalid = factory.make_name('invalid')
1684+ input = ' '.join([factory.make_ip_address(), invalid])
1685+ error = self.assertRaises(
1686+ ValidationError, IPListFormField().clean, input)
1687+ self.assertIn("Invalid IP address: %s" % invalid, error.message)
1688+
1689+ def test_separators_dont_conflict_with_ipv4_address(self):
1690+ self.assertIsNone(re.search(
1691+ IPListFormField.separators, factory.make_ipv4_address()))
1692+
1693+ def test_separators_dont_conflict_with_ipv6_address(self):
1694+ self.assertIsNone(re.search(
1695+ IPListFormField.separators, factory.make_ipv6_address()))
1696+>>>>>>> MERGE-SOURCE
1697
1698=== modified file 'src/maasserver/tests/test_node_action.py'
1699--- src/maasserver/tests/test_node_action.py 2015-09-16 08:36:46 +0000
1700+++ src/maasserver/tests/test_node_action.py 2015-09-25 14:32:35 +0000
1701@@ -428,6 +428,7 @@
1702 self.assertThat(
1703 node_start, MockCalledOnceWith(user))
1704
1705+<<<<<<< TREE
1706 def test_Deploy_raises_NodeActionError_for_invalid_os(self):
1707 user = factory.make_User()
1708 node = factory.make_Node(
1709@@ -446,41 +447,96 @@
1710 "%s is not a support operating system." % os_name,
1711 error.message)
1712
1713+=======
1714+ def test_Deploy_raises_NodeActionError_for_invalid_os(self):
1715+ user = factory.make_User()
1716+ node = factory.make_Node(
1717+ mac=True, status=NODE_STATUS.ALLOCATED,
1718+ power_type='ether_wake', owner=user)
1719+ self.patch(node, 'start')
1720+ os_name = factory.make_name("os")
1721+ release_name = factory.make_name("release")
1722+ extra = {
1723+ "osystem": os_name,
1724+ "distro_series": release_name,
1725+ }
1726+ error = self.assertRaises(
1727+ NodeActionError, Deploy(node, user).execute, **extra)
1728+ self.assertEquals(
1729+ "%s is not a support operating system." % os_name,
1730+ error.message)
1731+
1732+>>>>>>> MERGE-SOURCE
1733 def test_Deploy_sets_osystem_and_series(self):
1734 user = factory.make_User()
1735 node = factory.make_Node(
1736- interface=True, status=NODE_STATUS.ALLOCATED,
1737- power_type='ether_wake', owner=user)
1738- self.patch(node, 'start')
1739- osystem = make_usable_osystem(self)
1740- os_name = osystem["name"]
1741- release_name = osystem["releases"][0]["name"]
1742- extra = {
1743- "osystem": os_name,
1744- "distro_series": release_name
1745- }
1746- Deploy(node, user).execute(**extra)
1747- self.expectThat(node.osystem, Equals(os_name))
1748- self.expectThat(
1749- node.distro_series, Equals(release_name))
1750-
1751- def test_Deploy_sets_osystem_and_series_strips_license_key_token(self):
1752- user = factory.make_User()
1753- node = factory.make_Node(
1754- interface=True, status=NODE_STATUS.ALLOCATED,
1755- power_type='ether_wake', owner=user)
1756- self.patch(node, 'start')
1757- osystem = make_usable_osystem(self)
1758- os_name = osystem["name"]
1759- release_name = osystem["releases"][0]["name"]
1760- extra = {
1761- "osystem": os_name,
1762- "distro_series": release_name + '*'
1763- }
1764- Deploy(node, user).execute(**extra)
1765- self.expectThat(node.osystem, Equals(os_name))
1766- self.expectThat(
1767- node.distro_series, Equals(release_name))
1768+<<<<<<< TREE
1769+ interface=True, status=NODE_STATUS.ALLOCATED,
1770+ power_type='ether_wake', owner=user)
1771+ self.patch(node, 'start')
1772+ osystem = make_usable_osystem(self)
1773+ os_name = osystem["name"]
1774+ release_name = osystem["releases"][0]["name"]
1775+ extra = {
1776+ "osystem": os_name,
1777+ "distro_series": release_name
1778+ }
1779+ Deploy(node, user).execute(**extra)
1780+ self.expectThat(node.osystem, Equals(os_name))
1781+ self.expectThat(
1782+ node.distro_series, Equals(release_name))
1783+
1784+ def test_Deploy_sets_osystem_and_series_strips_license_key_token(self):
1785+ user = factory.make_User()
1786+ node = factory.make_Node(
1787+ interface=True, status=NODE_STATUS.ALLOCATED,
1788+ power_type='ether_wake', owner=user)
1789+ self.patch(node, 'start')
1790+ osystem = make_usable_osystem(self)
1791+ os_name = osystem["name"]
1792+ release_name = osystem["releases"][0]["name"]
1793+ extra = {
1794+ "osystem": os_name,
1795+ "distro_series": release_name + '*'
1796+ }
1797+ Deploy(node, user).execute(**extra)
1798+ self.expectThat(node.osystem, Equals(os_name))
1799+ self.expectThat(
1800+ node.distro_series, Equals(release_name))
1801+=======
1802+ mac=True, status=NODE_STATUS.ALLOCATED,
1803+ power_type='ether_wake', owner=user)
1804+ self.patch(node, 'start')
1805+ osystem = make_usable_osystem(self)
1806+ os_name = osystem["name"]
1807+ release_name = osystem["releases"][0]["name"]
1808+ extra = {
1809+ "osystem": os_name,
1810+ "distro_series": release_name
1811+ }
1812+ Deploy(node, user).execute(**extra)
1813+ self.expectThat(node.osystem, Equals(os_name))
1814+ self.expectThat(
1815+ node.distro_series, Equals(release_name))
1816+
1817+ def test_Deploy_sets_osystem_and_series_strips_license_key_token(self):
1818+ user = factory.make_User()
1819+ node = factory.make_Node(
1820+ mac=True, status=NODE_STATUS.ALLOCATED,
1821+ power_type='ether_wake', owner=user)
1822+ self.patch(node, 'start')
1823+ osystem = make_usable_osystem(self)
1824+ os_name = osystem["name"]
1825+ release_name = osystem["releases"][0]["name"]
1826+ extra = {
1827+ "osystem": os_name,
1828+ "distro_series": release_name + '*'
1829+ }
1830+ Deploy(node, user).execute(**extra)
1831+ self.expectThat(node.osystem, Equals(os_name))
1832+ self.expectThat(
1833+ node.distro_series, Equals(release_name))
1834+>>>>>>> MERGE-SOURCE
1835
1836 def test_Deploy_doesnt_set_osystem_and_series_if_os_missing(self):
1837 user = factory.make_User()
1838
1839=== modified file 'src/maasserver/tests/test_plugin.py'
1840--- src/maasserver/tests/test_plugin.py 2015-09-11 19:22:33 +0000
1841+++ src/maasserver/tests/test_plugin.py 2015-09-25 14:32:35 +0000
1842@@ -22,6 +22,7 @@
1843 from django.db.backends import BaseDatabaseWrapper
1844 from maasserver import eventloop
1845 from maasserver.plugin import (
1846+ MAX_THREADS,
1847 Options,
1848 RegionServiceMaker,
1849 )
1850@@ -38,6 +39,7 @@
1851 )
1852 from maastesting.testcase import MAASTestCase
1853 from provisioningserver import logger
1854+<<<<<<< TREE
1855 from provisioningserver.utils.twisted import (
1856 asynchronous,
1857 ThreadPool,
1858@@ -45,7 +47,12 @@
1859 from south import migration
1860 from testtools import monkey
1861 from testtools.matchers import IsInstance
1862+=======
1863+from provisioningserver.utils.twisted import asynchronous
1864+from testtools.matchers import GreaterThan
1865+>>>>>>> MERGE-SOURCE
1866 from twisted.application.service import MultiService
1867+<<<<<<< TREE
1868 from twisted.internet import reactor
1869
1870
1871@@ -56,6 +63,9 @@
1872 # prevented. The most sensible solution to this might be to disallow
1873 # database access at import time.
1874 import maasserver.websockets.handlers # noqa
1875+=======
1876+from twisted.internet import reactor
1877+>>>>>>> MERGE-SOURCE
1878
1879
1880 class TestOptions(MAASTestCase):
1881@@ -121,6 +131,7 @@
1882 "Not all services are named.")
1883 self.assertThat(logger.basicConfig, MockCalledOnceWith())
1884 self.assertThat(crochet.no_setup, MockCalledOnceWith())
1885+<<<<<<< TREE
1886 self.assertThat(
1887 RegionServiceMaker._checkDatabase,
1888 MockCalledOnceWith(service_maker))
1889@@ -226,3 +237,14 @@
1890 self.assertEqual(
1891 "The MAAS database schema is not yet fully installed: "
1892 "1 migration(s) are missing.", unicode(error))
1893+=======
1894+
1895+ @asynchronous(timeout=5)
1896+ def test__sets_pool_size(self):
1897+ service_maker = RegionServiceMaker("Harry", "Hill")
1898+ service_maker.makeService(Options())
1899+ threadpool = reactor.getThreadPool()
1900+ self.assertEqual(MAX_THREADS, threadpool.max)
1901+ # Max threads is reasonable.
1902+ self.assertThat(threadpool.max, GreaterThan(50))
1903+>>>>>>> MERGE-SOURCE
1904
1905=== modified file 'src/maasserver/utils/osystems.py'
1906--- src/maasserver/utils/osystems.py 2015-09-08 18:41:57 +0000
1907+++ src/maasserver/utils/osystems.py 2015-09-25 14:32:35 +0000
1908@@ -194,6 +194,7 @@
1909 for release in releases
1910 if release['can_commission']
1911 ]
1912+<<<<<<< TREE
1913
1914
1915 def validate_osystem_and_distro_series(osystem, distro_series):
1916@@ -308,3 +309,29 @@
1917 if min_hwe_kernel not in usable_kernels:
1918 raise ValidationError('%s is not a usable kernel.' % min_hwe_kernel)
1919 return min_hwe_kernel
1920+=======
1921+
1922+
1923+def validate_osystem_and_distro_series(osystem, distro_series):
1924+ """Validate `osystem` and `distro_series` are valid choices."""
1925+ if '/' in distro_series:
1926+ series_os, release = distro_series.split('/', 1)
1927+ if series_os != osystem:
1928+ raise ValidationError(
1929+ "%s in distro_series does not match with "
1930+ "operating system %s." % (distro_series, osystem))
1931+ else:
1932+ release = distro_series
1933+ release = release.replace('*', '')
1934+ usable_osystems = list_all_usable_osystems()
1935+ found_osystem = get_osystem_from_osystems(usable_osystems, osystem)
1936+ if found_osystem is None:
1937+ raise ValidationError(
1938+ "%s is not a support operating system." % osystem)
1939+ found_release = get_release_from_osystem(found_osystem, release)
1940+ if found_release is None:
1941+ raise ValidationError(
1942+ "%s/%s is not a support operating system and release "
1943+ "combination." % (osystem, release))
1944+ return osystem, release
1945+>>>>>>> MERGE-SOURCE
1946
1947=== modified file 'src/maasserver/utils/tests/test_osystems.py'
1948--- src/maasserver/utils/tests/test_osystems.py 2015-09-08 18:41:57 +0000
1949+++ src/maasserver/utils/tests/test_osystems.py 2015-09-25 14:32:35 +0000
1950@@ -36,9 +36,13 @@
1951 list_commissioning_choices,
1952 list_osystem_choices,
1953 list_release_choices,
1954+<<<<<<< TREE
1955 release_a_newer_than_b,
1956 validate_hwe_kernel,
1957 validate_osystem_and_distro_series,
1958+=======
1959+ validate_osystem_and_distro_series,
1960+>>>>>>> MERGE-SOURCE
1961 )
1962
1963
1964@@ -259,6 +263,7 @@
1965 for release in comm_releases
1966 ]
1967 self.assertEqual(choices, list_commissioning_choices([osystem]))
1968+<<<<<<< TREE
1969
1970
1971 class TestValidateOsystemAndDistroSeries(MAASServerTestCase):
1972@@ -418,3 +423,45 @@
1973 ' min_hwe_kernel(hwe-v).', e.message)
1974 exception_raised = True
1975 self.assertEqual(True, exception_raised)
1976+=======
1977+
1978+
1979+class TestValidateOsystemAndDistroSeries(MAASServerTestCase):
1980+
1981+ def test__raises_error_of_osystem_and_distro_series_dont_match(self):
1982+ os = factory.make_name("os")
1983+ release = "%s/%s" % (
1984+ factory.make_name("os"), factory.make_name("release"))
1985+ error = self.assertRaises(
1986+ ValidationError, validate_osystem_and_distro_series, os, release)
1987+ self.assertEquals(
1988+ "%s in distro_series does not match with "
1989+ "operating system %s." % (release, os), error.message)
1990+
1991+ def test__raises_error_if_not_supported_osystem(self):
1992+ os = factory.make_name("os")
1993+ release = factory.make_name("release")
1994+ error = self.assertRaises(
1995+ ValidationError, validate_osystem_and_distro_series, os, release)
1996+ self.assertEquals(
1997+ "%s is not a support operating system." % os,
1998+ error.message)
1999+
2000+ def test__raises_error_if_not_supported_release(self):
2001+ osystem = make_usable_osystem(self)
2002+ release = factory.make_name("release")
2003+ error = self.assertRaises(
2004+ ValidationError, validate_osystem_and_distro_series,
2005+ osystem['name'], release)
2006+ self.assertEquals(
2007+ "%s/%s is not a support operating system and release "
2008+ "combination." % (osystem['name'], release),
2009+ error.message)
2010+
2011+ def test__returns_osystem_and_release_with_license_key_stripped(self):
2012+ osystem = make_usable_osystem(self)
2013+ release = osystem['default_release']
2014+ self.assertEquals(
2015+ (osystem['name'], release),
2016+ validate_osystem_and_distro_series(osystem['name'], release + '*'))
2017+>>>>>>> MERGE-SOURCE
2018
2019=== modified file 'src/maasserver/views/tests/test_rpc.py'
2020--- src/maasserver/views/tests/test_rpc.py 2015-09-22 12:21:54 +0000
2021+++ src/maasserver/views/tests/test_rpc.py 2015-09-25 14:32:35 +0000
2022@@ -31,7 +31,6 @@
2023 KeysEqual,
2024 LessThan,
2025 MatchesAll,
2026- MatchesDict,
2027 MatchesListwise,
2028 MatchesSetwise,
2029 )
2030@@ -84,14 +83,26 @@
2031 self.assertEqual("application/json", response["Content-Type"])
2032 info = json.loads(response.content)
2033 self.assertThat(info, KeysEqual("eventloops"))
2034- self.assertThat(info["eventloops"], MatchesDict({
2035+ self.assertThat(info["eventloops"], KeysEqual(eventloop.loop.name))
2036+ self.assertThat(
2037+ info["eventloops"][eventloop.loop.name],
2038 # Each entry in the endpoints dict is a mapping from an
2039 # event loop to a list of (host, port) tuples. Each tuple is
2040 # a potential endpoint for connecting into that event loop.
2041+<<<<<<< TREE
2042 eventloop.loop.name: MatchesSetwise(*(
2043+=======
2044+ MatchesSetwise(*[
2045+>>>>>>> MERGE-SOURCE
2046 MatchesListwise((Equals(addr), is_valid_port))
2047 for addr in get_all_interface_addresses()
2048+<<<<<<< TREE
2049 if not IPAddress(addr).is_link_local() and
2050 IPAddress(addr).version == 4
2051 )),
2052 }))
2053+=======
2054+ if not IPAddress(addr).is_link_local()
2055+ and IPAddress(addr).version == 4
2056+ ]))
2057+>>>>>>> MERGE-SOURCE
2058
2059=== modified file 'src/maasserver/websockets/handlers/device.py'
2060=== modified file 'src/maasserver/websockets/handlers/node.py'
2061--- src/maasserver/websockets/handlers/node.py 2015-09-24 15:01:52 +0000
2062+++ src/maasserver/websockets/handlers/node.py 2015-09-25 14:32:35 +0000
2063@@ -111,6 +111,7 @@
2064 "token",
2065 "netboot",
2066 "agent_name",
2067+<<<<<<< TREE
2068 "power_state_updated",
2069 "gateway_link_ipv4",
2070 "gateway_link_ipv6",
2071@@ -118,6 +119,11 @@
2072 "enable_ssh",
2073 "skip_networking",
2074 "skip_storage",
2075+=======
2076+ # power_state_updated isn't needed in the client yet, plus it's
2077+ # not native to JSON. Omit for now.
2078+ "power_state_updated",
2079+>>>>>>> MERGE-SOURCE
2080 ]
2081 list_fields = [
2082 "system_id",
2083@@ -654,6 +660,7 @@
2084 POWER_QUERY_TIMEOUT, client, PowerQuery, system_id=node_id,
2085 hostname=node_hostname, power_type=power_info.power_type,
2086 context=power_info.power_parameters)
2087+<<<<<<< TREE
2088 except CancelledError:
2089 # We got fed up waiting. The query may later discover the node's
2090 # power state but by then we won't be paying attention.
2091@@ -672,3 +679,28 @@
2092
2093 yield deferToDatabase(update_power_state, state)
2094 returnValue(state)
2095+=======
2096+ try:
2097+ state = call.wait(POWER_QUERY_TIMEOUT)['state']
2098+ except crochet.TimeoutError:
2099+ maaslog.error(
2100+ "%s: Timed out waiting for power response in "
2101+ "Node.power_state",
2102+ obj.hostname)
2103+ state = "error"
2104+ except (NotImplementedError, PowerActionFail):
2105+ state = "error"
2106+
2107+ @asynchronous
2108+ def update_power_state(state):
2109+ transactional_update = transactional(obj.update_power_state)
2110+ return deferToThread(transactional_update, state)
2111+
2112+ # Update the power_state of the node. This will cause the update to
2113+ # occur in a seperate thread wrapped with transactional. This will make
2114+ # sure the change is committed and retried if required. Not pushing
2115+ # this to another thread, would result in the entire power query being
2116+ # performed again.
2117+ update_power_state(state).wait(POWER_QUERY_TIMEOUT)
2118+ return state
2119+>>>>>>> MERGE-SOURCE
2120
2121=== modified file 'src/maasserver/websockets/handlers/tests/test_node.py'
2122=== modified file 'src/provisioningserver/__main__.py'
2123=== modified file 'src/provisioningserver/drivers/power/__init__.py'
2124--- src/provisioningserver/drivers/power/__init__.py 2015-09-24 15:45:32 +0000
2125+++ src/provisioningserver/drivers/power/__init__.py 2015-09-25 14:32:35 +0000
2126@@ -30,8 +30,12 @@
2127 abstractmethod,
2128 abstractproperty,
2129 )
2130+<<<<<<< TREE
2131 from datetime import timedelta
2132 import sys
2133+=======
2134+from datetime import timedelta
2135+>>>>>>> MERGE-SOURCE
2136
2137 from jsonschema import validate
2138 from provisioningserver.drivers import (
2139
2140=== modified file 'src/provisioningserver/plugin.py'
2141--- src/provisioningserver/plugin.py 2015-06-26 10:40:52 +0000
2142+++ src/provisioningserver/plugin.py 2015-09-25 14:32:35 +0000
2143@@ -20,11 +20,18 @@
2144 import socket
2145 from socket import error as socket_error
2146
2147+<<<<<<< TREE
2148 from provisioningserver.config import ClusterConfiguration
2149 from provisioningserver.monkey import (
2150 add_term_error_code_to_tftp,
2151 force_simplestreams_to_use_urllib2,
2152 )
2153+=======
2154+from provisioningserver.monkey import (
2155+ add_term_error_code_to_tftp,
2156+ force_simplestreams_to_use_urllib2,
2157+)
2158+>>>>>>> MERGE-SOURCE
2159 from provisioningserver.utils.debug import (
2160 register_sigusr2_thread_dump_handler,
2161 )
2162
2163=== modified file 'src/provisioningserver/power/__init__.py'
2164--- src/provisioningserver/power/__init__.py 2015-09-24 15:45:32 +0000
2165+++ src/provisioningserver/power/__init__.py 2015-09-25 14:32:35 +0000
2166@@ -19,6 +19,22 @@
2167 "QUERY_POWER_TYPES",
2168 ]
2169
2170+<<<<<<< TREE
2171+=======
2172+from datetime import timedelta
2173+from functools import partial
2174+import sys
2175+
2176+from provisioningserver.events import (
2177+ EVENT_TYPES,
2178+ send_event_node,
2179+)
2180+from provisioningserver.logger.log import get_maas_logger
2181+from provisioningserver.power.poweraction import (
2182+ PowerAction,
2183+ PowerActionFail,
2184+)
2185+>>>>>>> MERGE-SOURCE
2186 from provisioningserver.rpc import getRegionClient
2187 from provisioningserver.rpc.region import UpdateNodePowerState
2188 from provisioningserver.utils.twisted import asynchronous
2189@@ -42,6 +58,18 @@
2190 ]
2191
2192
2193+<<<<<<< TREE
2194+=======
2195+# Timeout for change_power_state(). We set it to 5 minutes by default,
2196+# but it would be lovely if this was configurable. This is only a backstop
2197+# meant to cope with broken BMCs.
2198+CHANGE_POWER_STATE_TIMEOUT = timedelta(minutes=5).total_seconds()
2199+
2200+
2201+maaslog = get_maas_logger("power")
2202+
2203+
2204+>>>>>>> MERGE-SOURCE
2205 # We could use a Registry here, but it seems kind of like overkill.
2206 power_action_registry = {}
2207
2208@@ -64,3 +92,145 @@
2209 UpdateNodePowerState,
2210 system_id=system_id,
2211 power_state=state)
2212+<<<<<<< TREE
2213+=======
2214+
2215+
2216+@asynchronous
2217+@inlineCallbacks
2218+def power_query_failure(system_id, hostname, message):
2219+ """Deal with a node failing to be queried."""
2220+ maaslog.error(message)
2221+ yield power_state_update(system_id, 'error')
2222+ yield send_event_node(
2223+ EVENT_TYPES.NODE_POWER_QUERY_FAILED,
2224+ system_id, hostname, message)
2225+
2226+
2227+@synchronous
2228+def perform_power_query(system_id, hostname, power_type, context):
2229+ """Issue the given `power_query` command.
2230+
2231+ No exception handling is performed here, this allows
2232+ `get_power_state` to perform multiple queries and only
2233+ log the final error.
2234+ """
2235+ action = PowerAction(power_type)
2236+ # `power_change` is a misnomer here.
2237+ return action.execute(power_change='query', **context)
2238+
2239+
2240+@asynchronous
2241+@inlineCallbacks
2242+def get_power_state(system_id, hostname, power_type, context, clock=reactor):
2243+ """Return the power state of the given node.
2244+
2245+ A side-effect of calling this method is that the power state recorded in
2246+ the database is updated.
2247+
2248+ :return: The string "on" or "off".
2249+ :raises PowerActionFail: When `power_type` is not queryable, or when
2250+ there's a failure when querying the node's power state.
2251+ """
2252+ if power_type not in QUERY_POWER_TYPES:
2253+ # query_all_nodes() won't call this with an un-queryable power
2254+ # type, however this is left here to prevent PEBKAC.
2255+ raise PowerActionFail("Unknown power_type '%s'" % power_type)
2256+
2257+ def check_power_state(state):
2258+ if state not in ("on", "off", "unknown"):
2259+ # This is considered an error.
2260+ raise PowerActionFail(state)
2261+
2262+ # Capture errors as we go along.
2263+ exc_info = None, None, None
2264+
2265+ # Use increasing waiting times to work around race conditions that could
2266+ # arise when power querying the node.
2267+ for waiting_time in default_waiting_policy:
2268+ # Perform power query.
2269+ try:
2270+ power_state = yield deferToThread(
2271+ perform_power_query, system_id, hostname,
2272+ power_type, context)
2273+ check_power_state(power_state)
2274+ except:
2275+ # Hold the error; it may be reported later.
2276+ exc_info = sys.exc_info()
2277+ # Wait before trying again.
2278+ yield pause(waiting_time, clock)
2279+ else:
2280+ yield power_state_update(system_id, power_state)
2281+ returnValue(power_state)
2282+
2283+ # Reaching here means that things have gone wrong.
2284+ assert exc_info != (None, None, None)
2285+ exc_type, exc_value, exc_trace = exc_info
2286+ message = "Power state could not be queried: %s" % (exc_value,)
2287+ yield power_query_failure(system_id, hostname, message)
2288+ raise exc_type, exc_value, exc_trace
2289+
2290+
2291+def maaslog_report_success(node, power_state):
2292+ """Log change in power state for node."""
2293+ if node['power_state'] != power_state:
2294+ maaslog.info(
2295+ "%s: Power state has changed from %s to %s.", node['hostname'],
2296+ node['power_state'], power_state)
2297+ return power_state
2298+
2299+
2300+def maaslog_report_failure(node, failure):
2301+ """Log failure to query node."""
2302+ if failure.check(PowerActionFail):
2303+ maaslog.error(
2304+ "%s: Could not query power state: %s.",
2305+ node['hostname'], failure.getErrorMessage())
2306+ elif failure.check(NoSuchNode):
2307+ maaslog.debug(
2308+ "%s: Could not update power state: "
2309+ "no such node.", node['hostname'])
2310+ else:
2311+ maaslog.error(
2312+ "%s: Failed to refresh power state: %s",
2313+ node['hostname'], failure.getErrorMessage())
2314+ # Also write out a full traceback to the server log.
2315+ log.err(failure, "Failed to refresh power state.")
2316+
2317+
2318+def query_node(node, clock):
2319+ """Calls `get_power_state` on the given node.
2320+
2321+ Logs to maaslog as errors and power states change.
2322+ """
2323+ if node['system_id'] in power_action_registry:
2324+ maaslog.debug(
2325+ "%s: Skipping query power status, "
2326+ "power action already in progress.",
2327+ node['hostname'])
2328+ return succeed(None)
2329+ else:
2330+ d = get_power_state(
2331+ node['system_id'], node['hostname'],
2332+ node['power_type'], node['context'],
2333+ clock=clock)
2334+ d.addCallbacks(
2335+ partial(maaslog_report_success, node),
2336+ partial(maaslog_report_failure, node))
2337+ return d
2338+
2339+
2340+def query_all_nodes(nodes, max_concurrency=5, clock=reactor):
2341+ """Queries the given nodes for their power state.
2342+
2343+ Nodes' states are reported back to the region.
2344+
2345+ :return: A deferred, which fires once all nodes have been queried,
2346+ successfully or not.
2347+ """
2348+ semaphore = DeferredSemaphore(tokens=max_concurrency)
2349+ queries = (
2350+ semaphore.run(query_node, node, clock)
2351+ for node in nodes if node['power_type'] in QUERY_POWER_TYPES)
2352+ return DeferredList(queries, consumeErrors=True)
2353+>>>>>>> MERGE-SOURCE
2354
2355=== modified file 'src/provisioningserver/power/tests/test_power.py'
2356--- src/provisioningserver/power/tests/test_power.py 2015-08-21 16:40:28 +0000
2357+++ src/provisioningserver/power/tests/test_power.py 2015-09-25 14:32:35 +0000
2358@@ -17,6 +17,7 @@
2359 import random
2360
2361 from maastesting.factory import factory
2362+<<<<<<< TREE
2363 from maastesting.matchers import MockCalledOnceWith
2364 from maastesting.testcase import MAASTestCase
2365 from mock import ANY
2366@@ -25,6 +26,85 @@
2367 from provisioningserver.rpc.testing import MockClusterToRegionRPCFixture
2368 from testtools.deferredruntest import extract_result
2369 from testtools.matchers import Equals
2370+=======
2371+from maastesting.matchers import (
2372+ MockCalledOnceWith,
2373+ MockCalledWith,
2374+ MockCallsMatch,
2375+ MockNotCalled,
2376+)
2377+from maastesting.testcase import (
2378+ MAASTestCase,
2379+ MAASTwistedRunTest,
2380+)
2381+from maastesting.twisted import (
2382+ always_fail_with,
2383+ always_succeed_with,
2384+ TwistedLoggerFixture,
2385+)
2386+from mock import (
2387+ ANY,
2388+ call,
2389+ DEFAULT,
2390+ Mock,
2391+ sentinel,
2392+)
2393+import provisioningserver
2394+from provisioningserver.drivers.power import PowerDriverRegistry
2395+from provisioningserver.events import EVENT_TYPES
2396+from provisioningserver.power.poweraction import PowerActionFail
2397+from provisioningserver.rpc import (
2398+ exceptions,
2399+ power,
2400+ region,
2401+)
2402+from provisioningserver.rpc.testing import (
2403+ MockClusterToRegionRPCFixture,
2404+ MockLiveClusterToRegionRPCFixture,
2405+)
2406+from testtools import ExpectedException
2407+from testtools.deferredruntest import (
2408+ assert_fails_with,
2409+ extract_result,
2410+)
2411+from testtools.matchers import (
2412+ Equals,
2413+ IsInstance,
2414+ Not,
2415+)
2416+from twisted.internet import reactor
2417+from twisted.internet.defer import (
2418+ Deferred,
2419+ fail,
2420+ inlineCallbacks,
2421+ maybeDeferred,
2422+ returnValue,
2423+ succeed,
2424+)
2425+from twisted.internet.task import Clock
2426+
2427+
2428+def patch_power_action(test, return_value=DEFAULT, side_effect=None):
2429+ """Patch the PowerAction object.
2430+
2431+ Patch the PowerAction object so that PowerAction().execute
2432+ is replaced by a Mock object created using the given `return_value`
2433+ and `side_effect`.
2434+
2435+ This can be used to simulate various successes or failures patterns
2436+ while manipulating the power state of a node.
2437+
2438+ Returns a tuple of mock objects: power.PowerAction and
2439+ power.PowerAction().execute.
2440+ """
2441+ power_action_obj = Mock()
2442+ power_action_obj_execute = Mock(
2443+ return_value=return_value, side_effect=side_effect)
2444+ power_action_obj.execute = power_action_obj_execute
2445+ power_action = test.patch(power, 'PowerAction')
2446+ power_action.return_value = power_action_obj
2447+ return power_action, power_action_obj_execute
2448+>>>>>>> MERGE-SOURCE
2449
2450
2451 class TestPowerHelpers(MAASTestCase):
2452@@ -51,3 +131,924 @@
2453 system_id=system_id,
2454 power_state=state)
2455 )
2456+<<<<<<< TREE
2457+=======
2458+
2459+
2460+class TestChangePowerState(MAASTestCase):
2461+
2462+ run_tests_with = MAASTwistedRunTest.make_factory(timeout=5)
2463+
2464+ @inlineCallbacks
2465+ def patch_rpc_methods(self, return_value={}, side_effect=None):
2466+ fixture = self.useFixture(MockLiveClusterToRegionRPCFixture())
2467+ protocol, connecting = fixture.makeEventLoop(
2468+ region.MarkNodeFailed, region.UpdateNodePowerState,
2469+ region.SendEvent)
2470+ protocol.MarkNodeFailed.return_value = return_value
2471+ protocol.MarkNodeFailed.side_effect = side_effect
2472+ self.addCleanup((yield connecting))
2473+ returnValue(protocol.MarkNodeFailed)
2474+
2475+ def test_change_power_state_calls_power_change_starting_early_on(self):
2476+ # The first, or one of the first, things that change_power_state()
2477+ # does is write to the node event log via power_change_starting().
2478+
2479+ class ArbitraryException(Exception):
2480+ """This allows us to return early from a function."""
2481+
2482+ # Raise this exception when power_change_starting() is called, to
2483+ # return early from change_power_state(). This lets us avoid set-up
2484+ # for parts of the function that we're presently not interested in.
2485+ self.patch_autospec(power, "power_change_starting")
2486+ power.power_change_starting.side_effect = ArbitraryException()
2487+
2488+ d = power.change_power_state(
2489+ sentinel.system_id, sentinel.hostname, sentinel.power_type,
2490+ sentinel.power_change, sentinel.context)
2491+ self.assertRaises(ArbitraryException, extract_result, d)
2492+ self.assertThat(
2493+ power.power_change_starting, MockCalledOnceWith(
2494+ sentinel.system_id, sentinel.hostname, sentinel.power_change))
2495+
2496+ @inlineCallbacks
2497+ def test_change_power_state_changes_power_state(self):
2498+ system_id = factory.make_name('system_id')
2499+ hostname = factory.make_name('hostname')
2500+ power_type = random.choice(power.QUERY_POWER_TYPES)
2501+ power_change = random.choice(['on', 'off'])
2502+ context = {
2503+ factory.make_name('context-key'): factory.make_name('context-val')
2504+ }
2505+ self.patch(power, 'pause')
2506+ power.power_action_registry[system_id] = power_change, sentinel.d
2507+ # Patch the power action utility so that it says the node is
2508+ # in the required power state.
2509+ power_action, execute = patch_power_action(
2510+ self, return_value=power_change)
2511+ markNodeBroken = yield self.patch_rpc_methods()
2512+
2513+ yield power.change_power_state(
2514+ system_id, hostname, power_type, power_change, context)
2515+ self.assertThat(
2516+ execute,
2517+ MockCallsMatch(
2518+ # One call to change the power state.
2519+ call(power_change=power_change, **context),
2520+ # One call to query the power state.
2521+ call(power_change='query', **context),
2522+ ),
2523+ )
2524+ # The node hasn't been marked broken.
2525+ self.assertThat(markNodeBroken, MockNotCalled())
2526+
2527+ @inlineCallbacks
2528+ def test_change_power_state_doesnt_retry_for_certain_power_types(self):
2529+ system_id = factory.make_name('system_id')
2530+ hostname = factory.make_name('hostname')
2531+ # Use a power type that is not among power.QUERY_POWER_TYPES.
2532+ power_type = factory.make_name('power_type')
2533+ power_change = random.choice(['on', 'off'])
2534+ context = {
2535+ factory.make_name('context-key'): factory.make_name('context-val')
2536+ }
2537+ power.power_action_registry[system_id] = power_change, sentinel.d
2538+ self.patch(power, 'pause')
2539+ power_action, execute = patch_power_action(
2540+ self, return_value=random.choice(['on', 'off']))
2541+ markNodeBroken = yield self.patch_rpc_methods()
2542+
2543+ yield power.change_power_state(
2544+ system_id, hostname, power_type, power_change, context)
2545+ self.assertThat(
2546+ execute,
2547+ MockCallsMatch(
2548+ # Only one call to change the power state.
2549+ call(power_change=power_change, **context),
2550+ ),
2551+ )
2552+ # The node hasn't been marked broken.
2553+ self.assertThat(markNodeBroken, MockNotCalled())
2554+
2555+ @inlineCallbacks
2556+ def test_change_power_state_retries_if_power_state_doesnt_change(self):
2557+ system_id = factory.make_name('system_id')
2558+ hostname = factory.make_name('hostname')
2559+ power_type = random.choice(power.QUERY_POWER_TYPES)
2560+ power_change = 'on'
2561+ context = {
2562+ factory.make_name('context-key'): factory.make_name('context-val')
2563+ }
2564+ self.patch(power, 'pause')
2565+ power.power_action_registry[system_id] = power_change, sentinel.d
2566+ # Simulate a failure to power up the node, then a success.
2567+ power_action, execute = patch_power_action(
2568+ self, side_effect=[None, 'off', None, 'on'])
2569+ markNodeBroken = yield self.patch_rpc_methods()
2570+
2571+ yield power.change_power_state(
2572+ system_id, hostname, power_type, power_change, context)
2573+ self.assertThat(
2574+ execute,
2575+ MockCallsMatch(
2576+ call(power_change=power_change, **context),
2577+ call(power_change='query', **context),
2578+ call(power_change=power_change, **context),
2579+ call(power_change='query', **context),
2580+ )
2581+ )
2582+ # The node hasn't been marked broken.
2583+ self.assertThat(markNodeBroken, MockNotCalled())
2584+
2585+ @inlineCallbacks
2586+ def test_change_power_state_doesnt_retry_if_query_returns_unknown(self):
2587+ system_id = factory.make_name('system_id')
2588+ hostname = factory.make_name('hostname')
2589+ power_type = random.choice(power.QUERY_POWER_TYPES)
2590+ power_change = random.choice(['on', 'off'])
2591+ context = {
2592+ factory.make_name('context-key'): factory.make_name('context-val')
2593+ }
2594+ self.patch(power, 'pause')
2595+ power.power_action_registry[system_id] = power_change, sentinel.d
2596+ # Patch the power action utility so that it says the node is
2597+ # in the required power state.
2598+ power_action, execute = patch_power_action(
2599+ self, return_value="unknown")
2600+ markNodeBroken = yield self.patch_rpc_methods()
2601+
2602+ yield power.change_power_state(
2603+ system_id, hostname, power_type, power_change, context)
2604+ self.assertThat(
2605+ execute,
2606+ MockCallsMatch(
2607+ # One call to change the power state.
2608+ call(power_change=power_change, **context),
2609+ # One call to query the power state.
2610+ call(power_change='query', **context),
2611+ ),
2612+ )
2613+ # The node hasn't been marked broken.
2614+ self.assertThat(markNodeBroken, MockNotCalled())
2615+
2616+ @inlineCallbacks
2617+ def test_change_power_state_marks_the_node_broken_if_failure(self):
2618+ system_id = factory.make_name('system_id')
2619+ hostname = factory.make_name('hostname')
2620+ power_type = random.choice(power.QUERY_POWER_TYPES)
2621+ power_change = 'on'
2622+ context = {
2623+ factory.make_name('context-key'): factory.make_name('context-val')
2624+ }
2625+ self.patch(power, 'pause')
2626+ power.power_action_registry[system_id] = power_change, sentinel.d
2627+ # Simulate a persistent failure.
2628+ power_action, execute = patch_power_action(
2629+ self, return_value='off')
2630+ markNodeBroken = yield self.patch_rpc_methods()
2631+
2632+ yield power.change_power_state(
2633+ system_id, hostname, power_type, power_change, context)
2634+
2635+ # The node has been marked broken.
2636+ msg = "Timeout after %s tries" % len(
2637+ power.default_waiting_policy)
2638+ self.assertThat(
2639+ markNodeBroken,
2640+ MockCalledOnceWith(
2641+ ANY,
2642+ system_id=system_id,
2643+ error_description=msg)
2644+ )
2645+
2646+ @inlineCallbacks
2647+ def test_change_power_state_marks_the_node_broken_if_exception(self):
2648+ system_id = factory.make_name('system_id')
2649+ hostname = factory.make_name('hostname')
2650+ power_type = random.choice(power.QUERY_POWER_TYPES)
2651+ power_change = 'on'
2652+ context = {
2653+ factory.make_name('context-key'): factory.make_name('context-val')
2654+ }
2655+ self.patch(power, 'pause')
2656+ power.power_action_registry[system_id] = power_change, sentinel.d
2657+ # Simulate an exception.
2658+ exception_message = factory.make_name('exception')
2659+ power_action, execute = patch_power_action(
2660+ self, side_effect=PowerActionFail(exception_message))
2661+ markNodeBroken = yield self.patch_rpc_methods()
2662+
2663+ with ExpectedException(PowerActionFail):
2664+ yield power.change_power_state(
2665+ system_id, hostname, power_type, power_change, context)
2666+
2667+ error_message = "Node could not be powered on: %s" % exception_message
2668+ self.assertThat(
2669+ markNodeBroken, MockCalledOnceWith(
2670+ ANY, system_id=system_id, error_description=error_message))
2671+
2672+ @inlineCallbacks
2673+ def test_change_power_state_pauses_inbetween_retries(self):
2674+ system_id = factory.make_name('system_id')
2675+ hostname = factory.make_name('hostname')
2676+ power_type = random.choice(power.QUERY_POWER_TYPES)
2677+ power_change = 'on'
2678+ context = {
2679+ factory.make_name('context-key'): factory.make_name('context-val')
2680+ }
2681+ power.power_action_registry[system_id] = power_change, sentinel.d
2682+ # Simulate two failures to power up the node, then a success.
2683+ power_action, execute = patch_power_action(
2684+ self, side_effect=[None, 'off', None, 'off', None, 'on'])
2685+ # Patch calls to pause() to `execute` so that we record both in the
2686+ # same place, and can thus see ordering.
2687+ self.patch(power, 'pause', execute)
2688+
2689+ yield self.patch_rpc_methods()
2690+
2691+ yield power.change_power_state(
2692+ system_id, hostname, power_type, power_change, context)
2693+
2694+ self.assertThat(execute, MockCallsMatch(
2695+ call(power_change=power_change, **context),
2696+ call(1, reactor), # pause(1, reactor)
2697+ call(power_change='query', **context),
2698+ call(power_change=power_change, **context),
2699+ call(2, reactor), # pause(1, reactor)
2700+ call(power_change='query', **context),
2701+ ))
2702+
2703+
2704+class TestPowerQuery(MAASTestCase):
2705+
2706+ def setUp(self):
2707+ super(TestPowerQuery, self).setUp()
2708+ self.patch(
2709+ provisioningserver.rpc.power, 'deferToThread', maybeDeferred)
2710+
2711+ def patch_rpc_methods(self, return_value={}, side_effect=None):
2712+ fixture = self.useFixture(MockClusterToRegionRPCFixture())
2713+ protocol, io = fixture.makeEventLoop(
2714+ region.MarkNodeFailed, region.SendEvent,
2715+ region.UpdateNodePowerState)
2716+ protocol.MarkNodeFailed.return_value = return_value
2717+ protocol.MarkNodeFailed.side_effect = side_effect
2718+ return protocol.SendEvent, protocol.MarkNodeFailed, io
2719+
2720+ def test_get_power_state_querys_node(self):
2721+ system_id = factory.make_name('system_id')
2722+ hostname = factory.make_name('hostname')
2723+ power_type = random.choice(power.QUERY_POWER_TYPES)
2724+ power_state = random.choice(['on', 'off'])
2725+ context = {
2726+ factory.make_name('context-key'): factory.make_name('context-val')
2727+ }
2728+ self.patch(power, 'pause')
2729+ # Patch the power action utility so that it says the node is
2730+ # in on/off power state.
2731+ power_action, execute = patch_power_action(
2732+ self, return_value=power_state)
2733+ _, markNodeBroken, io = self.patch_rpc_methods()
2734+
2735+ d = power.get_power_state(
2736+ system_id, hostname, power_type, context)
2737+ # This blocks until the deferred is complete
2738+ io.flush()
2739+ self.assertEqual(power_state, extract_result(d))
2740+ self.assertThat(
2741+ execute,
2742+ MockCallsMatch(
2743+ # One call to change the power state.
2744+ call(power_change='query', **context),
2745+ ),
2746+ )
2747+
2748+ def test_get_power_state_returns_unknown_for_certain_power_types(self):
2749+ system_id = factory.make_name('system_id')
2750+ hostname = factory.make_name('hostname')
2751+ # Use a power type that is not among power.QUERY_POWER_TYPES.
2752+ power_type = factory.make_name('power_type')
2753+ context = {
2754+ factory.make_name('context-key'): factory.make_name('context-val')
2755+ }
2756+ _, _, io = self.patch_rpc_methods()
2757+
2758+ d = power.get_power_state(
2759+ system_id, hostname, power_type, context)
2760+
2761+ return assert_fails_with(d, PowerActionFail)
2762+
2763+ def test_get_power_state_retries_if_power_query_fails(self):
2764+ system_id = factory.make_name('system_id')
2765+ hostname = factory.make_name('hostname')
2766+ power_type = random.choice(power.QUERY_POWER_TYPES)
2767+ power_state = random.choice(['on', 'off'])
2768+ err_msg = factory.make_name('error')
2769+ context = {
2770+ factory.make_name('context-key'): factory.make_name('context-val')
2771+ }
2772+ self.patch(power, 'pause')
2773+ # Simulate a failure to power query the node, then success.
2774+ power_action, execute = patch_power_action(
2775+ self, side_effect=[PowerActionFail(err_msg), power_state])
2776+ sendEvent, markNodeBroken, io = self.patch_rpc_methods()
2777+
2778+ d = power.get_power_state(
2779+ system_id, hostname, power_type, context)
2780+ # This blocks until the deferred is complete
2781+ io.flush()
2782+ self.assertEqual(power_state, extract_result(d))
2783+ self.assertThat(
2784+ execute,
2785+ MockCallsMatch(
2786+ call(power_change='query', **context),
2787+ call(power_change='query', **context),
2788+ )
2789+ )
2790+ # The node hasn't been marked broken.
2791+ self.assertThat(markNodeBroken, MockNotCalled())
2792+
2793+ def test_get_power_state_changes_power_state_if_failure(self):
2794+ system_id = factory.make_name('system_id')
2795+ hostname = factory.make_name('hostname')
2796+ power_type = random.choice(power.QUERY_POWER_TYPES)
2797+ err_msg = factory.make_name('error')
2798+ context = {
2799+ factory.make_name('context-key'): factory.make_name('context-val')
2800+ }
2801+ self.patch(power, 'pause')
2802+ power_state_update = self.patch_autospec(power, 'power_state_update')
2803+
2804+ # Simulate a persistent failure.
2805+ power_action, execute = patch_power_action(
2806+ self, side_effect=PowerActionFail(err_msg))
2807+ _, _, io = self.patch_rpc_methods()
2808+
2809+ d = power.get_power_state(
2810+ system_id, hostname, power_type, context)
2811+ io.flush()
2812+ d.addCallback(self.fail)
2813+
2814+ error = self.assertRaises(PowerActionFail, extract_result, d)
2815+ self.assertEqual(err_msg, unicode(error))
2816+ self.assertThat(
2817+ power_state_update, MockCalledOnceWith(system_id, 'error'))
2818+
2819+ def test_get_power_state_changes_power_state_if_success(self):
2820+ system_id = factory.make_name('system_id')
2821+ hostname = factory.make_name('hostname')
2822+ power_state = random.choice(['on', 'off'])
2823+ power_type = random.choice(power.QUERY_POWER_TYPES)
2824+ context = {
2825+ factory.make_name('context-key'): factory.make_name('context-val')
2826+ }
2827+ self.patch(power, 'pause')
2828+ power_state_update = self.patch_autospec(power, 'power_state_update')
2829+
2830+ # Simulate success.
2831+ power_action, execute = patch_power_action(
2832+ self, return_value=power_state)
2833+ _, _, io = self.patch_rpc_methods()
2834+
2835+ d = power.get_power_state(
2836+ system_id, hostname, power_type, context)
2837+ io.flush()
2838+ self.assertEqual(power_state, extract_result(d))
2839+ self.assertThat(
2840+ power_state_update, MockCalledOnceWith(system_id, power_state))
2841+
2842+ def test_get_power_state_changes_power_state_if_unknown(self):
2843+ system_id = factory.make_name('system_id')
2844+ hostname = factory.make_name('hostname')
2845+ power_state = "unknown"
2846+ power_type = random.choice(power.QUERY_POWER_TYPES)
2847+ context = {
2848+ factory.make_name('context-key'): factory.make_name('context-val')
2849+ }
2850+ self.patch(power, 'pause')
2851+ power_state_update = self.patch_autospec(power, 'power_state_update')
2852+
2853+ # Simulate success.
2854+ power_action, execute = patch_power_action(
2855+ self, return_value=power_state)
2856+ _, _, io = self.patch_rpc_methods()
2857+
2858+ d = power.get_power_state(
2859+ system_id, hostname, power_type, context)
2860+ io.flush()
2861+ self.assertEqual(power_state, extract_result(d))
2862+ self.assertThat(
2863+ power_state_update, MockCalledOnceWith(system_id, power_state))
2864+
2865+ def test_get_power_state_pauses_inbetween_retries(self):
2866+ system_id = factory.make_name('system_id')
2867+ hostname = factory.make_name('hostname')
2868+ power_type = random.choice(power.QUERY_POWER_TYPES)
2869+ context = {
2870+ factory.make_name('context-key'): factory.make_name('context-val')
2871+ }
2872+ # Simulate two failures to power up the node, then a success.
2873+ power_action, execute = patch_power_action(
2874+ self, side_effect=[PowerActionFail, PowerActionFail, 'off'])
2875+ self.patch(power, "deferToThread", maybeDeferred)
2876+ _, _, io = self.patch_rpc_methods()
2877+ clock = Clock()
2878+
2879+ calls_and_pause = [
2880+ ([
2881+ call(power_change='query', **context),
2882+ ], 3),
2883+ ([
2884+ call(power_change='query', **context),
2885+ ], 5),
2886+ ([
2887+ call(power_change='query', **context),
2888+ ], 10),
2889+ ]
2890+ calls = []
2891+ d = power.get_power_state(
2892+ system_id, hostname, power_type, context, clock=clock)
2893+ for newcalls, waiting_time in calls_and_pause:
2894+ calls.extend(newcalls)
2895+ # This blocks until the deferred is complete
2896+ io.flush()
2897+ self.assertThat(execute, MockCallsMatch(*calls))
2898+ clock.advance(waiting_time)
2899+ self.assertEqual("off", extract_result(d))
2900+
2901+
2902+class TestPowerQueryExceptions(MAASTestCase):
2903+
2904+ scenarios = tuple(
2905+ (power_type, {
2906+ "power_type": power_type,
2907+ "func": ( # Function to invoke driver.
2908+ "perform_power_driver_query"
2909+ if power_type in PowerDriverRegistry
2910+ else "perform_power_query"),
2911+ "waits": ( # Pauses between retries.
2912+ [] if power_type in PowerDriverRegistry
2913+ else power.default_waiting_policy),
2914+ "calls": ( # No. of calls to the driver.
2915+ 1 if power_type in PowerDriverRegistry
2916+ else len(power.default_waiting_policy)),
2917+ })
2918+ for power_type in power.QUERY_POWER_TYPES
2919+ )
2920+
2921+ def test_get_power_state_captures_all_exceptions(self):
2922+ logger_twisted = self.useFixture(TwistedLoggerFixture())
2923+ logger_maaslog = self.useFixture(FakeLogger("maas"))
2924+
2925+ # Avoid threads here.
2926+ self.patch(power, "deferToThread", maybeDeferred)
2927+
2928+ exception_type = factory.make_exception_type()
2929+ exception_message = factory.make_string()
2930+ exception = exception_type(exception_message)
2931+
2932+ # Pretend the query always fails with `exception`.
2933+ query = self.patch_autospec(power, self.func)
2934+ query.side_effect = always_fail_with(exception)
2935+
2936+ # Intercept calls to power_query_failure().
2937+ self.patch_autospec(power, "power_query_failure")
2938+
2939+ system_id = factory.make_name('system_id')
2940+ hostname = factory.make_name('hostname')
2941+ context = sentinel.context
2942+ clock = Clock()
2943+
2944+ d = power.get_power_state(
2945+ system_id, hostname, self.power_type, context, clock)
2946+
2947+ # Crank through some number of retries.
2948+ for wait in self.waits:
2949+ self.assertFalse(d.called)
2950+ clock.advance(wait)
2951+ self.assertTrue(d.called)
2952+
2953+ # Finally the exception from the query is raised.
2954+ self.assertRaises(exception_type, extract_result, d)
2955+
2956+ # The broken power query function patched earlier was called the same
2957+ # number of times as there are steps in the default waiting policy.
2958+ expected_call = call(system_id, hostname, self.power_type, context)
2959+ expected_calls = [expected_call] * self.calls
2960+ self.assertThat(query, MockCallsMatch(*expected_calls))
2961+
2962+ # power_query_failure() was called once at the end with a message
2963+ # constructed using the error message we fabricated at the beginning.
2964+ expected_message = (
2965+ "Power state could not be queried: %s" % exception_message)
2966+ self.assertThat(power.power_query_failure, MockCalledOnceWith(
2967+ system_id, hostname, expected_message))
2968+
2969+ # Nothing was logged to the Twisted log or to maaslog; that happens
2970+ # elsewhere, in maaslog_query_failure() and maaslog_query().
2971+ self.assertEqual("", logger_twisted.output)
2972+ self.assertEqual("", logger_maaslog.output)
2973+
2974+
2975+class TestPowerQueryAsync(MAASTestCase):
2976+
2977+ run_tests_with = MAASTwistedRunTest.make_factory(timeout=5)
2978+
2979+ def make_node(self, power_type=None):
2980+ system_id = factory.make_name('system_id')
2981+ hostname = factory.make_name('hostname')
2982+ if power_type is None:
2983+ power_type = random.choice(power.QUERY_POWER_TYPES)
2984+ state = random.choice(['on', 'off', 'unknown', 'error'])
2985+ context = {
2986+ factory.make_name('context-key'): (
2987+ factory.make_name('context-val'))
2988+ }
2989+ return {
2990+ 'context': context,
2991+ 'hostname': hostname,
2992+ 'power_state': state,
2993+ 'power_type': power_type,
2994+ 'system_id': system_id,
2995+ }
2996+
2997+ def make_nodes(self, count=3):
2998+ nodes = [self.make_node() for _ in xrange(count)]
2999+ # Sanity check that these nodes are something that can emerge
3000+ # from a call to ListNodePowerParameters.
3001+ region.ListNodePowerParameters.makeResponse({"nodes": nodes}, None)
3002+ return nodes
3003+
3004+ def pick_alternate_state(self, state):
3005+ return random.choice([
3006+ value for value in ['on', 'off', 'unknown', 'error']
3007+ if value != state])
3008+
3009+ @inlineCallbacks
3010+ def test_query_all_nodes_calls_get_power_state(self):
3011+ nodes = self.make_nodes()
3012+ # Report back that all nodes' power states are as recorded.
3013+ power_states = [node['power_state'] for node in nodes]
3014+ get_power_state = self.patch(power, 'get_power_state')
3015+ get_power_state.side_effect = [
3016+ succeed(power_state)
3017+ for power_state in power_states
3018+ ]
3019+
3020+ yield power.query_all_nodes(nodes)
3021+ self.assertThat(get_power_state, MockCallsMatch(*(
3022+ call(
3023+ node['system_id'], node['hostname'],
3024+ node['power_type'], node['context'],
3025+ clock=reactor)
3026+ for node in nodes
3027+ )))
3028+
3029+ @inlineCallbacks
3030+ def test_query_all_nodes_logs_skip_if_node_in_action_registry(self):
3031+ node = self.make_node()
3032+ power.power_action_registry[node['system_id']] = sentinel.action
3033+ with FakeLogger("maas.power", level=logging.DEBUG) as maaslog:
3034+ yield power.query_all_nodes([node])
3035+ self.assertDocTestMatches(
3036+ "hostname-...: Skipping query power status, "
3037+ "power action already in progress.",
3038+ maaslog.output)
3039+
3040+ @inlineCallbacks
3041+ def test_query_all_nodes_skips_nodes_in_action_registry(self):
3042+ nodes = self.make_nodes()
3043+
3044+ # First node is in the registry.
3045+ power.power_action_registry[nodes[0]['system_id']] = sentinel.action
3046+
3047+ # Report back power state of nodes' not in registry.
3048+ power_states = [node['power_state'] for node in nodes[1:]]
3049+ get_power_state = self.patch(power, 'get_power_state')
3050+ get_power_state.side_effect = [
3051+ succeed(power_state)
3052+ for power_state in power_states
3053+ ]
3054+
3055+ yield power.query_all_nodes(nodes)
3056+ self.assertThat(get_power_state, MockCallsMatch(*(
3057+ call(
3058+ node['system_id'], node['hostname'],
3059+ node['power_type'], node['context'],
3060+ clock=reactor)
3061+ for node in nodes[1:]
3062+ )))
3063+ self.assertThat(
3064+ get_power_state, Not(MockCalledWith(
3065+ nodes[0]['system_id'], nodes[0]['hostname'],
3066+ nodes[0]['power_type'], nodes[0]['context'],
3067+ clock=reactor)))
3068+
3069+ @inlineCallbacks
3070+ def test_query_all_nodes_only_queries_queryable_power_types(self):
3071+ nodes = self.make_nodes()
3072+ # nodes are all queryable, so add one that isn't:
3073+ nodes.append(self.make_node(power_type='ether_wake'))
3074+
3075+ # Report back that all nodes' power states are as recorded.
3076+ power_states = [node['power_state'] for node in nodes]
3077+ get_power_state = self.patch(power, 'get_power_state')
3078+ get_power_state.side_effect = [
3079+ succeed(power_state)
3080+ for power_state in power_states
3081+ ]
3082+
3083+ yield power.query_all_nodes(nodes)
3084+ self.assertThat(get_power_state, MockCallsMatch(*(
3085+ call(
3086+ node['system_id'], node['hostname'],
3087+ node['power_type'], node['context'],
3088+ clock=reactor)
3089+ for node in nodes
3090+ if node['power_type'] in power.QUERY_POWER_TYPES
3091+ )))
3092+
3093+ @inlineCallbacks
3094+ def test_query_all_nodes_swallows_PowerActionFail(self):
3095+ node1, node2 = self.make_nodes(2)
3096+ new_state_2 = self.pick_alternate_state(node2['power_state'])
3097+ get_power_state = self.patch(power, 'get_power_state')
3098+ error_msg = factory.make_name("error")
3099+ get_power_state.side_effect = [
3100+ fail(PowerActionFail(error_msg)), succeed(new_state_2)]
3101+
3102+ with FakeLogger("maas.power", level=logging.DEBUG) as maaslog:
3103+ yield power.query_all_nodes([node1, node2])
3104+
3105+ self.assertDocTestMatches(
3106+ """\
3107+ hostname-...: Could not query power state: %s.
3108+ hostname-...: Power state has changed from ... to ...
3109+ """ % error_msg,
3110+ maaslog.output)
3111+
3112+ @inlineCallbacks
3113+ def test_query_all_nodes_swallows_NoSuchNode(self):
3114+ node1, node2 = self.make_nodes(2)
3115+ new_state_2 = self.pick_alternate_state(node2['power_state'])
3116+ get_power_state = self.patch(power, 'get_power_state')
3117+ get_power_state.side_effect = [
3118+ fail(exceptions.NoSuchNode()), succeed(new_state_2)]
3119+
3120+ with FakeLogger("maas.power", level=logging.DEBUG) as maaslog:
3121+ yield power.query_all_nodes([node1, node2])
3122+
3123+ self.assertDocTestMatches(
3124+ """\
3125+ hostname-...: Could not update power state: no such node.
3126+ hostname-...: Power state has changed from ... to ...
3127+ """,
3128+ maaslog.output)
3129+
3130+ @inlineCallbacks
3131+ def test_query_all_nodes_swallows_Exception(self):
3132+ node1, node2 = self.make_nodes(2)
3133+ error_message = factory.make_name("error")
3134+ error_type = factory.make_exception_type()
3135+ new_state_2 = self.pick_alternate_state(node2['power_state'])
3136+ get_power_state = self.patch(power, 'get_power_state')
3137+ get_power_state.side_effect = [
3138+ fail(error_type(error_message)),
3139+ succeed(new_state_2),
3140+ ]
3141+
3142+ maaslog = FakeLogger("maas.power", level=logging.DEBUG)
3143+ twistlog = TwistedLoggerFixture()
3144+
3145+ with maaslog, twistlog:
3146+ yield power.query_all_nodes([node1, node2])
3147+
3148+ self.assertDocTestMatches(
3149+ """\
3150+ hostname-...: Failed to refresh power state: %s
3151+ hostname-...: Power state has changed from ... to ...
3152+ """ % error_message,
3153+ maaslog.output)
3154+ self.assertDocTestMatches(
3155+ """\
3156+ Failed to refresh power state.
3157+ Traceback (most recent call last):
3158+ Failure: maastesting.factory.TestException#...: %s
3159+ """ % error_message,
3160+ twistlog.output)
3161+
3162+ @inlineCallbacks
3163+ def test_query_all_nodes_returns_deferredlist_of_number_of_nodes(self):
3164+ node1, node2 = self.make_nodes(2)
3165+ get_power_state = self.patch(power, 'get_power_state')
3166+ get_power_state.side_effect = [
3167+ succeed(node1['power_state']), succeed(node2['power_state'])]
3168+
3169+ results = yield power.query_all_nodes([node1, node2])
3170+ self.assertEqual(
3171+ [(True, node1['power_state']), (True, node2['power_state'])],
3172+ results)
3173+
3174+
3175+class TestMaybeChangePowerState(MAASTestCase):
3176+
3177+ run_tests_with = MAASTwistedRunTest.make_factory(timeout=5)
3178+
3179+ def setUp(self):
3180+ super(TestMaybeChangePowerState, self).setUp()
3181+ self.patch(power, 'power_action_registry', {})
3182+
3183+ def patch_methods_using_rpc(self):
3184+ self.patch_autospec(power, 'power_change_starting')
3185+ power.power_change_starting.side_effect = always_succeed_with(None)
3186+
3187+ self.patch_autospec(power, 'change_power_state')
3188+ power.change_power_state.side_effect = always_succeed_with(None)
3189+
3190+ def test_always_returns_deferred(self):
3191+ clock = Clock()
3192+ d = power.maybe_change_power_state(
3193+ sentinel.system_id, sentinel.hostname, sentinel.power_type,
3194+ random.choice(("on", "off")), sentinel.context, clock=clock)
3195+ self.assertThat(d, IsInstance(Deferred))
3196+
3197+ @inlineCallbacks
3198+ def test_adds_action_to_registry(self):
3199+ self.patch_methods_using_rpc()
3200+
3201+ system_id = factory.make_name('system_id')
3202+ hostname = factory.make_name('hostname')
3203+ power_type = random.choice(power.QUERY_POWER_TYPES)
3204+ power_change = random.choice(['on', 'off'])
3205+ context = {
3206+ factory.make_name('context-key'): factory.make_name('context-val')
3207+ }
3208+
3209+ yield power.maybe_change_power_state(
3210+ system_id, hostname, power_type, power_change, context)
3211+ self.assertEqual(
3212+ {system_id: (power_change, ANY)},
3213+ power.power_action_registry)
3214+ reactor.runUntilCurrent() # Run all delayed calls.
3215+ self.assertEqual({}, power.power_action_registry)
3216+
3217+ @inlineCallbacks
3218+ def test_errors_when_change_conflicts_with_in_progress_change(self):
3219+ system_id = factory.make_name('system_id')
3220+ hostname = factory.make_name('hostname')
3221+ power_type = random.choice(power.QUERY_POWER_TYPES)
3222+ power_changes = ['on', 'off']
3223+ random.shuffle(power_changes)
3224+ current_power_change, power_change = power_changes
3225+ context = {
3226+ factory.make_name('context-key'): factory.make_name('context-val')
3227+ }
3228+ power.power_action_registry[system_id] = (
3229+ current_power_change, sentinel.d)
3230+ with ExpectedException(exceptions.PowerActionAlreadyInProgress):
3231+ yield power.maybe_change_power_state(
3232+ system_id, hostname, power_type, power_change, context)
3233+
3234+ @inlineCallbacks
3235+ def test_does_nothing_when_change_matches_in_progress_change(self):
3236+ system_id = factory.make_name('system_id')
3237+ hostname = factory.make_name('hostname')
3238+ power_type = random.choice(power.QUERY_POWER_TYPES)
3239+ current_power_change = power_change = random.choice(['on', 'off'])
3240+ context = {
3241+ factory.make_name('context-key'): factory.make_name('context-val')
3242+ }
3243+ power.power_action_registry[system_id] = (
3244+ current_power_change, sentinel.d)
3245+ yield power.maybe_change_power_state(
3246+ system_id, hostname, power_type, power_change, context)
3247+ self.assertThat(power.power_action_registry, Equals(
3248+ {system_id: (power_change, sentinel.d)}))
3249+
3250+ @inlineCallbacks
3251+ def test_calls_change_power_state_later(self):
3252+ self.patch_methods_using_rpc()
3253+
3254+ system_id = factory.make_name('system_id')
3255+ hostname = factory.make_name('hostname')
3256+ power_type = random.choice(power.QUERY_POWER_TYPES)
3257+ power_change = random.choice(['on', 'off'])
3258+ context = {
3259+ factory.make_name('context-key'): factory.make_name('context-val')
3260+ }
3261+
3262+ yield power.maybe_change_power_state(
3263+ system_id, hostname, power_type, power_change, context)
3264+ reactor.runUntilCurrent() # Run all delayed calls.
3265+ self.assertThat(
3266+ power.change_power_state,
3267+ MockCalledOnceWith(
3268+ system_id, hostname, power_type, power_change, context,
3269+ power.reactor))
3270+
3271+ @inlineCallbacks
3272+ def test_clears_lock_if_change_power_state_success(self):
3273+ self.patch_methods_using_rpc()
3274+
3275+ system_id = factory.make_name('system_id')
3276+ hostname = factory.make_name('hostname')
3277+ power_type = random.choice(power.QUERY_POWER_TYPES)
3278+ power_change = random.choice(['on', 'off'])
3279+ context = {
3280+ factory.make_name('context-key'): factory.make_name('context-val')
3281+ }
3282+
3283+ yield power.maybe_change_power_state(
3284+ system_id, hostname, power_type, power_change, context)
3285+ reactor.runUntilCurrent() # Run all delayed calls.
3286+ self.assertNotIn(system_id, power.power_action_registry)
3287+
3288+ @inlineCallbacks
3289+ def test_clears_lock_if_change_power_state_fails(self):
3290+
3291+ class TestException(Exception):
3292+ pass
3293+
3294+ self.patch_autospec(power, 'power_change_starting')
3295+ power.power_change_starting.side_effect = TestException('boom')
3296+
3297+ system_id = factory.make_name('system_id')
3298+ hostname = factory.make_hostname()
3299+ power_type = sentinel.power_type
3300+ power_change = random.choice(['on', 'off'])
3301+ context = sentinel.context
3302+
3303+ logger = self.useFixture(TwistedLoggerFixture())
3304+
3305+ yield power.maybe_change_power_state(
3306+ system_id, hostname, power_type, power_change, context)
3307+ reactor.runUntilCurrent() # Run all delayed calls.
3308+ self.assertNotIn(system_id, power.power_action_registry)
3309+ self.assertDocTestMatches(
3310+ """\
3311+ %s: Power could not be turned %s.
3312+ Traceback (most recent call last):
3313+ ...
3314+ %s.TestException: boom
3315+ """ % (hostname, power_change, __name__),
3316+ logger.dump())
3317+
3318+ @inlineCallbacks
3319+ def test_clears_lock_if_change_power_state_is_cancelled(self):
3320+ # Patch in an unfired Deferred here. This will pause the call so that
3321+ # we can grab the delayed call from the registry in time to cancel it.
3322+ self.patch_autospec(power, 'change_power_state')
3323+ power.change_power_state.return_value = Deferred()
3324+ mock_power_change_failure = self.patch_autospec(
3325+ power, 'power_change_failure')
3326+
3327+ system_id = factory.make_name('system_id')
3328+ hostname = factory.make_hostname()
3329+ power_type = sentinel.power_type
3330+ power_change = random.choice(['on', 'off'])
3331+ context = sentinel.context
3332+
3333+ logger = self.useFixture(TwistedLoggerFixture())
3334+
3335+ yield power.maybe_change_power_state(
3336+ system_id, hostname, power_type, power_change, context)
3337+
3338+ # Get the Deferred from the registry and cancel it.
3339+ _, d = power.power_action_registry[system_id]
3340+ d.cancel()
3341+ yield d
3342+
3343+ self.assertNotIn(system_id, power.power_action_registry)
3344+ self.assertDocTestMatches(
3345+ """\
3346+ %s: Power could not be turned %s; timed out.
3347+ """ % (hostname, power_change),
3348+ logger.dump())
3349+ self.assertThat(
3350+ mock_power_change_failure,
3351+ MockCalledOnceWith(
3352+ system_id, hostname, power_change, "Timed out")
3353+ )
3354+
3355+ @inlineCallbacks
3356+ def test__calls_change_power_state_with_timeout(self):
3357+ self.patch_methods_using_rpc()
3358+ defer_with_timeout = self.patch(power, 'deferWithTimeout')
3359+
3360+ system_id = factory.make_name('system_id')
3361+ hostname = factory.make_name('hostname')
3362+ power_type = random.choice(power.QUERY_POWER_TYPES)
3363+ power_change = random.choice(['on', 'off'])
3364+ context = {
3365+ factory.make_name('context-key'): factory.make_name('context-val')
3366+ }
3367+
3368+ yield power.maybe_change_power_state(
3369+ system_id, hostname, power_type, power_change, context)
3370+ reactor.runUntilCurrent() # Run all delayed calls.
3371+ self.assertThat(
3372+ defer_with_timeout, MockCalledOnceWith(
3373+ power.CHANGE_POWER_STATE_TIMEOUT,
3374+ power.change_power_state, system_id, hostname,
3375+ power_type, power_change, context, power.reactor))
3376+>>>>>>> MERGE-SOURCE
3377
3378=== modified file 'src/provisioningserver/pserv_services/node_power_monitor_service.py'
3379=== modified file 'src/provisioningserver/rpc/cluster.py'
3380=== modified file 'src/provisioningserver/rpc/clusterservice.py'
3381=== modified file 'src/provisioningserver/rpc/dhcp.py'
3382=== modified file 'src/provisioningserver/rpc/region.py'
3383=== modified file 'src/provisioningserver/rpc/tests/test_clusterservice.py'
3384=== modified file 'src/provisioningserver/rpc/tests/test_dhcp.py'
3385=== modified file 'src/provisioningserver/tests/test_plugin.py'
3386--- src/provisioningserver/tests/test_plugin.py 2015-06-29 14:41:52 +0000
3387+++ src/provisioningserver/tests/test_plugin.py 2015-09-25 14:32:35 +0000
3388@@ -114,14 +114,26 @@
3389 service_maker.makeService(options)
3390 self.assertThat(mock_simplestreams_patch, MockCalledOnceWith())
3391
3392- def test_makeService_patches_tftp_service(self):
3393- mock_tftp_patch = (
3394- self.patch(plugin_module, 'add_term_error_code_to_tftp'))
3395- options = Options()
3396- service_maker = ProvisioningServiceMaker("Harry", "Hill")
3397- service_maker.makeService(options)
3398- self.assertThat(mock_tftp_patch, MockCalledOnceWith())
3399-
3400+<<<<<<< TREE
3401+ def test_makeService_patches_tftp_service(self):
3402+ mock_tftp_patch = (
3403+ self.patch(plugin_module, 'add_term_error_code_to_tftp'))
3404+ options = Options()
3405+ service_maker = ProvisioningServiceMaker("Harry", "Hill")
3406+ service_maker.makeService(options)
3407+ self.assertThat(mock_tftp_patch, MockCalledOnceWith())
3408+
3409+=======
3410+ def test_makeService_patches_tftp_service(self):
3411+ mock_tftp_patch = (
3412+ self.patch(plugin_module, 'add_term_error_code_to_tftp'))
3413+ options = Options()
3414+ options["config-file"] = self.write_config({})
3415+ service_maker = ProvisioningServiceMaker("Harry", "Hill")
3416+ service_maker.makeService(options)
3417+ self.assertThat(mock_tftp_patch, MockCalledOnceWith())
3418+
3419+>>>>>>> MERGE-SOURCE
3420 def test_image_download_service(self):
3421 options = Options()
3422 service_maker = ProvisioningServiceMaker("Harry", "Hill")
3423
3424=== modified file 'src/provisioningserver/tests/test_service_monitor.py'
3425=== modified file 'src/provisioningserver/utils/fs.py'
3426--- src/provisioningserver/utils/fs.py 2015-08-17 10:38:17 +0000
3427+++ src/provisioningserver/utils/fs.py 2015-09-25 14:32:35 +0000
3428@@ -20,8 +20,12 @@
3429 'FileLock',
3430 'incremental_write',
3431 'read_text_file',
3432+<<<<<<< TREE
3433 'RunLock',
3434 'sudo_delete_file',
3435+=======
3436+ 'sudo_delete_file',
3437+>>>>>>> MERGE-SOURCE
3438 'sudo_write_file',
3439 'SystemLock',
3440 'tempdir',
3441
3442=== modified file 'src/provisioningserver/utils/script.py'
3443=== modified file 'src/provisioningserver/utils/tests/test_fs.py'
3444--- src/provisioningserver/utils/tests/test_fs.py 2015-08-17 16:27:21 +0000
3445+++ src/provisioningserver/utils/tests/test_fs.py 2015-09-25 14:32:35 +0000
3446@@ -14,8 +14,13 @@
3447 __metaclass__ = type
3448 __all__ = []
3449
3450+<<<<<<< TREE
3451 from base64 import urlsafe_b64encode
3452 import os
3453+=======
3454+import hashlib
3455+import os
3456+>>>>>>> MERGE-SOURCE
3457 import os.path
3458 from random import randint
3459 import re
3460@@ -50,14 +55,23 @@
3461 atomic_symlink,
3462 atomic_write,
3463 ensure_dir,
3464+<<<<<<< TREE
3465 FileLock,
3466 get_maas_provision_command,
3467+=======
3468+ FileLockProxy,
3469+ get_maas_provision_command,
3470+>>>>>>> MERGE-SOURCE
3471 get_mtime,
3472 incremental_write,
3473 pick_new_mtime,
3474 read_text_file,
3475+<<<<<<< TREE
3476 RunLock,
3477 sudo_delete_file,
3478+=======
3479+ sudo_delete_file,
3480+>>>>>>> MERGE-SOURCE
3481 sudo_write_file,
3482 SystemLock,
3483 tempdir,
3484
3485=== modified file 'src/provisioningserver/utils/tests/test_isc.py'
3486--- src/provisioningserver/utils/tests/test_isc.py 2015-07-13 18:47:01 +0000
3487+++ src/provisioningserver/utils/tests/test_isc.py 2015-09-25 14:32:35 +0000
3488@@ -1,3 +1,4 @@
3489+<<<<<<< TREE
3490 # Copyright 2015 Canonical Ltd. This software is licensed under the
3491 # GNU Affero General Public License version 3 (see the file LICENSE).
3492
3493@@ -276,3 +277,281 @@
3494 u'zone "."':
3495 {u'file': u'"/etc/bind/db.special"', u'type': u'master'}},
3496 parsed)
3497+=======
3498+# Copyright 2015 Canonical Ltd. This software is licensed under the
3499+# GNU Affero General Public License version 3 (see the file LICENSE).
3500+
3501+"""Test ISC configuration file parser/generator."""
3502+
3503+from __future__ import (
3504+ absolute_import,
3505+ print_function,
3506+ unicode_literals,
3507+)
3508+
3509+
3510+str = None
3511+
3512+__metaclass__ = type
3513+__all__ = []
3514+
3515+from collections import OrderedDict
3516+from textwrap import dedent
3517+
3518+from maastesting.testcase import MAASTestCase
3519+from provisioningserver.utils.isc import (
3520+ ISCParseException,
3521+ make_isc_string,
3522+ parse_isc_string,
3523+ read_isc_file,
3524+)
3525+from testtools import ExpectedException
3526+
3527+
3528+class TestParseISCString(MAASTestCase):
3529+
3530+ def test_parses_simple_bind_options(self):
3531+ testdata = dedent("""\
3532+ options {
3533+ directory "/var/cache/bind";
3534+
3535+ dnssec-validation auto;
3536+
3537+ auth-nxdomain no; # conform to RFC1035
3538+ listen-on-v6 { any; };
3539+ };
3540+ """)
3541+ options = parse_isc_string(testdata)
3542+ self.assertEqual(
3543+ OrderedDict({u'options': OrderedDict({u'auth-nxdomain': u'no',
3544+ u'directory': u'"/var/cache/bind"',
3545+ u'dnssec-validation': u'auto',
3546+ u'listen-on-v6': OrderedDict({u'any': True})})}),
3547+ options)
3548+
3549+ def test_parses_bind_acl(self):
3550+ testdata = dedent("""\
3551+ acl goodclients {
3552+ 192.0.2.0/24;
3553+ localhost;
3554+ localnets;
3555+ };
3556+ """)
3557+ acl = parse_isc_string(testdata)
3558+ self.assertEqual(
3559+ {u'acl goodclients': {u'192.0.2.0/24': True,
3560+ u'localhost': True,
3561+ u'localnets': True}}, acl)
3562+
3563+ def test_parses_multiple_forwarders(self):
3564+ testdata = dedent("""\
3565+ forwarders {
3566+ 91.189.94.2;
3567+ 91.189.94.3;
3568+ 91.189.94.4;
3569+ 91.189.94.5;
3570+ 91.189.94.6;
3571+ };
3572+ """)
3573+ forwarders = parse_isc_string(testdata)
3574+ self.assertEqual(
3575+ {u'forwarders': {u'91.189.94.2': True,
3576+ u'91.189.94.3': True,
3577+ u'91.189.94.4': True,
3578+ u'91.189.94.5': True,
3579+ u'91.189.94.6': True}}, forwarders)
3580+
3581+ def test_parses_bug_1413388_config(self):
3582+ testdata = dedent("""\
3583+ acl canonical-int-ns { 91.189.90.151; 91.189.89.192; };
3584+
3585+ options {
3586+ directory "/var/cache/bind";
3587+
3588+ forwarders {
3589+ 91.189.94.2;
3590+ 91.189.94.2;
3591+ };
3592+
3593+ dnssec-validation auto;
3594+
3595+ auth-nxdomain no; # conform to RFC1035
3596+ listen-on-v6 { any; };
3597+
3598+ allow-query { any; };
3599+ allow-transfer { 10.222.64.1; canonical-int-ns; };
3600+
3601+ notify explicit;
3602+ also-notify { 91.189.90.151; 91.189.89.192; };
3603+
3604+ allow-query-cache { 10.222.64.0/18; };
3605+ recursion yes;
3606+ };
3607+
3608+ zone "." { type master; file "/etc/bind/db.special"; };
3609+ """)
3610+ config = parse_isc_string(testdata)
3611+ self.assertEqual(
3612+ {u'acl canonical-int-ns':
3613+ {u'91.189.89.192': True, u'91.189.90.151': True},
3614+ u'options': {u'allow-query': {u'any': True},
3615+ u'allow-query-cache': {u'10.222.64.0/18': True},
3616+ u'allow-transfer': {u'10.222.64.1': True,
3617+ u'canonical-int-ns': True},
3618+ u'also-notify': {u'91.189.89.192': True,
3619+ u'91.189.90.151': True},
3620+ u'auth-nxdomain':