Merge lp:~ltrager/maas/lp1685361_2.1 into lp:~maas-committers/maas/trunk

Proposed by Lee Trager
Status: Superseded
Proposed branch: lp:~ltrager/maas/lp1685361_2.1
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 6714 lines (+5186/-44) (has conflicts)
108 files modified
MANIFEST.in (+11/-0)
docs/changelog.rst (+199/-0)
docs/troubleshooting.rst.OTHER (+200/-0)
docs/version.rst (+15/-0)
src/maasserver/api/machines.py (+24/-0)
src/maasserver/api/spaces.py (+7/-0)
src/maasserver/api/subnets.py (+49/-0)
src/maasserver/api/version.py (+10/-0)
src/maasserver/compose_preseed.py (+25/-1)
src/maasserver/config.py (+7/-1)
src/maasserver/forms/tests/test_interface_link.py (+6/-1)
src/maasserver/models/staticipaddress.py (+160/-0)
src/maasserver/models/tests/test_staticipaddress.py (+141/-0)
src/maasserver/models/tests/test_subnet.py (+20/-0)
src/maasserver/preseed.py (+38/-0)
src/maasserver/static/assets/images/icons/account.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/add-logical-volume.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/add-partition.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/add.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/cross-orange.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/cross.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/cross_orange.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/debug.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/delete.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/edit.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/green-tick.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/help.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/info-mono.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/info.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/logical-volume.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/magnifying_glass.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/mount.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/partition.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/power-error.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/power-off.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/power-on.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/remove.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/settings.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/success-mono.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/success.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/success_colour_black.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/success_colour_white.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/success_mono.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/sync.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/system-shutdown.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/tags.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/tick.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/tooltip.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/unmount.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/warning-mono.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/warning.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/warning_colour_black.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/warning_colour_white.svg.OTHER (+1/-0)
src/maasserver/static/assets/images/icons/warning_mono.svg.OTHER (+1/-0)
src/maasserver/static/css/build.css (+1/-0)
src/maasserver/static/js/angular/controllers/tests/test_node_details.js (+83/-40)
src/maasserver/static/js/angular/maas.js (+5/-0)
src/maasserver/static/partials/dashboard.html (+210/-0)
src/maasserver/static/partials/domain-details.html (+4/-0)
src/maasserver/static/partials/domains-list.html (+4/-0)
src/maasserver/static/partials/error.html (+4/-0)
src/maasserver/static/partials/fabric-details.html (+8/-0)
src/maasserver/static/partials/intro-user.html (+33/-0)
src/maasserver/static/partials/intro.html (+71/-0)
src/maasserver/static/partials/networks-list.html (+4/-0)
src/maasserver/static/partials/node-details.html (+102/-0)
src/maasserver/static/partials/node-events.html (+13/-0)
src/maasserver/static/partials/node-result.html (+8/-0)
src/maasserver/static/partials/nodes-list.html (+912/-0)
src/maasserver/static/partials/settings.html (+4/-0)
src/maasserver/static/partials/space-details.html (+8/-0)
src/maasserver/static/partials/ssh-keys.html (+17/-0)
src/maasserver/static/partials/subnet-details.html (+14/-0)
src/maasserver/static/partials/vlan-details.html (+10/-0)
src/maasserver/static/scss/_base.forms.scss.OTHER (+377/-0)
src/maasserver/static/scss/_components.buttons.scss.OTHER (+149/-0)
src/maasserver/static/scss/_components.flashmessages.scss.OTHER (+59/-0)
src/maasserver/static/scss/_components.forms.scss.OTHER (+201/-0)
src/maasserver/static/scss/_components.icons.scss.OTHER (+274/-0)
src/maasserver/static/scss/_components.tables.scss.OTHER (+668/-0)
src/maasserver/static/scss/_helpers.display.scss.OTHER (+101/-0)
src/maasserver/static/scss/_helpers.spacing.scss.OTHER (+48/-0)
src/maasserver/static/scss/_patterns.page-header.scss.OTHER (+177/-0)
src/maasserver/templates/maasserver/base.html (+4/-0)
src/maasserver/tests/test_compose_preseed.py (+10/-0)
src/maasserver/tests/test_listener.py (+36/-0)
src/maasserver/tests/test_preseed.py (+17/-0)
src/maasserver/triggers/tests/test_websocket_listener.py (+24/-0)
src/maasserver/triggers/websocket.py (+38/-0)
src/maasserver/websockets/handlers/node.py (+8/-0)
src/maasserver/websockets/handlers/tests/test_machine.py (+4/-0)
src/metadataserver/api.py (+30/-0)
src/provisioningserver/boot/uefi_amd64.py (+4/-0)
src/provisioningserver/import_images/boot_resources.py (+15/-0)
src/provisioningserver/import_images/tests/test_boot_resources.py (+28/-0)
src/provisioningserver/kernel_opts.py (+5/-0)
src/provisioningserver/logger/_twisted.py (+80/-0)
src/provisioningserver/logger/testing/logsomething.py (+62/-0)
src/provisioningserver/logger/tests/test__twisted.py (+199/-0)
src/provisioningserver/rackdservices/tests/test_tftp.py (+28/-0)
src/provisioningserver/rackdservices/tftp.py (+13/-0)
src/provisioningserver/refresh/node_info_scripts.py (+7/-1)
src/provisioningserver/refresh/tests/test_node_info_scripts.py (+16/-0)
src/provisioningserver/tests/test_kernel_opts.py (+15/-0)
src/provisioningserver/utils/services.py (+3/-0)
src/provisioningserver/utils/tests/test_twisted.py (+6/-0)
src/provisioningserver/utils/twisted.py (+6/-0)
versions.cfg (+8/-0)
Text conflict in MANIFEST.in
Text conflict in docs/changelog.rst
Contents conflict in docs/troubleshooting.rst
Text conflict in docs/version.rst
Text conflict in src/maasserver/api/machines.py
Text conflict in src/maasserver/api/spaces.py
Text conflict in src/maasserver/api/subnets.py
Text conflict in src/maasserver/api/version.py
Text conflict in src/maasserver/compose_preseed.py
Text conflict in src/maasserver/config.py
Text conflict in src/maasserver/forms/tests/test_interface_link.py
Contents conflict in src/maasserver/migrations/south/django16_south_maas19.tar.gz
Text conflict in src/maasserver/models/staticipaddress.py
Text conflict in src/maasserver/models/tests/test_staticipaddress.py
Text conflict in src/maasserver/models/tests/test_subnet.py
Text conflict in src/maasserver/preseed.py
Contents conflict in src/maasserver/static/assets/images/icons/account.svg
Contents conflict in src/maasserver/static/assets/images/icons/add-logical-volume.svg
Contents conflict in src/maasserver/static/assets/images/icons/add-partition.svg
Contents conflict in src/maasserver/static/assets/images/icons/add.svg
Contents conflict in src/maasserver/static/assets/images/icons/cross-orange.svg
Contents conflict in src/maasserver/static/assets/images/icons/cross.svg
Contents conflict in src/maasserver/static/assets/images/icons/cross_orange.svg
Contents conflict in src/maasserver/static/assets/images/icons/debug.svg
Contents conflict in src/maasserver/static/assets/images/icons/delete.svg
Contents conflict in src/maasserver/static/assets/images/icons/edit.svg
Contents conflict in src/maasserver/static/assets/images/icons/green-tick.svg
Contents conflict in src/maasserver/static/assets/images/icons/help.svg
Contents conflict in src/maasserver/static/assets/images/icons/info-mono.svg
Contents conflict in src/maasserver/static/assets/images/icons/info.svg
Contents conflict in src/maasserver/static/assets/images/icons/logical-volume.svg
Contents conflict in src/maasserver/static/assets/images/icons/magnifying_glass.svg
Contents conflict in src/maasserver/static/assets/images/icons/mount.svg
Contents conflict in src/maasserver/static/assets/images/icons/partition.svg
Contents conflict in src/maasserver/static/assets/images/icons/power-error.svg
Contents conflict in src/maasserver/static/assets/images/icons/power-off.svg
Contents conflict in src/maasserver/static/assets/images/icons/power-on.svg
Contents conflict in src/maasserver/static/assets/images/icons/remove.svg
Contents conflict in src/maasserver/static/assets/images/icons/settings.svg
Contents conflict in src/maasserver/static/assets/images/icons/success-mono.svg
Contents conflict in src/maasserver/static/assets/images/icons/success.svg
Contents conflict in src/maasserver/static/assets/images/icons/success_colour_black.svg
Contents conflict in src/maasserver/static/assets/images/icons/success_colour_white.svg
Contents conflict in src/maasserver/static/assets/images/icons/success_mono.svg
Contents conflict in src/maasserver/static/assets/images/icons/sync.svg
Contents conflict in src/maasserver/static/assets/images/icons/system-shutdown.svg
Contents conflict in src/maasserver/static/assets/images/icons/tags.svg
Contents conflict in src/maasserver/static/assets/images/icons/tick.svg
Contents conflict in src/maasserver/static/assets/images/icons/tooltip.svg
Contents conflict in src/maasserver/static/assets/images/icons/unmount.svg
Contents conflict in src/maasserver/static/assets/images/icons/warning-mono.svg
Contents conflict in src/maasserver/static/assets/images/icons/warning.svg
Contents conflict in src/maasserver/static/assets/images/icons/warning_colour_black.svg
Contents conflict in src/maasserver/static/assets/images/icons/warning_colour_white.svg
Contents conflict in src/maasserver/static/assets/images/icons/warning_mono.svg
Conflict adding file src/maasserver/static/css/build.css.  Moved existing file to src/maasserver/static/css/build.css.moved.
Text conflict in src/maasserver/static/js/angular/controllers/tests/test_node_details.js
Text conflict in src/maasserver/static/js/angular/maas.js
Text conflict in src/maasserver/static/partials/dashboard.html
Text conflict in src/maasserver/static/partials/domain-details.html
Text conflict in src/maasserver/static/partials/domains-list.html
Text conflict in src/maasserver/static/partials/error.html
Text conflict in src/maasserver/static/partials/fabric-details.html
Text conflict in src/maasserver/static/partials/intro-user.html
Text conflict in src/maasserver/static/partials/intro.html
Text conflict in src/maasserver/static/partials/networks-list.html
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/node-result.html
Text conflict in src/maasserver/static/partials/nodes-list.html
Text conflict in src/maasserver/static/partials/settings.html
Text conflict in src/maasserver/static/partials/space-details.html
Text conflict in src/maasserver/static/partials/ssh-keys.html
Text conflict in src/maasserver/static/partials/subnet-details.html
Text conflict in src/maasserver/static/partials/vlan-details.html
Contents conflict in src/maasserver/static/scss/_base.forms.scss
Contents conflict in src/maasserver/static/scss/_components.buttons.scss
Contents conflict in src/maasserver/static/scss/_components.flashmessages.scss
Contents conflict in src/maasserver/static/scss/_components.forms.scss
Contents conflict in src/maasserver/static/scss/_components.icons.scss
Contents conflict in src/maasserver/static/scss/_components.tables.scss
Contents conflict in src/maasserver/static/scss/_helpers.display.scss
Contents conflict in src/maasserver/static/scss/_helpers.spacing.scss
Contents conflict in src/maasserver/static/scss/_patterns.page-header.scss
Text conflict in src/maasserver/templates/maasserver/base.html
Text conflict in src/maasserver/tests/test_compose_preseed.py
Text conflict in src/maasserver/tests/test_listener.py
Text conflict in src/maasserver/triggers/tests/test_websocket_listener.py
Text conflict in src/maasserver/triggers/websocket.py
Text conflict in src/maasserver/websockets/handlers/node.py
Text conflict in src/maasserver/websockets/handlers/tests/test_machine.py
Text conflict in src/metadataserver/api.py
Text conflict in src/provisioningserver/boot/uefi_amd64.py
Text conflict in src/provisioningserver/import_images/boot_resources.py
Text conflict in src/provisioningserver/import_images/tests/test_boot_resources.py
Text conflict in src/provisioningserver/kernel_opts.py
Text conflict in src/provisioningserver/logger/_twisted.py
Text conflict in src/provisioningserver/logger/testing/logsomething.py
Text conflict in src/provisioningserver/logger/tests/test__twisted.py
Text conflict in src/provisioningserver/rackdservices/tests/test_tftp.py
Text conflict in src/provisioningserver/rackdservices/tftp.py
Text conflict in src/provisioningserver/refresh/tests/test_node_info_scripts.py
Text conflict in src/provisioningserver/tests/test_kernel_opts.py
Text conflict in src/provisioningserver/utils/services.py
Text conflict in src/provisioningserver/utils/tests/test_twisted.py
Text conflict in src/provisioningserver/utils/twisted.py
Text conflict in versions.cfg
To merge this branch: bzr merge lp:~ltrager/maas/lp1685361_2.1
Reviewer Review Type Date Requested Status
MAAS Maintainers Pending
Review via email: mp+323113@code.launchpad.net

Commit message

Fix 00-maas-07-block-devices to run on Trusty.

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'MANIFEST.in'
2--- MANIFEST.in 2017-03-10 16:34:33 +0000
3+++ MANIFEST.in 2017-04-25 09:34:40 +0000
4@@ -1,8 +1,19 @@
5+<<<<<<< TREE
6 graft src/maasserver/static
7 graft src/maasserver/templates
8 graft src/metadataserver/fixtures
9 graft src/metadataserver/user_data/templates
10 graft src/provisioningserver/templates
11+=======
12+graft src/maasserver/static
13+graft src/maasserver/templates
14+graft src/metadataserver/fixtures
15+graft src/provisioningserver/templates
16+>>>>>>> MERGE-SOURCE
17 include src/maasserver/migrations/south/django16_south_maas19.tar.gz
18+<<<<<<< TREE
19 include src/provisioningserver/drivers/power/*.xml
20 include src/metadataserver/builtin_scripts/*.sh
21+=======
22+include src/provisioningserver/drivers/power/*.xml
23+>>>>>>> MERGE-SOURCE
24
25=== modified file 'contrib/preseeds_v2/curtin_userdata'
26=== modified file 'docs/changelog.rst'
27--- docs/changelog.rst 2017-02-17 14:23:04 +0000
28+++ docs/changelog.rst 2017-04-25 09:34:40 +0000
29@@ -2,8 +2,207 @@
30 Changelog
31 =========
32
33+<<<<<<< TREE
34 2.2.0 (beta1)
35 =============
36+=======
37+2.1.6
38+=====
39+
40+Bugs fixed in this release
41+--------------------------
42+
43+LP: #1677507 Fix potential IP allocation from incorrect range.
44+
45+LP: #1674807 Fix missing default_gateways entry in machine API output.
46+
47+
48+2.1.5
49+=====
50+
51+Bugs fixed in this release
52+--------------------------
53+
54+LP: #1671891 Fix deployment with AUTO IPs set as the gateway link.
55+
56+LP: #1671048 Fix crash when getting the default gateways for a machine.
57+
58+LP: #1673916 Fix regression that causes traceback in rack-based mDNS monitoring service.
59+
60+LP: #1673724 Due to a potential regression in lsblk, try to ensure list of block devices is ordered correctly.
61+
62+
63+2.1.4
64+=====
65+
66+Bugs fixed in this release
67+--------------------------
68+
69+LP: #1655049 Prevent IndexError in get_vendor_for_mac()
70+
71+LP: #1654432 Unable to deploy ga kernel on node-details page
72+
73+LP: #1654450 MAAS shouldn't show newer kernels when edge kernels are added
74+
75+LP: #1654412 Unable to set edge kernel as the min_hwe_kernel and deploy with the default kernel
76+
77+LP: #1656425 Ephemeral environments using the wrong kernel
78+
79+LP: #1655721 MAAS shouldn't update TGT config when there are no boot sources
80+
81+LP: #1659511 Fix incorrect clearing of boot resource cache if an IOError occurs.
82+
83+LP: #1659607 Usability fixes for interfaces API link-subnet operation
84+
85+LP: #1640147 Do not attempt IPv6 discovery on interfaces where IPv6 is disabled
86+
87+LP: #1626654 Make connection attempts from rack to region controllers more reliable
88+
89+LP: #1626654 Fix reports of bad connections when dead regiond workers remain in the database
90+
91+LP: #1645912 Fix IPMI autodetection to wrap IPv6 addresses in brackers when used inside URLs
92+
93+LP: #1665459 Fix anonymous auto-enlistment to properly detect rack-facing region IP address
94+
95+LP: #1665143 Select the shortest by-id path when discovering block devices to address issues when discovering nvme devices.
96+
97+
98+Other notable changes
99+---------------------
100+
101+It is now possible to prevent deploying machines from rebooting.
102+
103+
104+2.1.3
105+=====
106+
107+Bugs fixed in this release
108+--------------------------
109+
110+LP: #1611999 [2.1] MAAS cannot power query with Cisco UCSM power driver.
111+
112+LP: #1604962 node set to "failed deployment" for no visible reason
113+
114+LP: #1614584 MAAS fails to start when gethostname returns an FQDN.
115+
116+LP: #1582323 Select MAAS datasource specifically to ensure commissioning doesn't fail when competing cloud metadata resides on disk
117+
118+LP: #1646163 [2.1] Icon need to be improved
119+
120+LP: #1646162 [2.1] Sticky header has been removed
121+
122+LP: #1646160 [2.1] Device discovery UI does not have a loading state
123+
124+LP: #1628126 [2.1, FUJ] Column layout shouldn't resize until screen is smaller than 1440
125+
126+LP: #1628058 [2.1, FUJ] The form spacing is not compatible to the designs
127+
128+LP: #1628054 [2.1, FUJ] Section complete/incomplete icon
129+
130+LP: #1639182 [2.1] log format differs for Yakkety
131+
132+LP: #1637401 Re-adding virsh chassis to discover new nodes powers down existing nodes
133+
134+LP: #1642033 IPs with multiple names can corrupt DNS zone data
135+
136+LP: #1646955 'main_archive_hostname' is not defined
137+
138+LP: #1651452 Use correct escaping for EFI's kernel command line datasource_list.
139+
140+
141+2.1.2
142+=====
143+
144+Bugs fixed in this release
145+--------------------------
146+
147+LP: #1516065 Fix IPMI chassis config session timeout issue when configuring the boot device. Only error on PowerAuthErrors when configuring the IPMI chassis boot order.
148+
149+LP: #1642996 2.x preseeds with {{escape.shell}} fail if not upgraded at 2.1.1
150+
151+LP: #1643057 juju2 with maas 2.1.1 LXD containers get wrong ip addresses
152+
153+LP: #1640300 Be defensive in the postgresql listener when a system notification is received for a none existent handler or missing listener channel.
154+
155+LP: #1613862 Re-allow configuration of the port where to connect to postgresql.
156+
157+LP: #1638575 Add two capabilities: bridging-interface-ubuntu and bridging-automatic-ubuntu.
158+
159+
160+2.1.1
161+=====
162+
163+Bugs fixed in this release
164+--------------------------
165+
166+LP: #1554636 maas serving old image to nodes
167+
168+LP: #1593991 [2.0b7, API/CLI] allows you to add machines with power_type and no power_parameters
169+
170+LP: #1602482 [2.0rc2] Incorrect DNS records
171+
172+LP: #1620478 [2.1, UI] Broken validation on VLAN MTU
173+
174+LP: #1630636 [2.1 ipv6] YAML error when maas_url has an IPv6 IP
175+
176+LP: #1630679 [2.1b1] Can't use custom image repository
177+
178+LP: #1633717 [2.1] DHCP probe needs to be smarter about interface selection to avoid log spam
179+
180+LP: #1636858 [2.1.1, trunk, bzr5510] Can't enlist machines
181+
182+LP: #1636861 [2.1.1, trunk, bzr5510] UI error when adding a chassis
183+
184+LP: #1636992 [2.1] Deleting all boot sources and creating a new boot source, does not update the cache
185+
186+LP: #1598175 [2.0] If the machine is deployed, I cannot update NIC's nor storage
187+
188+LP: #1603563 [2.0 RC2] Multiple failures to release nodes
189+
190+LP: #1606508 [2.1] Failover peers must be IPv4 for use with ISC dhcpd
191+
192+LP: #1632853 [2.1] Observed neighbours should be avoided when assigning IP addresses
193+
194+LP: #1633401 [2.1] In device discovery in Settings, remove the header of the first dropdown field (Host discovery and network observation)
195+
196+LP: #1633452 [2.1] In settings, rename the option Disabled (suppress active scanning) in the Active discovery interval field to Never (disabled).
197+
198+LP: #1633462 [2.1] In settings in the device discovery section reduce the text of the explanation of the fields.
199+
200+LP: #1633822 [2.1] Device discovery ignores reverse DNS
201+
202+LP: #1636250 [2.1] machines allocate API returns a random machine if incorrect - parameters are used
203+
204+LP: #1636873 [2.1.0] Creating a bond doesn't work and no feedback is provided if fabric in interfaces is 'disconnected'
205+
206+LP: #1636874 [2.1, Yakkety] Plus '+' button is not visible when you hover over an interface in machine details
207+
208+LP: #1637009 [2.0,2.1] Node acquisition constraints API documentation needs to be updated to match reality
209+
210+LP: #1637182 Help and documentation 'list of unicodes' inconsistent
211+
212+LP: #1637192 [2.0,2.1] Allocate using subnets or not_subnets with space fails
213+
214+LP: #1637246 MaaS should use configured names for VLAN interfaces
215+
216+LP: #1638284 [2.1.1pre] Debug logging shown by default in regiond.conf
217+
218+LP: #1638288 [2.1.1 pre] A lot of repeated logging
219+
220+LP: #1638589 [2.1] commissioning doesn't find the second address family on the boot interface
221+
222+LP: #1600328 [2.0rc1, API/CLI] When adding a new machine and no rack controller can connect to the BMC, no error message is displayed.
223+
224+LP: #1633378 [Device Discovery] Rename the section Header in the Settings page
225+
226+LP: #1633600 [2.1.1] Docs do not mention the need to mirror bootloaders
227+
228+LP: #1636251 resolv.conf search path doesn't match the domain for the host
229+
230+
231+2.1.0
232+=====
233+>>>>>>> MERGE-SOURCE
234
235 Important announcements
236 -----------------------
237
238=== added file 'docs/troubleshooting.rst.OTHER'
239--- docs/troubleshooting.rst.OTHER 1970-01-01 00:00:00 +0000
240+++ docs/troubleshooting.rst.OTHER 2017-04-25 09:34:40 +0000
241@@ -0,0 +1,200 @@
242+********************
243+MAAS Troubleshooting
244+********************
245+
246+Some parts of MAAS may still be a little confusing, and sometimes you might be
247+trying to do things that are just plain impossible. This section covers some of
248+the most commonly encountered problems and tries its best to make them gone.
249+
250+.. contents:: Contents
251+ :depth: 1
252+ :local:
253+
254+
255+Nodes hang on "Commissioning"
256+=============================
257+
258+
259+Possible Cause: Timing issues
260+-----------------------------
261+
262+Various parts of MAAS rely on OAuth to negotiate a connection to nodes. If the
263+current time reported by the hardware clock on your node differs significantly
264+from that on the MAAS server, the connection will not be made.
265+
266+**SOLUTION:** Check that the hardware clocks are consistent, and if necessary,
267+adjust them. This can usually be done from within the system BIOS, without
268+needing to install an OS
269+
270+
271+Possible Cause: Network drivers
272+-------------------------------
273+
274+Sometimes the hardware can boot from PXE, but fail to load correct drivers when
275+booting the received image. This is sometimes the case when no open source
276+drivers are available for the network hardware.
277+
278+**SOLUTION:** The best fix for this problem is to install a Linux-friendly
279+network adapter. It *is* theoretically possible to modify the boot image to
280+include proprietary drivers, but it is not a straightforward task.
281+
282+
283+Nodes fail to PXE boot
284+======================
285+
286+
287+Possible Cause: Using an incorrectly configured VM
288+--------------------------------------------------
289+
290+Some Virtual Machine setups include emulation of network hardware that does not
291+support PXE booting, and in most setups, you will need to explicitly set up the
292+VM to boot via PXE.
293+
294+**SOLUTION**: Consult the VM docs for details of PXE booting.
295+
296+
297+Possible Cause: DHCP conflict
298+-----------------------------
299+
300+If you are using MAAS in a setup with an existing DHCP, *DO NOT SET UP THE MAAS
301+DHCP SERVER* as this will cause no end of confusion to the rest of your network
302+and most likely won't discover any nodes either.
303+
304+**SOLUTION**: You will need to configure your existing DHCP server to
305+point to the MAAS server.
306+
307+
308+Can't log in to node
309+====================
310+
311+Sometimes you may wish to login directly to a node on your system. If
312+you have set up Juju and MAAS, the attached nodes will automatically
313+receive existing ssh keys and sets up ssh on the node to authenticate
314+via key, so you can just login with no password from the server.
315+There is also an option in the MAAS web interface to add new ssh keys
316+to the nodes (via Preferences in the drop down menu which appears when
317+clicking your username in the top-right of the page).
318+
319+
320+Forgot MAAS superuser password
321+==============================
322+
323+As long as you have sudo privileges, this is not a disaster. You can
324+use the ``maas`` command to change the password for the MAAS superuser
325+on the MAAS server:
326+
327+ ``sudo maas changepassword root``
328+
329+
330+Need to reconfigure server IP address
331+=====================================
332+
333+If you made a mistake during setup or you just need to reconfigure your MAAS
334+server, you can simply run the setup again:
335+
336+ ``sudo dpkg-reconfigure maas-region-controller``
337+
338+
339+Can't find MAAS webpage
340+=======================
341+
342+The default webpage is located at ``http://<hostname>/MAAS/``. If you can't
343+access it, there are a few things to try:
344+
345+ #. Check that the webserver is running - By default the web interface uses
346+ Apache, which runs under the service name *apache2*. To check it, on the
347+ MAAS server box you can run ``sudo /etc/init.d/apache2 status``.
348+ #. Check that the hostname is correct - It may seem obvious, but check that
349+ the hostname is being resolved properly. Try running a browser (even a text
350+ mode one like lynx) on the same box as the MAAS server and navigating to
351+ the page. If that doesn't work, try ``http://127.0.0.1/MAAS/``, which will
352+ always point at the local server.
353+ #. If you are still getting "404 - Page not found" errors, check that the MAAS
354+ web interface has been installed in the right place. There should be a file
355+ present called /usr/share/maas/maas/urls.py
356+
357+Debugging ephemeral image
358+=========================
359+
360+Backdoor (add a login) to ephemeral images
361+------------------------------------------
362+
363+If you cannot login to an instance, you might have to "backdoor it" in order
364+to see what is going wrong. Scott Moser wrote a simple utility that injects a
365+user and password into an image. Here's how to add a 'backdoor' user with a
366+password to your images::
367+
368+ sudo apt-get install --assume-yes bzr
369+ bzr branch lp:~maas-maintainers/maas/backdoor-image backdoor-image
370+
371+ imgs=$(echo /var/lib/maas/boot-resources/*/*/*/*/*/*/root-image)
372+ for img in $imgs; do
373+ [ -f "$img.dist" ] || sudo cp -a --sparse=always $img $img.dist
374+ done
375+
376+ for img in $imgs; do
377+ sudo ./backdoor-image/backdoor-image -v --user=backdoor --password-auth --password=ubuntu $img
378+ done
379+
380+Inside the ephemeral image
381+--------------------------
382+
383+Important files for debugging (Someone is likely to ask you for these
384+things to help debug)::
385+
386+ /var/log/cloud-init.log
387+ /var/log/boot.log
388+ /var/log/cloud-init-output.log
389+
390+After enlistment or commissioning, the user-data from maas instructs the system
391+to power off. To stop that from happening, you can just create a file in /tmp::
392+
393+ touch /tmp/block-poweroff
394+
395+After a deployment, the user-data from maas intructs the system to reboot. To
396+stop that from happening, you can just create a file in /tmp::
397+
398+ touch /tmp/block-reboot
399+
400+MAAS credentials
401+----------------
402+
403+MAAS credentials can be found in 2 places:
404+
405+#. from the cmdline you'll see a ``url=`` or ``cloud-config-url=``
406+ parameter. You can get the cloud-config from that url, which will have
407+ credentials::
408+
409+ $ sed -n 's,.*url=\([^ ]*\).*,\1,p' /proc/cmdline
410+ http://10.55.60.194/MAAS/metadata/latest/enlist-preseed/?op=get_enlist_preseed
411+
412+#. from ``/etc/cloud/cloud.cfg.d/91_kernel_cmdline_url``. The file was pulled
413+ from ``url=`` parameter by cloud-init::
414+
415+ $ sudo cat /etc/cloud/cloud.cfg.d/91_kernel_cmdline
416+
417+MAAS datasource
418+---------------
419+
420+The cloud-init datasource for MAAS can be invoked as a 'main' for debugging
421+purposes. To do so, you need to know the url for the MAAS datasource and a
422+config file that contains credentials::
423+
424+ cfg=$(echo /etc/cloud/cloud.cfg.d/*_cmdline_url.cfg)
425+ echo $cfg /etc/cloud/cloud.cfg.d/91_kernel_cmdline_url.cfg
426+
427+Now get the metadata_url from there::
428+
429+ url=$(sudo awk '$1 == "metadata_url:" { print $2 }' $cfg)
430+ echo $url http://10.55.60.194/MAAS/metadata/enlist
431+
432+Invoke the client /usr/share/pyshared/cloudinit/sources/DataSourceMAAS.py
433+The client has --help Usage also, but here is an example of how to use it::
434+
435+ $ maasds="/usr/share/pyshared/cloudinit/sources/DataSourceMAAS.py"
436+ $ sudo python $maasds --config=$cfg get $url
437+ == http://10.55.60.194/MAAS/metadata/enlist ==
438+ 2012-03-01
439+ latest
440+ $ sudo python $maasds --config=$cfg get $url/latest/meta-data/local-hostname
441+ maas-enlisting-node
442
443=== modified file 'docs/version.rst'
444--- docs/version.rst 2017-03-15 07:43:23 +0000
445+++ docs/version.rst 2017-04-25 09:34:40 +0000
446@@ -67,6 +67,7 @@
447 Deploy nodes with custom network layout and configuration. Available since
448 version 1.9 on Ubuntu deployments. See :ref:`networking` for more about this
449 feature.
450+<<<<<<< TREE
451
452 .. _cap_bridging-interface-ubuntu:
453
454@@ -87,3 +88,17 @@
455 Clients can pass a username and password and, assuming they are valid,
456 receive in return an API token. The caller is *not* logged-in to MAAS
457 via a session cookie.
458+=======
459+
460+.. _cap_bridging-interface-ubuntu:
461+
462+``bridging-interface-ubuntu``
463+ Deploy nodes, selectively configuring bridges on network interfaces.
464+ Available since 2.1 on Ubuntu deployments.
465+
466+.. _cap_bridging-automatic-ubuntu:
467+
468+``bridging-automatic-ubuntu``
469+ Deploy nodes, automatically configuring bridges on all interfaces.
470+ Available since 2.1 on Ubuntu deployments.
471+>>>>>>> MERGE-SOURCE
472
473=== modified file 'setup.py'
474=== modified file 'src/maasserver/api/blockdevices.py'
475=== modified file 'src/maasserver/api/boot_resources.py'
476=== modified file 'src/maasserver/api/boot_source_selections.py'
477=== modified file 'src/maasserver/api/dhcpsnippets.py'
478=== modified file 'src/maasserver/api/dnsresourcerecords.py'
479=== modified file 'src/maasserver/api/dnsresources.py'
480=== modified file 'src/maasserver/api/domains.py'
481=== modified file 'src/maasserver/api/fabrics.py'
482=== modified file 'src/maasserver/api/fannetworks.py'
483=== modified file 'src/maasserver/api/interfaces.py'
484=== modified file 'src/maasserver/api/ipranges.py'
485=== modified file 'src/maasserver/api/machines.py'
486--- src/maasserver/api/machines.py 2017-04-21 20:20:53 +0000
487+++ src/maasserver/api/machines.py 2017-04-25 09:34:40 +0000
488@@ -135,11 +135,15 @@
489 'node_type',
490 'node_type_name',
491 'special_filesystems',
492+<<<<<<< TREE
493 'pod',
494 'default_gateways',
495 'current_commissioning_result_id',
496 'current_testing_result_id',
497 'current_installation_result_id',
498+=======
499+ 'default_gateways',
500+>>>>>>> MERGE-SOURCE
501 )
502
503 # Limited set of machine fields exposed on the anonymous API.
504@@ -220,6 +224,7 @@
505 """The network interface which is used to boot over the network."""
506 return machine.get_boot_interface()
507
508+<<<<<<< TREE
509 @classmethod
510 def pod(handler, machine):
511 """The pod this machine is part of."""
512@@ -279,6 +284,25 @@
513 }
514 }
515
516+=======
517+ @classmethod
518+ def default_gateways(handler, machine):
519+ """The default gateways that will be used for this machine."""
520+ gateways = machine.get_default_gateways()
521+ ipv4 = gateways.ipv4.gateway_ip if gateways.ipv4 is not None else None
522+ ipv6 = gateways.ipv6.gateway_ip if gateways.ipv6 is not None else None
523+ return {
524+ "ipv4": {
525+ "gateway_ip": ipv4,
526+ "link_id": machine.gateway_link_ipv4_id,
527+ },
528+ "ipv6": {
529+ "gateway_ip": ipv6,
530+ "link_id": machine.gateway_link_ipv6_id,
531+ }
532+ }
533+
534+>>>>>>> MERGE-SOURCE
535 @admin_method
536 def update(self, request, system_id):
537 """Update a specific Machine.
538
539=== modified file 'src/maasserver/api/nodes.py'
540=== modified file 'src/maasserver/api/packagerepositories.py'
541=== modified file 'src/maasserver/api/partitions.py'
542=== modified file 'src/maasserver/api/spaces.py'
543--- src/maasserver/api/spaces.py 2017-02-17 14:23:04 +0000
544+++ src/maasserver/api/spaces.py 2017-04-25 09:34:40 +0000
545@@ -117,6 +117,7 @@
546
547 @classmethod
548 def subnets(cls, space):
549+<<<<<<< TREE
550 # Backward compatibility for Juju 2.0.
551 if space.id == -1:
552 return Subnet.objects.filter(vlan__space__isnull=True)
553@@ -130,6 +131,12 @@
554 return space.vlan_set.all()
555
556 def read(self, request, id):
557+=======
558+ """Return all subnets in this space."""
559+ return space.subnet_set.all()
560+
561+ def read(self, request, id):
562+>>>>>>> MERGE-SOURCE
563 """Read space.
564
565 Returns 404 if the space is not found.
566
567=== modified file 'src/maasserver/api/staticroutes.py'
568=== modified file 'src/maasserver/api/subnets.py'
569--- src/maasserver/api/subnets.py 2017-04-06 18:19:08 +0000
570+++ src/maasserver/api/subnets.py 2017-04-25 09:34:40 +0000
571@@ -153,13 +153,19 @@
572 return Space.UNDEFINED
573 return subnet.space.get_name()
574
575+<<<<<<< TREE
576 def read(self, request, id):
577 """\
578 Read subnet.
579+=======
580+ def read(self, request, id):
581+ """Read subnet.
582+>>>>>>> MERGE-SOURCE
583
584 Returns 404 if the subnet is not found.
585 """
586 return Subnet.objects.get_subnet_or_404(
587+<<<<<<< TREE
588 id, request.user, NODE_PERMISSION.VIEW)
589
590 def update(self, request, id):
591@@ -201,6 +207,24 @@
592
593 managed
594 If False, MAAS should not manage this subnet. (Default: True)
595+=======
596+ id, request.user, NODE_PERMISSION.VIEW)
597+
598+ def update(self, request, id):
599+ """Update subnet.
600+
601+ :param name: Name of the subnet.
602+ :param description: Description of the subnet.
603+ :param vlan: VLAN this subnet belongs to.
604+ :param space: Space this subnet is in.
605+ :param cidr: The network CIDR for this subnet.
606+ :param gateway_ip: The gateway IP address for this subnet.
607+ :param rdns_mode: How reverse DNS is handled for this subnet.
608+ :param allow_proxy: Configure maas-proxy to allow requests from this \
609+ subnet.
610+ :param dns_servers: Comma-seperated list of DNS servers for this \
611+ subnet.
612+>>>>>>> MERGE-SOURCE
613
614 Returns 404 if the subnet is not found.
615 """
616@@ -212,9 +236,14 @@
617 else:
618 raise MAASAPIValidationError(form.errors)
619
620+<<<<<<< TREE
621 def delete(self, request, id):
622 """\
623 Delete subnet.
624+=======
625+ def delete(self, request, id):
626+ """Delete subnet.
627+>>>>>>> MERGE-SOURCE
628
629 Returns 404 if the subnet is not found.
630 """
631@@ -224,9 +253,14 @@
632 return rc.DELETED
633
634 @operation(idempotent=True)
635+<<<<<<< TREE
636 def reserved_ip_ranges(self, request, id):
637 """\
638 Lists IP ranges currently reserved in the subnet.
639+=======
640+ def reserved_ip_ranges(self, request, id):
641+ """Lists IP ranges currently reserved in the subnet.
642+>>>>>>> MERGE-SOURCE
643
644 Returns 404 if the subnet is not found.
645 """
646@@ -235,9 +269,14 @@
647 return subnet.get_ipranges_in_use().render_json()
648
649 @operation(idempotent=True)
650+<<<<<<< TREE
651 def unreserved_ip_ranges(self, request, id):
652 """\
653 Lists IP ranges currently unreserved in the subnet.
654+=======
655+ def unreserved_ip_ranges(self, request, id):
656+ """Lists IP ranges currently unreserved in the subnet.
657+>>>>>>> MERGE-SOURCE
658
659 Returns 404 if the subnet is not found.
660 """
661@@ -247,8 +286,13 @@
662 include_purpose=False)
663
664 @operation(idempotent=True)
665+<<<<<<< TREE
666 def statistics(self, request, id):
667 """\
668+=======
669+ def statistics(self, request, id):
670+ """
671+>>>>>>> MERGE-SOURCE
672 Returns statistics for the specified subnet, including:
673
674 num_available: the number of available IP addresses
675@@ -286,8 +330,13 @@
676 include_suggestions=include_suggestions)
677
678 @operation(idempotent=True)
679+<<<<<<< TREE
680 def ip_addresses(self, request, id):
681 """\
682+=======
683+ def ip_addresses(self, request, id):
684+ """
685+>>>>>>> MERGE-SOURCE
686 Returns a summary of IP addresses assigned to this subnet.
687
688 Optional parameters
689
690=== modified file 'src/maasserver/api/tests/test_api.py'
691=== modified file 'src/maasserver/api/tests/test_blockdevice.py'
692=== modified file 'src/maasserver/api/tests/test_boot_resources.py'
693=== modified file 'src/maasserver/api/tests/test_dhcpsnippets.py'
694=== modified file 'src/maasserver/api/tests/test_enlistment.py'
695=== modified file 'src/maasserver/api/tests/test_interfaces.py'
696=== modified file 'src/maasserver/api/tests/test_machine.py'
697=== modified file 'src/maasserver/api/tests/test_vlans.py'
698=== modified file 'src/maasserver/api/tests/test_volume_groups.py'
699=== modified file 'src/maasserver/api/version.py'
700--- src/maasserver/api/version.py 2017-03-15 07:43:23 +0000
701+++ src/maasserver/api/version.py 2017-04-25 09:34:40 +0000
702@@ -21,9 +21,14 @@
703 CAP_DEVICES_MANAGEMENT = 'devices-management'
704 CAP_STORAGE_DEPLOYMENT_UBUNTU = 'storage-deployment-ubuntu'
705 CAP_NETWORK_DEPLOYMENT_UBUNTU = 'network-deployment-ubuntu'
706+<<<<<<< TREE
707 CAP_BRIDGING_INTERFACE_UBUNTU = 'bridging-interface-ubuntu'
708 CAP_BRIDGING_AUTOMATIC_UBUNTU = 'bridging-automatic-ubuntu'
709 CAP_AUTHENTICATE_API = 'authenticate-api'
710+=======
711+CAP_BRIDGING_INTERFACE_UBUNTU = 'bridging-interface-ubuntu'
712+CAP_BRIDGING_AUTOMATIC_UBUNTU = 'bridging-automatic-ubuntu'
713+>>>>>>> MERGE-SOURCE
714
715 API_CAPABILITIES_LIST = [
716 CAP_NETWORKS_MANAGEMENT,
717@@ -32,9 +37,14 @@
718 CAP_DEVICES_MANAGEMENT,
719 CAP_STORAGE_DEPLOYMENT_UBUNTU,
720 CAP_NETWORK_DEPLOYMENT_UBUNTU,
721+<<<<<<< TREE
722 CAP_BRIDGING_INTERFACE_UBUNTU,
723 CAP_BRIDGING_AUTOMATIC_UBUNTU,
724 CAP_AUTHENTICATE_API,
725+=======
726+ CAP_BRIDGING_INTERFACE_UBUNTU,
727+ CAP_BRIDGING_AUTOMATIC_UBUNTU,
728+>>>>>>> MERGE-SOURCE
729 ]
730
731
732
733=== modified file 'src/maasserver/api/vlans.py'
734=== modified file 'src/maasserver/compose_preseed.py'
735--- src/maasserver/compose_preseed.py 2017-03-29 21:13:51 +0000
736+++ src/maasserver/compose_preseed.py 2017-04-25 09:34:40 +0000
737@@ -270,12 +270,18 @@
738 """Compose the preseed value for a node being installed with curtin."""
739 metadata_url = absolute_reverse('curtin-metadata', base_url=base_url)
740 return _compose_cloud_init_preseed(
741- node, token, metadata_url, base_url=base_url)
742+ node, token, metadata_url, base_url=base_url, reboot=True)
743
744
745 def _compose_cloud_init_preseed(
746+<<<<<<< TREE
747 node, token, metadata_url, base_url, poweroff_timeout=3600,
748 reboot_timeout=1800):
749+=======
750+ node, token, metadata_url, base_url, poweroff=False,
751+ poweroff_timeout=3600, poweroff_condition=None,
752+ reboot=False, reboot_timeout=1800):
753+>>>>>>> MERGE-SOURCE
754 cloud_config = {
755 'datasource': {
756 'MAAS': {
757@@ -318,6 +324,7 @@
758 cloud_config['apt_proxy'] = apt_proxy
759 # Add APT configuration for new cloud-init (>= 0.7.7-17)
760 cloud_config.update(get_archive_config(node=node, preserve_sources=False))
761+<<<<<<< TREE
762
763 enable_ssh = (node.status in {
764 NODE_STATUS.COMMISSIONING,
765@@ -344,6 +351,23 @@
766 'condition': 'test ! -e /tmp/block-poweroff',
767 }
768
769+=======
770+ if poweroff:
771+ cloud_config['power_state'] = {
772+ 'delay': 'now',
773+ 'mode': 'poweroff',
774+ 'timeout': poweroff_timeout,
775+ }
776+ if poweroff_condition is not None:
777+ cloud_config['power_state']['condition'] = poweroff_condition
778+ if reboot:
779+ cloud_config['power_state'] = {
780+ 'delay': 'now',
781+ 'mode': 'reboot',
782+ 'timeout': reboot_timeout,
783+ 'condition': 'test ! -e /tmp/block-reboot'
784+ }
785+>>>>>>> MERGE-SOURCE
786 return "#cloud-config\n%s" % yaml.safe_dump(cloud_config)
787
788
789
790=== modified file 'src/maasserver/config.py'
791--- src/maasserver/config.py 2017-03-30 19:40:18 +0000
792+++ src/maasserver/config.py 2017-04-25 09:34:40 +0000
793@@ -7,7 +7,13 @@
794 "RegionConfiguration",
795 ]
796
797-from formencode.validators import Int
798+<<<<<<< TREE
799+from formencode.validators import Int
800+=======
801+from os import path
802+
803+from formencode.validators import Int
804+>>>>>>> MERGE-SOURCE
805 from provisioningserver.config import (
806 Configuration,
807 ConfigurationFile,
808
809=== modified file 'src/maasserver/djangosettings/settings.py'
810=== modified file 'src/maasserver/fields.py'
811=== modified file 'src/maasserver/forms/tests/test_commissioning.py'
812=== modified file 'src/maasserver/forms/tests/test_dnsresource.py'
813=== modified file 'src/maasserver/forms/tests/test_interface_link.py'
814--- src/maasserver/forms/tests/test_interface_link.py 2017-02-17 14:23:04 +0000
815+++ src/maasserver/forms/tests/test_interface_link.py 2017-04-25 09:34:40 +0000
816@@ -44,7 +44,12 @@
817 })
818 self.assertTrue(form.is_valid(), form.errors)
819
820- def test__sets_subnet_queryset_to_all_on_interface_wihtout_vlan(self):
821+<<<<<<< TREE
822+ def test__sets_subnet_queryset_to_all_on_interface_wihtout_vlan(self):
823+=======
824+ @transactional
825+ def test__sets_subnet_queryset_to_all_on_interface_wihtout_vlan(self):
826+>>>>>>> MERGE-SOURCE
827 interface = factory.make_Interface(INTERFACE_TYPE.PHYSICAL)
828 interface.vlan = None
829 interface.save()
830
831=== modified file 'src/maasserver/listener.py'
832=== renamed file 'src/maasserver/migrations/south/django16_south_maas19.tar.gz' => 'src/maasserver/migrations/south/django16_south_maas19.tar.gz.OTHER'
833Binary files src/maasserver/migrations/south/django16_south_maas19.tar.gz 2016-12-07 12:46:14 +0000 and src/maasserver/migrations/south/django16_south_maas19.tar.gz.OTHER 2017-04-25 09:34:40 +0000 differ
834=== modified file 'src/maasserver/models/bmc.py'
835=== modified file 'src/maasserver/models/interface.py'
836=== modified file 'src/maasserver/models/node.py'
837=== modified file 'src/maasserver/models/staticipaddress.py'
838--- src/maasserver/models/staticipaddress.py 2017-04-06 18:19:08 +0000
839+++ src/maasserver/models/staticipaddress.py 2017-04-25 09:34:40 +0000
840@@ -246,6 +246,7 @@
841 requested_address = IPAddress(requested_address)
842 subnet.validate_static_ip(requested_address)
843 return self._attempt_allocation(
844+<<<<<<< TREE
845 requested_address, alloc_type, user=user, subnet=subnet)
846
847 def _get_special_mappings(self, domain, raw_ttl=False):
848@@ -426,6 +427,165 @@
849 mapping[fqdn].ttl = ttl
850 mapping[fqdn].ips.add(ip)
851 return mapping
852+=======
853+ requested_address, alloc_type,
854+ user=user, subnet=subnet)
855+
856+ def _get_special_mappings(self, domain, raw_ttl=False):
857+ """Get the special mappings, possibly limited to a single Domain.
858+
859+ This function is responsible for creating these mappings:
860+ - any USER_RESERVED IP,
861+ - any IP not associated with a Node,
862+ - any IP associated with a DNSResource.
863+ The caller is responsible for addresses otherwise derived from nodes.
864+
865+ Because of how the get hostname_ip_mapping code works, we actually need
866+ to fetch ALL of the entries for subnets, but forward mappings need to
867+ be domain-specific.
868+
869+ :param domain: limit return to just the given Domain. If anything
870+ other than a Domain is passed in (e.g., a Subnet or None), we
871+ return all of the reverse mappings.
872+ :param raw_ttl: Boolean, if True then just return the address_ttl,
873+ otherwise, coalesce the address_ttl to be the correct answer for
874+ zone generation.
875+ :return: a (default) dict of hostname: HostnameIPMapping entries.
876+ """
877+ default_ttl = "%d" % Config.objects.get_config('default_dns_ttl')
878+ if isinstance(domain, Domain):
879+ # Domains are special in that we only want to have entries for the
880+ # domain that we were asked about. And they can possibly come from
881+ # either the child or the parent for glue.
882+ where_clause = """
883+ AND (
884+ dnsrr.dom2_id = %s OR
885+ node.dom2_id = %s OR
886+ dnsrr.domain_id = %s OR
887+ node.domain_id = %s
888+ """
889+ query_parms = [domain.id, domain.id, domain.id, domain.id]
890+ # And the default domain is extra special, since it needs to have
891+ # A/AAAA RRs for any USER_RESERVED addresses that have no name
892+ # otherwise attached to them.
893+ if domain.is_default():
894+ where_clause += """ OR (
895+ dnsrr.fqdn IS NULL AND
896+ node.fqdn IS NULL)
897+ """
898+ where_clause += ")"
899+ else:
900+ # There is nothing special about the query for subnets.
901+ domain = None
902+ where_clause = ""
903+ query_parms = []
904+ # raw_ttl says that we don't coalesce, but we need to pick one, so we
905+ # go with DNSResource if it is involved.
906+ if raw_ttl:
907+ ttl_clause = """COALESCE(dnsrr.address_ttl, node.address_ttl)"""
908+ else:
909+ ttl_clause = """
910+ COALESCE(
911+ dnsrr.address_ttl,
912+ dnsrr.ttl,
913+ node.address_ttl,
914+ node.ttl,
915+ %s)""" % default_ttl
916+ # And here is the SQL query of doom. Build up inner selects to get the
917+ # view of a DNSResource (and Node) that we need, and finally use
918+ # domain2 to handle the case where an FQDN is also the name of a domain
919+ # that we know.
920+ sql_query = """
921+ SELECT
922+ COALESCE(dnsrr.fqdn, node.fqdn) AS fqdn,
923+ node.system_id,
924+ node.node_type,
925+ """ + ttl_clause + """ AS ttl,
926+ staticip.ip
927+ FROM
928+ maasserver_staticipaddress AS staticip
929+ LEFT JOIN (
930+ /* Create a dnsrr that has what we need. */
931+ SELECT
932+ CASE WHEN dnsrr.name = '@' THEN
933+ dom.name
934+ ELSE
935+ CONCAT(dnsrr.name, '.', dom.name)
936+ END AS fqdn,
937+ dom.name as dom_name,
938+ dnsrr.domain_id,
939+ dnsrr.address_ttl,
940+ dom.ttl,
941+ dia.staticipaddress_id AS dnsrr_sip_id,
942+ dom2.id AS dom2_id
943+ FROM maasserver_dnsresource_ip_addresses AS dia
944+ JOIN maasserver_dnsresource AS dnsrr ON
945+ dia.dnsresource_id = dnsrr.id
946+ JOIN maasserver_domain AS dom ON
947+ dnsrr.domain_id = dom.id
948+ LEFT JOIN maasserver_domain AS dom2 ON
949+ CONCAT(dnsrr.name, '.', dom.name) = dom2.name OR (
950+ dnsrr.name = '@' AND
951+ dom.name SIMILAR TO CONCAT('[-A-Za-z0-9]*.', dom2.name)
952+ )
953+ ) AS dnsrr ON
954+ dnsrr_sip_id = staticip.id
955+ LEFT JOIN (
956+ /* Create a node that has what we need. */
957+ SELECT
958+ CONCAT(nd.hostname, '.', dom.name) AS fqdn,
959+ dom.name as dom_name,
960+ nd.system_id,
961+ nd.node_type,
962+ nd.domain_id,
963+ nd.address_ttl,
964+ dom.ttl,
965+ iia.staticipaddress_id AS node_sip_id,
966+ dom2.id AS dom2_id
967+ FROM maasserver_interface_ip_addresses AS iia
968+ JOIN maasserver_interface AS iface ON
969+ iia.interface_id = iface.id
970+ JOIN maasserver_node AS nd ON
971+ iface.node_id = nd.id
972+ JOIN maasserver_domain AS dom ON
973+ nd.domain_id = dom.id
974+ LEFT JOIN maasserver_domain AS dom2 ON
975+ CONCAT(nd.hostname, '.', dom.name) = dom2.name
976+ ) AS node ON
977+ node_sip_id = staticip.id
978+ WHERE
979+ staticip.ip IS NOT NULL AND
980+ host(staticip.ip) != '' AND
981+ (
982+ staticip.alloc_type = %s OR
983+ node.fqdn IS NULL OR
984+ dnsrr IS NOT NULL
985+ )""" + where_clause + """
986+ """
987+ default_domain = Domain.objects.get_default_domain()
988+ mapping = defaultdict(HostnameIPMapping)
989+ cursor = connection.cursor()
990+ query_parms = [IPADDRESS_TYPE.USER_RESERVED] + query_parms
991+ cursor.execute(sql_query, query_parms)
992+ for (fqdn, system_id, node_type, ttl,
993+ ip) in cursor.fetchall():
994+ if fqdn is None or fqdn == '':
995+ fqdn = "%s.%s" % (
996+ get_ip_based_hostname(ip), default_domain.name)
997+ mapping[fqdn].node_type = node_type
998+ mapping[fqdn].system_id = system_id
999+ mapping[fqdn].ttl = ttl
1000+ mapping[fqdn].ips.add(ip)
1001+ return mapping
1002+
1003+ @asynchronous
1004+ def _async_find_free_ip(self, *args, **kwargs):
1005+ return deferToDatabase(
1006+ transactional(self._find_free_ip), *args, **kwargs)
1007+
1008+ def _find_free_ip(self, subnet, exclude_addresses=None):
1009+ return subnet.get_next_ip_for_allocation(exclude_addresses)
1010+>>>>>>> MERGE-SOURCE
1011
1012 def get_hostname_ip_mapping(self, domain_or_subnet, raw_ttl=False):
1013 """Return hostname mappings for `StaticIPAddress` entries.
1014
1015=== modified file 'src/maasserver/models/subnet.py'
1016=== modified file 'src/maasserver/models/tests/test_bmc.py'
1017=== modified file 'src/maasserver/models/tests/test_interface.py'
1018=== modified file 'src/maasserver/models/tests/test_node.py'
1019=== modified file 'src/maasserver/models/tests/test_staticipaddress.py'
1020--- src/maasserver/models/tests/test_staticipaddress.py 2017-04-06 16:38:44 +0000
1021+++ src/maasserver/models/tests/test_staticipaddress.py 2017-04-25 09:34:40 +0000
1022@@ -40,8 +40,12 @@
1023 MAASServerTestCase,
1024 MAASTransactionServerTestCase,
1025 )
1026+<<<<<<< TREE
1027 from maasserver.utils import orm
1028 from maasserver.utils.dns import get_ip_based_hostname
1029+=======
1030+from maasserver.utils.dns import get_ip_based_hostname
1031+>>>>>>> MERGE-SOURCE
1032 from maasserver.utils.orm import (
1033 reload_object,
1034 transactional,
1035@@ -1082,9 +1086,14 @@
1036 self.expectThat(mappings, HasLength(0))
1037
1038 def test_user_reserved_addresses_included_in_correct_domains(self):
1039+<<<<<<< TREE
1040 # Generate some addresses with no names attached, and some more in each
1041 # of two (non-default) domains. Make sure that they wind up in the
1042 # right domains, and not in other domains.
1043+=======
1044+ # Generate addresses in two domains, and make sure that they wind up in
1045+ # the right domains, and not in other domains.
1046+>>>>>>> MERGE-SOURCE
1047 domain0 = Domain.objects.get_default_domain()
1048 domain1 = factory.make_Domain()
1049 domain2 = factory.make_Domain()
1050@@ -1277,6 +1286,138 @@
1051 self.assertEqual({
1052 dnsrr.fqdn: HostnameIPMapping(None, 30, {ip.ip}, None)}, mappings)
1053
1054+ def test_dns_resources_only_have_correct_domain(self):
1055+ # Create two DNS resources pointing to the same IP, and make sure that
1056+ # they only get the forward mapping that they should have, but get both
1057+ # reverse mappings, as is proper.
1058+ domain0 = Domain.objects.get_default_domain()
1059+ domain1 = factory.make_Domain()
1060+ domain2 = factory.make_Domain()
1061+ subnet = factory.make_Subnet()
1062+ ip = factory.make_StaticIPAddress(subnet=subnet)
1063+ name1 = factory.make_name('label')
1064+ name2 = factory.make_name('label')
1065+ factory.make_DNSResource(name=name1, ip_addresses=[ip], domain=domain1)
1066+ factory.make_DNSResource(name=name2, ip_addresses=[ip], domain=domain2)
1067+ mappings = StaticIPAddress.objects.get_hostname_ip_mapping(domain0)
1068+ self.expectThat(mappings, HasLength(0))
1069+ mappings = StaticIPAddress.objects.get_hostname_ip_mapping(domain1)
1070+ self.expectThat(mappings, HasLength(1))
1071+ self.assertEqual(
1072+ mappings.get('%s.%s' % (name1, domain1.name)),
1073+ HostnameIPMapping(None, 30, {ip.ip}, None))
1074+ mappings = StaticIPAddress.objects.get_hostname_ip_mapping(domain2)
1075+ self.expectThat(mappings, HasLength(1))
1076+ self.assertEqual(
1077+ mappings.get('%s.%s' % (name2, domain2.name)),
1078+ HostnameIPMapping(None, 30, {ip.ip}, None))
1079+ mappings = StaticIPAddress.objects.get_hostname_ip_mapping(subnet)
1080+ self.assertEqual(
1081+ mappings, {
1082+ "%s.%s" % (name1, domain1.name): HostnameIPMapping(
1083+ None, 30, {ip.ip}, None),
1084+ "%s.%s" % (name2, domain2.name): HostnameIPMapping(
1085+ None, 30, {ip.ip}, None)})
1086+
1087+ def test_user_reserved_IP_on_node_or_default_domain_not_both(self):
1088+ # ip1 gets assigned to an interface on a node in domain1
1089+ # ip2 is not assigned to anything.
1090+ # ip1 should show up for the node, in domain1, and the subnet.
1091+ # ip2 should show up in the default domain, and the subnet.
1092+ domain0 = Domain.objects.get_default_domain()
1093+ domain1 = factory.make_Domain()
1094+ subnet = factory.make_Subnet()
1095+ ip1 = factory.make_StaticIPAddress(subnet=subnet)
1096+ ip2 = factory.make_StaticIPAddress(subnet=subnet)
1097+ name2 = "%s.%s" % (get_ip_based_hostname(ip2.ip), domain0.name)
1098+ node = factory.make_Node(
1099+ interface=True,
1100+ domain=domain1,
1101+ vlan=subnet.vlan)
1102+ node.interface_set.first().ip_addresses.add(ip1)
1103+ mappings = StaticIPAddress.objects.get_hostname_ip_mapping(domain0)
1104+ self.expectThat(mappings, HasLength(1))
1105+ self.assertEqual(
1106+ mappings, {
1107+ name2: HostnameIPMapping(None, 30, {ip2.ip}, None)})
1108+ mappings = StaticIPAddress.objects.get_hostname_ip_mapping(domain1)
1109+ self.expectThat(mappings, HasLength(1))
1110+ self.assertEqual(
1111+ mappings.get(node.fqdn),
1112+ HostnameIPMapping(node.system_id, 30, {ip1.ip}, node.node_type))
1113+ mappings = StaticIPAddress.objects.get_hostname_ip_mapping(subnet)
1114+ self.assertEqual(
1115+ mappings, {
1116+ node.fqdn: HostnameIPMapping(
1117+ node.system_id, 30, {ip1.ip}, node.node_type),
1118+ name2: HostnameIPMapping(None, 30, {ip2.ip}, None)})
1119+
1120+ def test_node_glue_correctly_generated(self):
1121+ # Given node "foo.bar.com" and a "foo.bar.com" domain (in addition to
1122+ # "bar.com"), with an IP associated with it, make sure that both
1123+ # domains are correctly populated.
1124+ domain0 = Domain.objects.get_default_domain()
1125+ parent = factory.make_Domain(name=factory.make_name('parent'))
1126+ name = factory.make_name('child')
1127+ domain = factory.make_Domain(name="%s.%s" % (name, parent.name))
1128+ subnet = factory.make_Subnet()
1129+ ip = factory.make_StaticIPAddress(subnet=subnet)
1130+ node = factory.make_Node(
1131+ interface=True,
1132+ domain=parent,
1133+ hostname=name,
1134+ vlan=subnet.vlan)
1135+ node.interface_set.first().ip_addresses.add(ip)
1136+ mappings = StaticIPAddress.objects.get_hostname_ip_mapping(domain0)
1137+ self.expectThat(mappings, HasLength(0))
1138+ mappings = StaticIPAddress.objects.get_hostname_ip_mapping(parent)
1139+ self.expectThat(mappings, HasLength(1))
1140+ self.assertEqual(
1141+ mappings.get(node.fqdn),
1142+ HostnameIPMapping(node.system_id, 30, {ip.ip}, node.node_type))
1143+ mappings = StaticIPAddress.objects.get_hostname_ip_mapping(domain)
1144+ self.expectThat(mappings, HasLength(1))
1145+ self.assertEqual(
1146+ mappings.get(node.fqdn),
1147+ HostnameIPMapping(node.system_id, 30, {ip.ip}, node.node_type))
1148+ mappings = StaticIPAddress.objects.get_hostname_ip_mapping(subnet)
1149+ self.assertEqual(
1150+ mappings, {
1151+ node.fqdn: HostnameIPMapping(
1152+ node.system_id, 30, {ip.ip}, node.node_type)})
1153+
1154+ def test_dnsrr_glue_correctly_generated(self):
1155+ # Given DNSResource "foo.bar.com" and a "foo.bar.com" domain (in
1156+ # addition to "bar.com"), with an IP associated with it, make sure that
1157+ # both domains are correctly populated.
1158+ domain0 = Domain.objects.get_default_domain()
1159+ parent = factory.make_Domain(name=factory.make_name('parent'))
1160+ name = factory.make_name('child')
1161+ domain = factory.make_Domain(name="%s.%s" % (name, parent.name))
1162+ subnet = factory.make_Subnet()
1163+ ip = factory.make_StaticIPAddress(subnet=subnet)
1164+ dnsrr = factory.make_DNSResource(
1165+ domain=domain,
1166+ name='@',
1167+ ip_addresses=[ip])
1168+ mappings = StaticIPAddress.objects.get_hostname_ip_mapping(domain0)
1169+ self.expectThat(mappings, HasLength(0))
1170+ mappings = StaticIPAddress.objects.get_hostname_ip_mapping(parent)
1171+ self.expectThat(mappings, HasLength(1))
1172+ self.assertEqual(
1173+ mappings.get(dnsrr.fqdn),
1174+ HostnameIPMapping(None, 30, {ip.ip}, None))
1175+ mappings = StaticIPAddress.objects.get_hostname_ip_mapping(domain)
1176+ self.expectThat(mappings, HasLength(1))
1177+ self.assertEqual(
1178+ mappings.get(dnsrr.fqdn),
1179+ HostnameIPMapping(None, 30, {ip.ip}, None))
1180+ mappings = StaticIPAddress.objects.get_hostname_ip_mapping(subnet)
1181+ self.assertEqual(
1182+ mappings, {
1183+ dnsrr.fqdn: HostnameIPMapping(
1184+ None, 30, {ip.ip}, None)})
1185+
1186
1187 class TestRenderJSON(MAASServerTestCase):
1188
1189
1190=== modified file 'src/maasserver/models/tests/test_subnet.py'
1191--- src/maasserver/models/tests/test_subnet.py 2017-04-17 19:09:26 +0000
1192+++ src/maasserver/models/tests/test_subnet.py 2017-04-25 09:34:40 +0000
1193@@ -1012,6 +1012,7 @@
1194 discovery = subnet.get_least_recently_seen_unknown_neighbour()
1195 self.assertThat(discovery.ip, Equals("10.0.0.2"))
1196
1197+<<<<<<< TREE
1198 def test__returns_least_recently_seen_neighbour_excludes_in_use(self):
1199 # Note: 10.0.0.0/30 --> 10.0.0.1 and 10.0.0.0.2 are usable.
1200 subnet = factory.make_Subnet(
1201@@ -1051,6 +1052,25 @@
1202 discovery = subnet.get_least_recently_seen_unknown_neighbour()
1203 self.assertThat(discovery.ip, Equals("10.0.0.2"))
1204
1205+=======
1206+ def test__returns_least_recently_seen_neighbour_excludes_in_use(self):
1207+ # Note: 10.0.0.0/30 --> 10.0.0.1 and 10.0.0.0.2 are usable.
1208+ subnet = factory.make_Subnet(
1209+ cidr="10.0.0.0/30", gateway_ip=None, dns_servers=None)
1210+ rackif = factory.make_Interface(vlan=subnet.vlan)
1211+ now = datetime.now()
1212+ yesterday = now - timedelta(days=1)
1213+ factory.make_Discovery(
1214+ ip="10.0.0.1", interface=rackif, updated=now)
1215+ factory.make_Discovery(
1216+ ip="10.0.0.2", interface=rackif, updated=yesterday)
1217+ factory.make_IPRange(
1218+ subnet, start_ip="10.0.0.2", end_ip="10.0.0.2",
1219+ type=IPRANGE_TYPE.RESERVED)
1220+ discovery = subnet.get_least_recently_seen_unknown_neighbour()
1221+ self.assertThat(discovery.ip, Equals("10.0.0.1"))
1222+
1223+>>>>>>> MERGE-SOURCE
1224 def test__returns_none_if_no_neighbours(self):
1225 # Note: 10.0.0.0/30 --> 10.0.0.1 and 10.0.0.0.2 are usable.
1226 subnet = factory.make_Subnet(
1227
1228=== modified file 'src/maasserver/preseed.py'
1229--- src/maasserver/preseed.py 2017-03-21 18:24:36 +0000
1230+++ src/maasserver/preseed.py 2017-04-25 09:34:40 +0000
1231@@ -471,6 +471,7 @@
1232 get_node_preseed_context(
1233 node, osystem, series, rack_controller=rack_controller))
1234 context.update(get_curtin_context(node, rack_controller=rack_controller))
1235+<<<<<<< TREE
1236 deprecated_context_variables = [
1237 'main_archive_hostname', 'main_archive_directory',
1238 'ports_archive_hostname', 'ports_archive_directory',
1239@@ -506,6 +507,43 @@
1240 if node.distro_series == "precise":
1241 config['power_state'] = {'mode': 'reboot'}
1242 return yaml.safe_dump(config)
1243+=======
1244+ deprecated_context_variables = [
1245+ 'main_archive_hostname', 'main_archive_directory',
1246+ 'ports_archive_hostname', 'ports_archive_directory',
1247+ 'enable_http_proxy', 'http_proxy']
1248+ deprecated_config_variables = []
1249+ for var in deprecated_context_variables:
1250+ if var not in context:
1251+ deprecated_context_variables.remove(var)
1252+ context.update(get_node_deprecated_preseed_context())
1253+ config = yaml.load(template.substitute(**context))
1254+ # Remove deprecated config from the curtin preseed.
1255+ if 'power_state' in config:
1256+ del config['power_state']
1257+ deprecated_config_variables.append('power_state')
1258+ if 'apt_proxy' in config:
1259+ deprecated_config_variables.append('apt_proxy')
1260+ del config['apt_proxy']
1261+ if 'apt_mirrors' in config:
1262+ deprecated_config_variables.append('apt_mirrors')
1263+ del config['apt_mirrors']
1264+ if deprecated_context_variables:
1265+ log.warn(
1266+ "WARNING: '%s' contains deprecated preseed "
1267+ "variables. Please remove: %s" % (
1268+ template.name, ", ".join(deprecated_context_variables)))
1269+ if deprecated_config_variables:
1270+ log.warn(
1271+ "WARNING: '%s' contains deprecated preseed "
1272+ "configuration. Please remove: %s" % (
1273+ template.name, ", ".join(deprecated_config_variables)))
1274+ # Precise does not support cloud-init performing the reboot, so curtin
1275+ # must have this statement.
1276+ if node.distro_series == "precise":
1277+ config['power_state'] = {'mode': 'reboot'}
1278+ return yaml.dump(config)
1279+>>>>>>> MERGE-SOURCE
1280
1281
1282 def get_curtin_context(node, rack_controller=None):
1283
1284=== modified file 'src/maasserver/rpc/regionservice.py'
1285=== modified file 'src/maasserver/rpc/tests/test_regionservice.py'
1286=== added file 'src/maasserver/static/assets/images/icons/account.svg.OTHER'
1287--- src/maasserver/static/assets/images/icons/account.svg.OTHER 1970-01-01 00:00:00 +0000
1288+++ src/maasserver/static/assets/images/icons/account.svg.OTHER 2017-04-25 09:34:40 +0000
1289@@ -0,0 +1,1 @@
1290+<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96" viewBox="0 0 96 96.000001"><g color="#000"><path overflow="visible" fill="none" d="M96 0v96H0V0z"/><path style="line-height:normal;font-variant-ligatures:none;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;block-progression:tb;shape-padding:0;isolation:auto;mix-blend-mode:normal" d="M48 6C24.828 6 6 24.83 6 48s18.828 41.998 42 41.998S90 71.17 90 48C90 24.83 71.172 6 48 6zm0 4c21.01 0 37.998 16.99 37.998 38 0 9.324-3.35 17.852-8.908 24.46a25.598 25.598 0 0 0-4.94-7.495c-1.955-2.062-4.308-3.79-7.017-5.192a24.975 24.975 0 0 1-3.697 2.682c3.188 1.365 5.775 3.117 7.81 5.264h.002c2.162 2.274 3.75 4.902 4.81 7.94C67.26 82.07 58.1 86 48 86c-10.135 0-19.325-3.96-26.133-10.412 1.123-3.013 2.706-5.623 4.78-7.875 2.208-2.328 5.055-4.2 8.626-5.606 3.507-1.38 7.732-2.106 12.696-2.11L48 60c2.886 0 5.613-.508 8.12-1.54l.017-.01.017-.01c2.49-1.078 4.66-2.615 6.45-4.575 1.84-1.96 3.258-4.302 4.242-6.967.994-2.693 1.476-5.672 1.476-8.898v-.002c0-3.18-.484-6.132-1.476-8.822-.98-2.706-2.397-5.073-4.24-7.037-1.79-1.966-3.973-3.483-6.47-4.515C53.623 16.54 50.89 16 48 16c-2.892 0-5.624.54-8.135 1.625a18.703 18.703 0 0 0-6.54 4.5l-.01.012-.01.01c-1.792 1.968-3.176 4.333-4.155 7.037l-.002.004c-.99 2.686-1.47 5.634-1.47 8.81 0 3.226.48 6.207 1.474 8.9.98 2.657 2.366 4.993 4.153 6.954l.01.01.01.01a19.447 19.447 0 0 0 4.152 3.345c-1.274.325-2.5.71-3.668 1.17-4.03 1.587-7.416 3.776-10.074 6.58l-.01.012-.01.01c-2.007 2.177-3.62 4.66-4.855 7.41a37.86 37.86 0 0 1-8.858-24.4c0-21.01 16.99-38 37.998-38zm0 9.998c2.408 0 4.573.438 6.562 1.3l.018.01.016.006c1.995.823 3.66 1.983 5.066 3.526l.01.012.01.01c1.453 1.548 2.587 3.42 3.406 5.685l.002.008.004.006c.81 2.195 1.226 4.662 1.226 7.44 0 2.83-.418 5.323-1.226 7.514-.818 2.216-1.953 4.07-3.412 5.623l-.01.01-.01.013c-1.408 1.546-3.083 2.735-5.086 3.606C52.584 55.583 50.412 56 48 56c-2.413 0-4.586-.416-6.578-1.234a15.41 15.41 0 0 1-5.168-3.62c-1.412-1.553-2.528-3.41-3.348-5.632-.808-2.19-1.226-4.684-1.226-7.514 0-2.778.417-5.245 1.226-7.44l.002-.005.004-.008c.82-2.27 1.936-4.147 3.342-5.693a14.599 14.599 0 0 1 5.15-3.54l.016-.007.017-.008c1.99-.864 4.156-1.302 6.563-1.302z" font-family="sans-serif" white-space="normal" overflow="visible" solid-color="#000000" fill="gray"/></g></svg>
1291\ No newline at end of file
1292
1293=== added file 'src/maasserver/static/assets/images/icons/add-logical-volume.svg.OTHER'
1294--- src/maasserver/static/assets/images/icons/add-logical-volume.svg.OTHER 1970-01-01 00:00:00 +0000
1295+++ src/maasserver/static/assets/images/icons/add-logical-volume.svg.OTHER 2017-04-25 09:34:40 +0000
1296@@ -0,0 +1,1 @@
1297+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 4.2333398 4.2333403"><path color="#000" overflow="visible" opacity=".12" fill="none" d="M4.233 4.233V0H0v4.233z"/><path d="M3.175 2.38v.795H2.38v.265h.795v.793h.265V3.44h.793v-.265H3.44V2.38zM2.38 0v1.852h1.853V0zm.266.265H3.97v1.323H2.645zM0 0v1.852h1.852V0zm.265.265h1.323v1.323H.264zM0 2.38v1.853h1.852V2.38zm.265.266h1.323V3.97H.264z" color="#000" overflow="visible" fill="gray"/></svg>
1298\ No newline at end of file
1299
1300=== added file 'src/maasserver/static/assets/images/icons/add-partition.svg.OTHER'
1301--- src/maasserver/static/assets/images/icons/add-partition.svg.OTHER 1970-01-01 00:00:00 +0000
1302+++ src/maasserver/static/assets/images/icons/add-partition.svg.OTHER 2017-04-25 09:34:40 +0000
1303@@ -0,0 +1,1 @@
1304+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 4.2333398 4.2333315"><path color="#000" overflow="visible" opacity=".12" fill="none" d="M4.233 4.233V0H0v4.233z"/><path d="M0 .794V3.44h1.852v-.265H.265V1.058h1.587V.794zm3.175.529v.794H2.38v.264h.795v.795h.265V2.38h.793v-.263H3.44v-.794zM1.852.264h.265v.53h-.265z" color="#000" overflow="visible" fill="gray"/><path color="#000" overflow="visible" fill="gray" d="M1.852 1.058h.265v.53h-.265zm0 .794h.265v.53h-.265zm0 .793h.265v.53h-.265zm0 .795h.265v.528h-.265z"/></svg>
1305\ No newline at end of file
1306
1307=== added file 'src/maasserver/static/assets/images/icons/add.svg.OTHER'
1308--- src/maasserver/static/assets/images/icons/add.svg.OTHER 1970-01-01 00:00:00 +0000
1309+++ src/maasserver/static/assets/images/icons/add.svg.OTHER 2017-04-25 09:34:40 +0000
1310@@ -0,0 +1,1 @@
1311+<svg width="20" height="20" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><title>add</title><g fill="gray" fill-rule="evenodd"><path d="M20 9v2H0V9z"/><path d="M11 20H9V0h2z"/></g></svg>
1312\ No newline at end of file
1313
1314=== added file 'src/maasserver/static/assets/images/icons/cross-orange.svg.OTHER'
1315--- src/maasserver/static/assets/images/icons/cross-orange.svg.OTHER 1970-01-01 00:00:00 +0000
1316+++ src/maasserver/static/assets/images/icons/cross-orange.svg.OTHER 2017-04-25 09:34:40 +0000
1317@@ -0,0 +1,1 @@
1318+<svg width="11" height="10" viewBox="0 0 11 10" xmlns="http://www.w3.org/2000/svg"><title>Imported Layers</title><path d="M2 1l8 8m0-8L2 9" stroke="#DD4814" stroke-width="3" stroke-linejoin="round" fill="none" fill-rule="evenodd"/></svg>
1319\ No newline at end of file
1320
1321=== added file 'src/maasserver/static/assets/images/icons/cross.svg.OTHER'
1322--- src/maasserver/static/assets/images/icons/cross.svg.OTHER 1970-01-01 00:00:00 +0000
1323+++ src/maasserver/static/assets/images/icons/cross.svg.OTHER 2017-04-25 09:34:40 +0000
1324@@ -0,0 +1,1 @@
1325+<svg width="11" height="10" viewBox="0 0 11 10" xmlns="http://www.w3.org/2000/svg"><title>Imported Layers Copy</title><path d="M2 1l8 8m0-8L2 9" stroke="#888" stroke-width="3" stroke-linejoin="round" fill="none"/></svg>
1326\ No newline at end of file
1327
1328=== added file 'src/maasserver/static/assets/images/icons/cross_orange.svg.OTHER'
1329--- src/maasserver/static/assets/images/icons/cross_orange.svg.OTHER 1970-01-01 00:00:00 +0000
1330+++ src/maasserver/static/assets/images/icons/cross_orange.svg.OTHER 2017-04-25 09:34:40 +0000
1331@@ -0,0 +1,1 @@
1332+<svg width="11" height="10" viewBox="0 0 11 10" xmlns="http://www.w3.org/2000/svg"><title>Imported Layers</title><path d="M2 1l8 8m0-8L2 9" stroke="#DD4814" stroke-width="3" stroke-linejoin="round" fill="none"/></svg>
1333\ No newline at end of file
1334
1335=== added file 'src/maasserver/static/assets/images/icons/debug.svg.OTHER'
1336--- src/maasserver/static/assets/images/icons/debug.svg.OTHER 1970-01-01 00:00:00 +0000
1337+++ src/maasserver/static/assets/images/icons/debug.svg.OTHER 2017-04-25 09:34:40 +0000
1338@@ -0,0 +1,1 @@
1339+<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><title>debug icon 8@2x</title><path d="M11.673 12.994L14.68 16l1.313-1.316-3.004-3.005A5.501 5.501 0 0 0 8.5 3C5.46 3 3 5.463 3 8.5 3 11.54 5.46 14 8.5 14c1.18 0 2.276-.37 3.173-1.006zM4.25 8.5a4.25 4.25 0 1 1 8.5 0 4.25 4.25 0 0 1-8.5 0zM6 9h5v1H6V9zm0-2h5v1H6V7zM4.71 0C2.845 0 1.646.095.87.87.093 1.648 0 2.847 0 4.716v4.568c0 1.87.094 3.068.87 3.844.667.668 1.68.824 3.13.857v-1.002c-1.327-.044-2.075-.21-2.424-.56-.41-.41-.576-1.318-.576-3.14V4.716c0-1.82.167-2.727.576-3.137C1.986 1.168 2.892 1 4.71 1h4.577c1.82 0 2.726.17 3.135.578.348.35.514 1.097.558 2.422h1.006c-.033-1.45-.19-2.46-.857-3.13C12.352.096 11.153 0 9.286 0H4.71z" fill="gray" fill-rule="evenodd"/></svg>
1340\ No newline at end of file
1341
1342=== added file 'src/maasserver/static/assets/images/icons/delete.svg.OTHER'
1343--- src/maasserver/static/assets/images/icons/delete.svg.OTHER 1970-01-01 00:00:00 +0000
1344+++ src/maasserver/static/assets/images/icons/delete.svg.OTHER 2017-04-25 09:34:40 +0000
1345@@ -0,0 +1,1 @@
1346+<svg width="19" height="24" viewBox="0 0 19 24" xmlns="http://www.w3.org/2000/svg"><title>remove</title><g fill="gray" fill-rule="evenodd"><path d="M1 5v15.898C1 24 2.067 24 4.733 24h9.534C16.933 24 18 24 18 20.9V5H1zm2 1.6h2V18h1V6.6h3V18h1V6.6h3V18h1V6.6h2v13.216C16 22 15.884 22 13.77 22H5.23C3.117 22 3 22 3 19.816V6.6z"/><path d="M0 5h19v2H0M7.014.547V2.74L8 2.395V1.2c.59-.12 1.004-.203 1.502-.2.498.003.917.086 1.498.2v1.195l1 .345V.547C10.872.072 10.46 0 9.507 0c-.954 0-1.42.087-2.493.547z"/><path d="M9.5 2C6.667 2 3.828 2.52 1 3.49V6h17V3.49C15.166 2.54 12.333 2 9.5 2z"/></g></svg>
1347\ No newline at end of file
1348
1349=== added file 'src/maasserver/static/assets/images/icons/edit.svg.OTHER'
1350--- src/maasserver/static/assets/images/icons/edit.svg.OTHER 1970-01-01 00:00:00 +0000
1351+++ src/maasserver/static/assets/images/icons/edit.svg.OTHER 2017-04-25 09:34:40 +0000
1352@@ -0,0 +1,1 @@
1353+<svg width="22" height="22" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><title>edit</title><g fill="gray" fill-rule="evenodd"><path d="M17 15h5v1h-5zm-3 3h8v1h-8zm-3 3h11v1H11zm5.75-21L3.47 13.517S.956 17.465 0 21.987v.004l.002.004V22c4.532-.955 8.48-3.472 8.48-3.472L22 5.25 16.75 0zM4.51 14.555L7.454 17.5c-.2.114-2.99 2.064-5.544 2.602V20.093l-.002-.003c.537-2.546 2.485-5.334 2.602-5.537v.002z"/><path d="M2.234 18l1.85 1.85L1 21"/></g></svg>
1354\ No newline at end of file
1355
1356=== added file 'src/maasserver/static/assets/images/icons/green-tick.svg.OTHER'
1357--- src/maasserver/static/assets/images/icons/green-tick.svg.OTHER 1970-01-01 00:00:00 +0000
1358+++ src/maasserver/static/assets/images/icons/green-tick.svg.OTHER 2017-04-25 09:34:40 +0000
1359@@ -0,0 +1,1 @@
1360+<svg xmlns="http://www.w3.org/2000/svg" height="16" width="22" viewBox="0 0 22 16"><title>textfield-saved</title><path d="M20.04.343l-.154.136-11.138 9.756-6.53-5.601L.246 6.866l8.505 8.948L21.687 2.2 20.04.343z" fill="#38B44A" fill-rule="evenodd"/></svg>
1361\ No newline at end of file
1362
1363=== added file 'src/maasserver/static/assets/images/icons/help.svg.OTHER'
1364--- src/maasserver/static/assets/images/icons/help.svg.OTHER 1970-01-01 00:00:00 +0000
1365+++ src/maasserver/static/assets/images/icons/help.svg.OTHER 2017-04-25 09:34:40 +0000
1366@@ -0,0 +1,1 @@
1367+<svg width="22" height="22" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><title>help</title><g fill="none" fill-rule="evenodd"><path d="M0 0h22v22H0z"/><path d="M11.011 5.902c-.43 0-.843.056-1.237.166a5.314 5.314 0 0 0-1.238.499L7.91 4.849a6.271 6.271 0 0 1 1.55-.609A6.893 6.893 0 0 1 11.27 4c.74 0 1.349.105 1.829.314.48.197.862.45 1.145.757.283.308.48.646.59 1.016.112.37.167.726.167 1.07 0 .42-.08.795-.24 1.127-.148.333-.339.64-.573.924a9.395 9.395 0 0 1-.757.812c-.27.247-.523.505-.757.776-.234.258-.43.536-.59.831a2.199 2.199 0 0 0-.222.997v.222c0 .074.006.148.018.221H9.96a3.685 3.685 0 0 1-.056-.387 4.914 4.914 0 0 1-.018-.407c0-.406.067-.77.203-1.09.135-.32.307-.615.517-.886a7.9 7.9 0 0 1 .665-.757c.246-.234.474-.468.683-.702a3.91 3.91 0 0 0 .517-.72c.135-.246.203-.517.203-.812 0-.407-.141-.739-.425-.998-.27-.27-.683-.406-1.237-.406zM12.477 16.01c0 .43-.141.781-.424 1.052-.284.27-.634.406-1.053.406-.406 0-.757-.135-1.053-.406-.283-.271-.424-.622-.424-1.053 0-.43.141-.782.424-1.052A1.47 1.47 0 0 1 11 14.532c.419 0 .77.141 1.053.425.283.27.424.621.424 1.052z" fill="gray"/><circle stroke="gray" stroke-width="1.5" cx="11" cy="11" r="10.25"/></g></svg>
1368\ No newline at end of file
1369
1370=== added file 'src/maasserver/static/assets/images/icons/info-mono.svg.OTHER'
1371--- src/maasserver/static/assets/images/icons/info-mono.svg.OTHER 1970-01-01 00:00:00 +0000
1372+++ src/maasserver/static/assets/images/icons/info-mono.svg.OTHER 2017-04-25 09:34:40 +0000
1373@@ -0,0 +1,1 @@
1374+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16.000017 16.000017"><g color="#000"><path style="marker:none" overflow="visible" fill="none" d="M0 0h16v16H0z"/><path style="marker:none" d="M1.066 0C.476 0 0 .475 0 1.066v13.868C0 15.524.475 16 1.066 16h13.868c.59 0 1.066-.475 1.066-1.066V1.066C16 .476 15.525 0 14.934 0H1.066zM7 3h2v2H7V3zm0 4h2v6H7V7z" overflow="visible" fill="#fff"/></g></svg>
1375\ No newline at end of file
1376
1377=== added file 'src/maasserver/static/assets/images/icons/info.svg.OTHER'
1378--- src/maasserver/static/assets/images/icons/info.svg.OTHER 1970-01-01 00:00:00 +0000
1379+++ src/maasserver/static/assets/images/icons/info.svg.OTHER 2017-04-25 09:34:40 +0000
1380@@ -0,0 +1,1 @@
1381+<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><title>info</title><g fill="none" fill-rule="evenodd"><path d="M0 0h16v16H0z"/><g fill="#19B6EE"><path d="M8 0C3.6 0 0 3.6 0 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm0 14.5c-3.6 0-6.5-2.9-6.5-6.5S4.4 1.5 8 1.5s6.5 2.9 6.5 6.5-2.9 6.5-6.5 6.5z"/><path d="M7 10h2v2H7zM7 4h2v5H7z"/></g></g></svg>
1382\ No newline at end of file
1383
1384=== added file 'src/maasserver/static/assets/images/icons/logical-volume.svg.OTHER'
1385--- src/maasserver/static/assets/images/icons/logical-volume.svg.OTHER 1970-01-01 00:00:00 +0000
1386+++ src/maasserver/static/assets/images/icons/logical-volume.svg.OTHER 2017-04-25 09:34:40 +0000
1387@@ -0,0 +1,1 @@
1388+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 4.2333398 4.2333403"><path style="marker:none" color="#000" overflow="visible" opacity=".12" fill="none" d="M4.233 4.233V0H0v4.233z"/><path style="marker:none" d="M3.175 2.381v.794h-.794v.265h.794v.793h.265V3.44h.793v-.265H3.44v-.794zM2.381 0v1.852h1.852V0zm.265.265h1.323v1.323H2.646zM0 0v1.852h1.852V0zm.265.265h1.323v1.323H.264zM0 2.381v1.852h1.852V2.381zm.265.265h1.323v1.323H.264z" color="#000" overflow="visible" fill="gray"/></svg>
1389\ No newline at end of file
1390
1391=== added file 'src/maasserver/static/assets/images/icons/magnifying_glass.svg.OTHER'
1392--- src/maasserver/static/assets/images/icons/magnifying_glass.svg.OTHER 1970-01-01 00:00:00 +0000
1393+++ src/maasserver/static/assets/images/icons/magnifying_glass.svg.OTHER 2017-04-25 09:34:40 +0000
1394@@ -0,0 +1,1 @@
1395+<svg width="22" height="22" viewBox="0 0 22 22" xmlns="http://www.w3.org/2000/svg"><title>magnifying_glass</title><g fill="none" fill-rule="evenodd"><path fill="gray" d="M16.655 14.67l-1.995 1.997L19.994 22l1.994-1.997z"/><ellipse stroke="gray" stroke-width="1.5" cx="9.5" cy="9.5" rx="8.708" ry="8.708"/></g></svg>
1396\ No newline at end of file
1397
1398=== added file 'src/maasserver/static/assets/images/icons/mount.svg.OTHER'
1399--- src/maasserver/static/assets/images/icons/mount.svg.OTHER 1970-01-01 00:00:00 +0000
1400+++ src/maasserver/static/assets/images/icons/mount.svg.OTHER 2017-04-25 09:34:40 +0000
1401@@ -0,0 +1,1 @@
1402+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 4.2333493 4.2333317"><path style="marker:none" color="#000" overflow="visible" opacity=".12" fill="none" d="M4.233 4.233V0H0v4.233z"/><path d="M0 .265v.793h4.233V.265zm3.44.264h.529v.265h-.53zM3.175 2.117v.793h-.794v.265h.794v.794h.265v-.794h.793V2.91H3.44v-.793z" style="marker:none" color="#000" overflow="visible" fill="gray"/></svg>
1403\ No newline at end of file
1404
1405=== added file 'src/maasserver/static/assets/images/icons/partition.svg.OTHER'
1406--- src/maasserver/static/assets/images/icons/partition.svg.OTHER 1970-01-01 00:00:00 +0000
1407+++ src/maasserver/static/assets/images/icons/partition.svg.OTHER 2017-04-25 09:34:40 +0000
1408@@ -0,0 +1,1 @@
1409+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 4.2333398 4.2333315"><path style="marker:none" color="#000" overflow="visible" opacity=".12" fill="none" d="M4.233 4.233V0H0v4.233z"/><path d="M0 .794V3.44h1.852v-.265H.265V1.058h1.587V.794zM3.175 1.323v.794h-.794v.264h.794v.794h.265v-.794h.793v-.264H3.44v-.794zM1.852.264h.265v.53h-.265z" style="marker:none" color="#000" overflow="visible" fill="gray"/><path style="marker:none" color="#000" overflow="visible" fill="gray" d="M1.852 1.058h.265v.53h-.265zM1.852 1.852h.265v.53h-.265zM1.852 2.645h.265v.53h-.265zM1.852 3.44h.265v.528h-.265z"/></svg>
1410\ No newline at end of file
1411
1412=== added file 'src/maasserver/static/assets/images/icons/power-error.svg.OTHER'
1413--- src/maasserver/static/assets/images/icons/power-error.svg.OTHER 1970-01-01 00:00:00 +0000
1414+++ src/maasserver/static/assets/images/icons/power-error.svg.OTHER 2017-04-25 09:34:40 +0000
1415@@ -0,0 +1,1 @@
1416+<svg width="14" height="15" viewBox="0 0 14 15" xmlns="http://www.w3.org/2000/svg"><title>power-error</title><path d="M11.04 2.323l-.324 2.268a5.017 5.017 0 0 1 1.352 3.426c0 2.787-2.274 5.056-5.068 5.056-2.794 0-5.067-2.269-5.067-5.056a5.02 5.02 0 0 1 1.351-3.426L2.96 2.323A6.935 6.935 0 0 0 0 8.017C0 11.867 3.14 15 7 15s7-3.132 7-6.983c0-2.283-1.1-4.382-2.96-5.694zM6 0h2v7H6V0z" fill="#DB3832" fill-rule="evenodd"/></svg>
1417\ No newline at end of file
1418
1419=== added file 'src/maasserver/static/assets/images/icons/power-off.svg.OTHER'
1420--- src/maasserver/static/assets/images/icons/power-off.svg.OTHER 1970-01-01 00:00:00 +0000
1421+++ src/maasserver/static/assets/images/icons/power-off.svg.OTHER 2017-04-25 09:34:40 +0000
1422@@ -0,0 +1,1 @@
1423+<svg width="14" height="15" viewBox="0 0 14 15" xmlns="http://www.w3.org/2000/svg"><title>power-off</title><path d="M11.04 2.323l-.324 2.268a5.017 5.017 0 0 1 1.352 3.426c0 2.787-2.274 5.056-5.068 5.056-2.794 0-5.067-2.269-5.067-5.056a5.02 5.02 0 0 1 1.351-3.426L2.96 2.323A6.935 6.935 0 0 0 0 8.017C0 11.867 3.14 15 7 15s7-3.132 7-6.983c0-2.283-1.1-4.382-2.96-5.694zM6 0h2v7H6V0z" fill="#D2D2D2" fill-rule="evenodd"/></svg>
1424\ No newline at end of file
1425
1426=== added file 'src/maasserver/static/assets/images/icons/power-on.svg.OTHER'
1427--- src/maasserver/static/assets/images/icons/power-on.svg.OTHER 1970-01-01 00:00:00 +0000
1428+++ src/maasserver/static/assets/images/icons/power-on.svg.OTHER 2017-04-25 09:34:40 +0000
1429@@ -0,0 +1,1 @@
1430+<svg width="14" height="15" viewBox="0 0 14 15" xmlns="http://www.w3.org/2000/svg"><title>power-on</title><path d="M11.04 2.323l-.324 2.268a5.017 5.017 0 0 1 1.352 3.426c0 2.787-2.274 5.056-5.068 5.056-2.794 0-5.067-2.269-5.067-5.056a5.02 5.02 0 0 1 1.351-3.426L2.96 2.323A6.935 6.935 0 0 0 0 8.017C0 11.867 3.14 15 7 15s7-3.132 7-6.983c0-2.283-1.1-4.382-2.96-5.694zM6 0h2v7H6V0z" fill="#38B44A" fill-rule="evenodd"/></svg>
1431\ No newline at end of file
1432
1433=== added file 'src/maasserver/static/assets/images/icons/remove.svg.OTHER'
1434--- src/maasserver/static/assets/images/icons/remove.svg.OTHER 1970-01-01 00:00:00 +0000
1435+++ src/maasserver/static/assets/images/icons/remove.svg.OTHER 2017-04-25 09:34:40 +0000
1436@@ -0,0 +1,1 @@
1437+<svg width="18" height="18" viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg"><title>remove</title><g fill="gray" fill-rule="evenodd"><path d="M16.36 0L18 1.64 1.64 18 0 16.36z"/><path d="M18 16.36L16.36 18 0 1.64 1.64 0z"/></g></svg>
1438\ No newline at end of file
1439
1440=== added file 'src/maasserver/static/assets/images/icons/settings.svg.OTHER'
1441--- src/maasserver/static/assets/images/icons/settings.svg.OTHER 1970-01-01 00:00:00 +0000
1442+++ src/maasserver/static/assets/images/icons/settings.svg.OTHER 2017-04-25 09:34:40 +0000
1443@@ -0,0 +1,1 @@
1444+<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96" viewBox="0 0 96 96.000001"><g color="#000"><path style="marker:none" overflow="visible" fill="none" d="M96 0v96H0V0z"/><path style="line-height:normal;font-variant-ligatures:none;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;block-progression:tb;shape-padding:0;isolation:auto;mix-blend-mode:normal;marker:none" d="M79.197 66.033c9.916-17.191 3.984-39.246-13.223-49.19-17.207-9.944-39.253-4.057-49.17 13.134C6.89 47.168 12.82 69.222 30.027 79.166c17.207 9.944 39.255 4.058 49.17-13.133zm-3.465-2.002c-8.834 15.316-28.37 20.535-43.708 11.67-15.338-8.863-20.59-28.407-11.756-43.723 8.834-15.316 28.37-20.535 43.708-11.671 15.338 8.864 20.59 28.408 11.756 43.724z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible" fill="gray"/><path style="marker:none" d="M54.902 5.582L41.098 7.645v7.097a34.033 33.971 43.146 0 1 13.804.028V5.582zm-28.246 6.244L16.14 20.768l5.181 6.175a34.033 33.971 43.146 0 1 10.58-8.867l-5.244-6.25zm42.631.067L64.08 18.1a34.033 33.971 43.146 0 1 .895.474 34.033 33.971 43.146 0 1 9.673 8.406l5.272-6.28-10.633-8.807zM8.398 34.008l-2.31 13.611 7.947 1.402a34.033 33.971 43.146 0 1 2.387-13.597l-8.024-1.416zm79.118.015l-7.987 1.409a34.033 33.971 43.146 0 1 2.432 13.588L90 47.604l-2.484-13.58zM15.758 58.645L8.67 62.738h-.002l6.98 11.91 7.018-4.05a34.033 33.971 43.146 0 1-6.908-11.953zm64.512.015a34.033 33.971 43.146 0 1-2.805 6.371 34.033 33.971 43.146 0 1-4.059 5.608l7.022 4.054 6.826-12-6.984-4.033zM30.148 76.867l-2.804 7.703 13.004 4.639 2.757-7.58a34.033 33.971 43.146 0 1-12.08-4.195 34.033 33.971 43.146 0 1-.877-.567zm35.733.08a34.033 33.971 43.146 0 1-12.979 4.707l2.782 7.639 12.941-4.807-2.744-7.539z" overflow="visible" fill="gray"/><path style="line-height:normal;font-variant-ligatures:none;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;block-progression:tb;shape-padding:0;isolation:auto;mix-blend-mode:normal;marker:none" d="M68.805 60.027c6.61-11.46 2.652-26.178-8.816-32.806-11.47-6.628-26.185-2.7-32.795 8.76-6.61 11.459-2.651 26.18 8.817 32.808 11.47 6.628 26.184 2.697 32.794-8.762zm-3.463-2.001C59.814 67.61 47.61 70.87 38.01 65.324c-9.6-5.548-12.88-17.757-7.351-27.341 5.528-9.585 17.732-12.846 27.332-7.298 9.6 5.547 12.88 17.757 7.351 27.34z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible" fill="gray"/></g></svg>
1445\ No newline at end of file
1446
1447=== added file 'src/maasserver/static/assets/images/icons/success-mono.svg.OTHER'
1448--- src/maasserver/static/assets/images/icons/success-mono.svg.OTHER 1970-01-01 00:00:00 +0000
1449+++ src/maasserver/static/assets/images/icons/success-mono.svg.OTHER 2017-04-25 09:34:40 +0000
1450@@ -0,0 +1,1 @@
1451+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16.000017 16.000017"><g color="#000"><path style="marker:none" overflow="visible" fill="none" d="M0 0h16v16H0z"/><path style="marker:none" d="M8 0C3.59 0 0 3.59 0 8s3.59 8 8 8 8-3.59 8-8-3.59-8-8-8zm3.8 4.924l.7.789L7 11.5 3.385 7.697l.84-.949L7 9.128l4.734-4.148.067-.056z" overflow="visible" fill="#fff"/></g></svg>
1452\ No newline at end of file
1453
1454=== added file 'src/maasserver/static/assets/images/icons/success.svg.OTHER'
1455--- src/maasserver/static/assets/images/icons/success.svg.OTHER 1970-01-01 00:00:00 +0000
1456+++ src/maasserver/static/assets/images/icons/success.svg.OTHER 2017-04-25 09:34:40 +0000
1457@@ -0,0 +1,1 @@
1458+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16.000017 16.000017"><g transform="translate(-952 -156.362)"><path style="marker:none" color="#000" overflow="visible" fill="none" d="M952 156.362h16v16h-16z"/><circle r="7.25" cy="164.362" cx="960" style="marker:none" color="#000" overflow="visible" fill="#3eb34f" stroke="#3eb34f" stroke-width="1.5" stroke-dashoffset=".8"/><path style="line-height:125%;-inkscape-font-specification:Ubuntu;text-align:center" d="M963.8 161.286l-.066.057-4.734 4.148-2.776-2.381-.839.948 3.615 3.804 5.5-5.787-.7-.79z" font-weight="400" font-size="15" font-family="Ubuntu" letter-spacing="0" word-spacing="0" text-anchor="middle" fill="#fff"/></g></svg>
1459\ No newline at end of file
1460
1461=== added file 'src/maasserver/static/assets/images/icons/success_colour_black.svg.OTHER'
1462--- src/maasserver/static/assets/images/icons/success_colour_black.svg.OTHER 1970-01-01 00:00:00 +0000
1463+++ src/maasserver/static/assets/images/icons/success_colour_black.svg.OTHER 2017-04-25 09:34:40 +0000
1464@@ -0,0 +1,1 @@
1465+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16.000017 16.000017"><g transform="translate(-952 -156.362)"><path style="marker:none" color="#000" overflow="visible" fill="none" d="M952 156.362h16v16h-16z"/><circle r="7.25" cy="164.362" cx="960" style="marker:none" color="#000" overflow="visible" fill="#3eb34f" stroke="#3eb34f" stroke-width="1.5" stroke-dashoffset=".8"/><path style="line-height:125%;-inkscape-font-specification:Ubuntu;text-align:center" d="M963.8 161.286l-.066.057-4.734 4.148-2.776-2.381-.839.948 3.615 3.804 5.5-5.787-.7-.79z" font-weight="400" font-size="15" font-family="Ubuntu" letter-spacing="0" word-spacing="0" text-anchor="middle"/></g></svg>
1466\ No newline at end of file
1467
1468=== added file 'src/maasserver/static/assets/images/icons/success_colour_white.svg.OTHER'
1469--- src/maasserver/static/assets/images/icons/success_colour_white.svg.OTHER 1970-01-01 00:00:00 +0000
1470+++ src/maasserver/static/assets/images/icons/success_colour_white.svg.OTHER 2017-04-25 09:34:40 +0000
1471@@ -0,0 +1,1 @@
1472+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16.000017 16.000017"><g transform="translate(-952 -156.362)"><path style="marker:none" color="#000" overflow="visible" fill="none" d="M952 156.362h16v16h-16z"/><circle r="7.25" cy="164.362" cx="960" style="marker:none" color="#000" overflow="visible" fill="#3eb34f" stroke="#3eb34f" stroke-width="1.5" stroke-dashoffset=".8"/><path style="line-height:125%;-inkscape-font-specification:Ubuntu;text-align:center" d="M963.8 161.286l-.066.057-4.734 4.148-2.776-2.381-.839.948 3.615 3.804 5.5-5.787-.7-.79z" font-weight="400" font-size="15" font-family="Ubuntu" letter-spacing="0" word-spacing="0" text-anchor="middle" fill="#fff"/></g></svg>
1473\ No newline at end of file
1474
1475=== added file 'src/maasserver/static/assets/images/icons/success_mono.svg.OTHER'
1476--- src/maasserver/static/assets/images/icons/success_mono.svg.OTHER 1970-01-01 00:00:00 +0000
1477+++ src/maasserver/static/assets/images/icons/success_mono.svg.OTHER 2017-04-25 09:34:40 +0000
1478@@ -0,0 +1,1 @@
1479+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16.000017 16.000017"><g color="#000"><path style="marker:none" overflow="visible" fill="none" d="M0 0h16v16H0z"/><path style="marker:none" d="M8 0C3.59 0 0 3.59 0 8s3.59 8 8 8 8-3.59 8-8-3.59-8-8-8zm3.8 4.924l.7.789L7 11.5 3.385 7.697l.84-.949L7 9.128l4.734-4.148.067-.056z" overflow="visible" fill="#fff"/></g></svg>
1480\ No newline at end of file
1481
1482=== added file 'src/maasserver/static/assets/images/icons/sync.svg.OTHER'
1483--- src/maasserver/static/assets/images/icons/sync.svg.OTHER 1970-01-01 00:00:00 +0000
1484+++ src/maasserver/static/assets/images/icons/sync.svg.OTHER 2017-04-25 09:34:40 +0000
1485@@ -0,0 +1,1 @@
1486+<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96" viewBox="0 0 96 96.000001"><g color="#000"><path style="marker:none" overflow="visible" fill="none" d="M96 0v96H0V0z"/><path d="M84.93 14.958L67.965 31.934a177.473 177.473 0 0 0 11.842 3.925A211.649 211.649 0 0 0 92 39c-.936-3.985-1.999-8.035-3.187-12.147a206.82 206.82 0 0 0-3.882-11.894zM11.035 81L28 64.024A177.472 177.472 0 0 0 16.158 60.1a211.647 211.647 0 0 0-12.193-3.141c.936 3.985 1.999 8.035 3.187 12.147 1.217 4.136 2.511 8.1 3.882 11.894z" style="marker:none" overflow="visible" fill="gray"/><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;isolation:auto;mix-blend-mode:normal;marker:none" d="M48 8C25.932 8 8 25.932 8 48c0 .652.02 1.3.05 1.945 1.356.336 2.717.686 4.083 1.053A36.54 36.54 0 0 1 12 48c0-19.906 16.094-36 36-36 13.005 0 24.38 6.872 30.705 17.186l2.86-2.862C74.444 15.31 62.076 8 48 8zm35.863 36.969c.084 1 .137 2.009.137 3.031 0 19.906-16.094 36-36 36-13.025 0-24.416-6.892-30.736-17.232l-2.88 2.88C21.512 80.682 33.908 88 48 88c22.068 0 40-17.932 40-40a2 2 0 0 0-.041-.406 40.381 40.381 0 0 0-.057-1.584 211.753 211.753 0 0 1-4.039-1.041z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible" fill="gray"/></g></svg>
1487\ No newline at end of file
1488
1489=== added file 'src/maasserver/static/assets/images/icons/system-shutdown.svg.OTHER'
1490--- src/maasserver/static/assets/images/icons/system-shutdown.svg.OTHER 1970-01-01 00:00:00 +0000
1491+++ src/maasserver/static/assets/images/icons/system-shutdown.svg.OTHER 2017-04-25 09:34:40 +0000
1492@@ -0,0 +1,1 @@
1493+<svg xmlns="http://www.w3.org/2000/svg" width="96" height="96" viewBox="0 0 96 96.000001"><g color="#000"><path style="marker:none" overflow="visible" fill="none" d="M96 0v96H0V0z"/><path d="M46 6l4-1v35h-4z" style="marker:none" overflow="visible" fill="gray"/><path style="line-height:normal;font-variant-ligatures:none;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;block-progression:tb;shape-padding:0;isolation:auto;mix-blend-mode:normal;marker:none" d="M30.006 16.798c-14.099 8.144-20.983 24.771-16.77 40.504C17.45 73.034 31.72 83.989 48 83.989s30.55-10.955 34.763-26.687c4.214-15.733-2.669-32.36-16.767-40.504l-2.002 3.463C76.54 27.509 82.65 42.263 78.9 56.266 75.15 70.27 62.488 79.99 48 79.99S20.85 70.27 17.1 56.266c-3.75-14.003 2.357-28.757 14.905-36.005l-2-3.463z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible" fill="gray"/></g></svg>
1494\ No newline at end of file
1495
1496=== added file 'src/maasserver/static/assets/images/icons/tags.svg.OTHER'
1497--- src/maasserver/static/assets/images/icons/tags.svg.OTHER 1970-01-01 00:00:00 +0000
1498+++ src/maasserver/static/assets/images/icons/tags.svg.OTHER 2017-04-25 09:34:40 +0000
1499@@ -0,0 +1,1 @@
1500+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 15.999999"><path opacity=".212" fill="none" d="M0 0h16v16H0z"/><path style="marker:none" d="M8.691 0L.775 7.918c-1.218 1.218-.913 1.522.305 2.74l2.13 2.131 2.132 2.13c1.218 1.219 1.522 1.524 2.74.306L16 7.309V.914c0-.304-.076-.533-.228-.686C15.619.076 15.39 0 15.086 0zm.418 1.008h5.883V6.89l-7.525 7.523c-.795.839-1.472-.388-2.074-.87a46.125 46.125 0 0 0-1.47-1.468 45.917 45.917 0 0 0-1.468-1.469c-.481-.602-1.708-1.28-.87-2.074L9.11 1.008z" color="#000" overflow="visible" fill="gray"/><path style="marker:none" d="M12.518 2.25a1.25 1.25 0 0 1 .867.365 1.25 1.25 0 0 1 0 1.77 1.25 1.25 0 0 1-1.77 0 1.25 1.25 0 0 1 0-1.77 1.25 1.25 0 0 1 .903-.365z" color="#000" overflow="visible" fill="gray"/></svg>
1501\ No newline at end of file
1502
1503=== added file 'src/maasserver/static/assets/images/icons/tick.svg.OTHER'
1504--- src/maasserver/static/assets/images/icons/tick.svg.OTHER 1970-01-01 00:00:00 +0000
1505+++ src/maasserver/static/assets/images/icons/tick.svg.OTHER 2017-04-25 09:34:40 +0000
1506@@ -0,0 +1,1 @@
1507+<svg xmlns="http://www.w3.org/2000/svg" height="16" width="22" viewBox="0 0 22 16"><title>textfield-saved</title><path d="M20.04.343l-.154.136-11.138 9.756-6.53-5.601L.246 6.866l8.505 8.948L21.687 2.2 20.04.343z" fill="#38B44A" fill-rule="evenodd"/></svg>
1508\ No newline at end of file
1509
1510=== added file 'src/maasserver/static/assets/images/icons/tooltip.svg.OTHER'
1511--- src/maasserver/static/assets/images/icons/tooltip.svg.OTHER 1970-01-01 00:00:00 +0000
1512+++ src/maasserver/static/assets/images/icons/tooltip.svg.OTHER 2017-04-25 09:34:40 +0000
1513@@ -0,0 +1,1 @@
1514+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 15.999999"><path style="marker:none" color="#000" overflow="visible" fill="none" d="M0 0h16v16H0z"/><path style="marker:none" d="M1.066 0C.476 0 0 .475 0 1.066v13.868C0 15.524.475 16 1.066 16h13.868c.59 0 1.066-.475 1.066-1.066V1.066C16 .476 15.525 0 14.934 0H1.066zM1 1h14v14H1V1z" color="#000" overflow="visible" fill="gray"/><path style="line-height:125%;-inkscape-font-specification:'Ubuntu Medium';text-align:center" d="M8.154 2.676c-.497 0-.985.064-1.463.193-.467.12-.884.283-1.252.492l.506 1.387a4.294 4.294 0 0 1 1-.402c.319-.09.652-.133 1-.133.448 0 .782.11 1 .328.229.209.342.476.342.805 0 .238-.055.457-.164.656-.11.199-.249.393-.418.582-.169.189-.352.377-.55.566a6.377 6.377 0 0 0-.538.612 3.22 3.22 0 0 0-.418.716c-.11.26-.164.553-.164.881 0 .1.006.21.016.328.01.11.023.214.043.313h1.552a1.09 1.09 0 0 1-.015-.18v-.177c0-.299.06-.568.18-.807a3.43 3.43 0 0 1 .476-.67c.19-.219.393-.428.611-.627.22-.209.423-.427.612-.656.189-.229.343-.478.463-.746.129-.269.195-.572.195-.91 0-.279-.045-.567-.135-.866a2.095 2.095 0 0 0-.478-.82c-.229-.249-.536-.452-.924-.611-.388-.17-.88-.254-1.477-.254zM8 11.006a.995.995 0 0 0-.713.287.942.942 0 0 0-.287.713c0 .292.095.53.287.713.2.183.438.275.713.275a.992.992 0 0 0 .713-.275.942.942 0 0 0 .287-.713.943.943 0 0 0-.287-.713.968.968 0 0 0-.713-.287z" font-weight="500" font-family="Ubuntu" letter-spacing="0" word-spacing="0" text-anchor="middle" fill="gray"/></svg>
1515\ No newline at end of file
1516
1517=== added file 'src/maasserver/static/assets/images/icons/unmount.svg.OTHER'
1518--- src/maasserver/static/assets/images/icons/unmount.svg.OTHER 1970-01-01 00:00:00 +0000
1519+++ src/maasserver/static/assets/images/icons/unmount.svg.OTHER 2017-04-25 09:34:40 +0000
1520@@ -0,0 +1,1 @@
1521+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 4.2333493 4.2333317"><path style="marker:none" color="#000" overflow="visible" opacity=".12" fill="none" d="M4.233 4.233V0H0v4.233z"/><path d="M0 .265v.793h4.233V.265zm3.44.264h.529v.265h-.53zM2.381 2.91v.265h1.852V2.91z" style="marker:none" color="#000" overflow="visible" fill="gray"/></svg>
1522\ No newline at end of file
1523
1524=== added file 'src/maasserver/static/assets/images/icons/warning-mono.svg.OTHER'
1525--- src/maasserver/static/assets/images/icons/warning-mono.svg.OTHER 1970-01-01 00:00:00 +0000
1526+++ src/maasserver/static/assets/images/icons/warning-mono.svg.OTHER 2017-04-25 09:34:40 +0000
1527@@ -0,0 +1,1 @@
1528+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16.000017 16.000017"><g color="#000"><path style="marker:none" overflow="visible" fill="none" d="M0 0h16v16H0z"/><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;isolation:auto;mix-blend-mode:normal;marker:none" d="M8.045-.023a.967 1.034 0 0 0-.098.002.967 1.034 0 0 0-.785.513L.154 13.471a.967 1.034 0 0 0 .836 1.552h14.02a.967 1.034 0 0 0 .836-1.552L8.838.492a.967 1.034 0 0 0-.793-.515zM7 5h2v5H7V5zm0 6h2v2H7v-2z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible" fill="#fff"/></g></svg>
1529\ No newline at end of file
1530
1531=== added file 'src/maasserver/static/assets/images/icons/warning.svg.OTHER'
1532--- src/maasserver/static/assets/images/icons/warning.svg.OTHER 1970-01-01 00:00:00 +0000
1533+++ src/maasserver/static/assets/images/icons/warning.svg.OTHER 2017-04-25 09:34:40 +0000
1534@@ -0,0 +1,1 @@
1535+<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><title>warning</title><g fill="none" fill-rule="evenodd"><path d="M0 0h16v16H0z"/><circle stroke="#F4B457" stroke-width="1.5" cx="8" cy="8" r="7.25"/><path d="M7 4v5h2V4H7zm0 6v2h2v-2H7z" fill="#F4B457"/></g></svg>
1536\ No newline at end of file
1537
1538=== added file 'src/maasserver/static/assets/images/icons/warning_colour_black.svg.OTHER'
1539--- src/maasserver/static/assets/images/icons/warning_colour_black.svg.OTHER 1970-01-01 00:00:00 +0000
1540+++ src/maasserver/static/assets/images/icons/warning_colour_black.svg.OTHER 2017-04-25 09:34:40 +0000
1541@@ -0,0 +1,1 @@
1542+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16.000017 16.000017"><g color="#000"><path style="marker:none" overflow="visible" fill="none" d="M0 0h16v16H0z"/><path style="marker:none" d="M963.075 207.025h-6.15L960 201.7z" transform="matrix(2.27997 0 0 2.43698 -2180.772 -490.526)" overflow="visible" fill="#e95420" stroke="#e95420" stroke-width=".848" stroke-linejoin="round"/><path style="marker:none" d="M7 5v5h2V5H7zm0 6v2h2v-2H7z" overflow="visible"/></g></svg>
1543\ No newline at end of file
1544
1545=== added file 'src/maasserver/static/assets/images/icons/warning_colour_white.svg.OTHER'
1546--- src/maasserver/static/assets/images/icons/warning_colour_white.svg.OTHER 1970-01-01 00:00:00 +0000
1547+++ src/maasserver/static/assets/images/icons/warning_colour_white.svg.OTHER 2017-04-25 09:34:40 +0000
1548@@ -0,0 +1,1 @@
1549+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16.000017 16.000017"><g color="#000"><path style="marker:none" overflow="visible" fill="none" d="M0 0h16v16H0z"/><path style="marker:none" d="M963.075 207.025h-6.15L960 201.7z" transform="matrix(2.27997 0 0 2.43698 -2180.772 -490.526)" overflow="visible" fill="#e95420" stroke="#e95420" stroke-width=".848" stroke-linejoin="round"/><path style="marker:none" overflow="visible" fill="#fff" d="M7 5h2v5H7zM7 11h2v2H7z"/></g></svg>
1550\ No newline at end of file
1551
1552=== added file 'src/maasserver/static/assets/images/icons/warning_mono.svg.OTHER'
1553--- src/maasserver/static/assets/images/icons/warning_mono.svg.OTHER 1970-01-01 00:00:00 +0000
1554+++ src/maasserver/static/assets/images/icons/warning_mono.svg.OTHER 2017-04-25 09:34:40 +0000
1555@@ -0,0 +1,1 @@
1556+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16.000017 16.000017"><g color="#000"><path style="marker:none" overflow="visible" fill="none" d="M0 0h16v16H0z"/><path style="line-height:normal;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;text-orientation:mixed;shape-padding:0;isolation:auto;mix-blend-mode:normal;marker:none" d="M8.045-.023a.967 1.034 0 0 0-.098.002.967 1.034 0 0 0-.785.513L.154 13.471a.967 1.034 0 0 0 .836 1.552h14.02a.967 1.034 0 0 0 .836-1.552L8.838.492a.967 1.034 0 0 0-.793-.515zM7 5h2v5H7V5zm0 6h2v2H7v-2z" font-weight="400" font-family="sans-serif" white-space="normal" overflow="visible" fill="#fff"/></g></svg>
1557\ No newline at end of file
1558
1559=== added file 'src/maasserver/static/css/build.css'
1560--- src/maasserver/static/css/build.css 1970-01-01 00:00:00 +0000
1561+++ src/maasserver/static/css/build.css 2017-04-25 09:34:40 +0000
1562@@ -0,0 +1,1 @@
1563+*{font-smoothing:subpixel-antialiased;box-sizing:border-box}button,input[type='button'],input[type='reset'],input[type='submit'],.button--primary,.button--secondary,.button--neutral,.button--inline-neutral,.button--positive,.button--inline-positive,.button--destructive,.button--inline-destructive,.button--base,.button--inline-base{font-smoothing:subpixel-antialiased;font-size:1em;display:inline-block;width:100%;margin:0;padding:11px 24px;text-align:center;text-decoration:none;border:0;border-radius:2px;outline:none;font-weight:300;cursor:pointer}button:hover,input[type='button']:hover,input[type='reset']:hover,input[type='submit']:hover,.button--primary:hover,.button--secondary:hover,.button--neutral:hover,.button--inline-neutral:hover,.button--positive:hover,.button--inline-positive:hover,.button--destructive:hover,.button--inline-destructive:hover,.button--base:hover,.button--inline-base:hover{text-decoration:none}@media only screen and (min-width: 768px){button,input[type='button'],input[type='reset'],input[type='submit'],.button--primary,.button--secondary,.button--neutral,.button--inline-neutral,.button--positive,.button--inline-positive,.button--destructive,.button--inline-destructive,.button--base,.button--inline-base{width:auto}}.clearfix{display:block}.clearfix:after{clear:both;content:'\0020';display:block;height:0;overflow:hidden;visibility:hidden}textarea,input[type='text'],input[type='number'],input[type='search'],input[type='password'],input[type='email'],input[type='url'],input[type='tel'],select{-webkit-appearance:textfield;border-radius:2px;border:1px solid #cdcdcd;box-shadow:inset 0 1px 2px rgba(0,0,0,0.12);font-size:16px;margin:0;outline:none;padding:.6956522em .869565em;vertical-align:baseline;font-weight:300}textarea:active,input[type='text']:active,input[type='number']:active,input[type='search']:active,input[type='password']:active,input[type='email']:active,input[type='url']:active,input[type='tel']:active,select:active,textarea:focus,input[type='text']:focus,input[type='number']:focus,input[type='search']:focus,input[type='password']:focus,input[type='email']:focus,input[type='url']:focus,input[type='tel']:focus,select:focus{border-color:#888;outline:none}textarea::placeholder,input[type='text']::placeholder,input[type='number']::placeholder,input[type='search']::placeholder,input[type='password']::placeholder,input[type='email']::placeholder,input[type='url']::placeholder,input[type='tel']::placeholder,select::placeholder{color:contrast-friendly-search-color(#f7f7f7)}textarea[disabled="disabled"],input[disabled="disabled"][type='text'],input[disabled="disabled"][type='number'],input[disabled="disabled"][type='search'],input[disabled="disabled"][type='password'],input[disabled="disabled"][type='email'],input[disabled="disabled"][type='url'],input[disabled="disabled"][type='tel'],select[disabled="disabled"]{opacity:.5}input[type='checkbox'],input[type='radio']{border-radius:2px;border:1px solid #cdcdcd;box-shadow:inset 0 1px 2px rgba(0,0,0,0.12);height:14px;padding:0;vertical-align:middle;width:14px}.inner-wrapper{margin:0 auto;max-width:1030px}[class*='-col'].last-col,[class*='-col'] [class*='-col'].last-col{margin-right:0}.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col{clear:none;margin-bottom:20px;margin-right:0;padding:0;display:inline-block;position:relative;width:100%}@media only screen and (min-width: 768px){.one-col,.two-col,.three-col,.four-col,.five-col,.six-col,.seven-col,.eight-col,.nine-col,.ten-col,.eleven-col,.twelve-col{float:left}}.list-ticks,.list{list-style:none;margin-left:0}.list-ticks li,.list li{border-bottom:1px dotted #888;margin-bottom:0;padding:10px 0}.list-ticks li:last-of-type,.list li:last-of-type,.list-ticks .last-item,.list .last-item{border:0;margin-bottom:0;padding-bottom:0}.list-ticks li{background-repeat:no-repeat;background-position:0 1em;padding-left:25px}.box{background:#fff;border:1px solid #cdcdcd;padding:1.25em 20px}@media only screen and (min-width: 768px){.equal-height,.equal-height--vertical-divider{display:flex;flex-wrap:wrap;flex-direction:row;width:100%}.equal-height .equal-height__item,.equal-height--vertical-divider .equal-height__item{display:flex;flex:auto;flex-direction:column}}button,input[type='button'],input[type='reset'],input[type='submit'],.button--primary,.button--secondary,.button--neutral,.button--inline-neutral,.button--positive,.button--inline-positive,.button--destructive,.button--inline-destructive,.button--base,.button--inline-base{font-size:1em;box-sizing:border-box;width:100%;margin:0;padding:11px 24px;text-align:center;text-decoration:none;border-radius:2px;outline:none;font-weight:300;cursor:pointer;line-height:1em}button:disabled,input[type='button']:disabled,input[type='reset']:disabled,input[type='submit']:disabled,.button--primary:disabled,.button--secondary:disabled,.button--neutral:disabled,.button--inline-neutral:disabled,.button--positive:disabled,.button--inline-positive:disabled,.button--destructive:disabled,.button--inline-destructive:disabled,.button--base:disabled,.button--inline-base:disabled,button.button--disabled,input.button--disabled[type='button'],input.button--disabled[type='reset'],input.button--disabled[type='submit'],.button--disabled.button--primary,.button--disabled.button--secondary,.button--disabled.button--neutral,.button--disabled.button--inline-neutral,.button--disabled.button--positive,.button--disabled.button--inline-positive,.button--disabled.button--destructive,.button--disabled.button--inline-destructive,.button--disabled.button--base,.button--disabled.button--inline-base{opacity:.5;cursor:default}button,input[type='button'],input[type='reset'],input[type='submit'],.button--primary,.button--secondary,.button--neutral,.button--inline-neutral,.button--positive,.button--inline-positive,.button--destructive,.button--inline-destructive,.button--base,.button--inline-base{line-height:20px;white-space:nowrap;vertical-align:middle;touch-action:manipulation;cursor:pointer;user-select:none;padding:8px 14px;height:36px;box-sizing:border-box}button[disabled],input[disabled][type='button'],input[disabled][type='reset'],input[disabled][type='submit'],[disabled].button--primary,[disabled].button--secondary,[disabled].button--neutral,[disabled].button--inline-neutral,[disabled].button--positive,[disabled].button--inline-positive,[disabled].button--destructive,[disabled].button--inline-destructive,[disabled].button--base,[disabled].button--inline-base,button.button--disabled,input.button--disabled[type='button'],input.button--disabled[type='reset'],input.button--disabled[type='submit'],.button--disabled.button--primary,.button--disabled.button--secondary,.button--disabled.button--neutral,.button--disabled.button--inline-neutral,.button--disabled.button--positive,.button--disabled.button--inline-positive,.button--disabled.button--destructive,.button--disabled.button--inline-destructive,.button--disabled.button--base,.button--disabled.button--inline-base{pointer-events:none;opacity:.5}button.button--inline,input.button--inline[type='button'],input.button--inline[type='reset'],input.button--inline[type='submit'],.button--inline.button--primary,.button--inline.button--secondary,.button--inline.button--neutral,.button--inline.button--inline-neutral,.button--inline.button--positive,.button--inline.button--inline-positive,.button--inline.button--destructive,.button--inline.button--inline-destructive,.button--inline.button--base,.button--inline.button--inline-base{display:inline-block;width:auto}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}audio:not([controls]){display:none}[hidden]{display:none}html{font-size:100%;overflow-y:scroll;text-size-adjust:100%}blockquote,q{quotes:none}legend{border:0}figure{margin:0}abbr,acronym{cursor:help}.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:''}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}ins{background:#fffbeb;text-decoration:none}.left{float:left}.right{float:right}.no-border{border:0}.link-top{font-size:.875em;clear:both;margin-bottom:40px;margin-top:-40px}.link-top a{background:#fff;margin-right:10px;margin-top:-35px;padding:5px;float:right}.caps{text-transform:uppercase}.touch-border,.touch-bottom{float:left}@media only screen and (min-width: 768px){.touch-border,.touch-bottom{margin-bottom:-20px}}@media only screen and (min-width: 1440px){.touch-border,.touch-bottom{margin-bottom:-40px}}.accessibility-aid,.off-left{position:absolute;left:-999em}.external{background-size:.7em .7em;padding-right:.9em;background-image:url("https://assets.ubuntu.com/v1/f24a8aa0-external-link-orange.svg");background-position:100% top;background-repeat:no-repeat}.no-svg .external{background-image:url("https://assets.ubuntu.com/v1/f24a8aa0-external-link-orange.svg")}.text-center,.align-center{text-align:center}.no-margin-bottom{margin-bottom:0}.no-padding-bottom{padding-bottom:0}.pull-bottom-right{float:right;margin-right:-10px}@media only screen and (min-width: 768px){.pull-bottom-right{margin-right:-40px;margin-bottom:-40px}}@media only screen and (min-width: 1440px){.pull-bottom-right{margin-right:-40px;margin-bottom:-60px}}.pull-bottom-left{float:left;margin-left:-10px}@media only screen and (min-width: 768px){.pull-bottom-left{margin-left:-40px;margin-bottom:-40px}}@media only screen and (min-width: 1440px){.pull-bottom-left{margin-left:-40px;margin-bottom:-60px}}@media only screen and (max-width: 767px){.priority-0,.not-for-small{display:none}}@media only screen and (min-width: 768px){.for-mobile,.for-small{display:none}}.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+.video-title{margin-top:20px}.pull-right{float:right;margin-right:-40px}@media only screen and (max-width: 768px){.pull-right{margin-bottom:20px}}.pull-left{margin-left:-40px}.for-tablet,.for-medium{display:none}@media only screen and (min-width: 768px){.for-tablet,.for-medium{display:block}}@media only screen and (min-width: 768px) and (max-width: 1440px){.med-six-col .three-col{width:48.93617%}.med-six-col .three-col:nth-of-type(2n){margin-right:0}}blockquote{margin:0}blockquote>p{font-size:1em;margin:0 0 .4em}blockquote small{font-size:.8125em;line-height:1.4}.pull-quote{text-indent:0}.pull-quote p{font-size:1.5em;line-height:1.3;margin-left:.4em;padding-left:10px;padding-right:10px;text-indent:-.4em}.pull-quote p span{color:#f7f7f7;font-weight:bold;left:-5px;line-height:0;position:relative}.pull-quote p span:last-of-type{left:5px}.pull-quote p cite{display:block;font-size:.75em;font-weight:300;margin:10px 0 0;text-indent:0}@media only screen and (min-width: 768px){.pull-quote p{padding-left:0;padding-right:0;text-indent:-.7em}.pull-quote p span{top:5px;font-size:1.391304348em}.pull-quote p cite{margin-left:0;text-indent:0}}@media only screen and (min-width: 1440px){.pull-quote p span{top:10px}}.row-quote{border-radius:0}.row-quote blockquote{border-radius:4px;margin:0;padding:0}.row-quote blockquote p{color:#333;line-height:1.3;margin-bottom:.75em;padding-left:10px;padding-right:10px;text-indent:0}.row-quote blockquote span{color:#f7f7f7;font-weight:bold;left:-5px;line-height:0;position:relative}.row-quote blockquote span+span{left:5px}.row-quote blockquote cite{color:#333;font-size:.75em;font-style:normal;margin-bottom:0;text-indent:0}@media only screen and (min-width: 768px){.row-quote{text-indent:-.4em}.row-quote blockquote{text-indent:-7px}.row-quote blockquote p{font-size:1.5em;padding-left:0;padding-right:0;text-indent:-.4em}.row-quote blockquote span{top:5px;font-size:1.391304348em}.row-quote blockquote cite{margin-left:0;text-indent:0}}@media only screen and (min-width: 1440px){.row-quote blockquote{padding:0 80px 20px;text-indent:-10px}.row-quote blockquote p span{top:10px}}button,input[type='button'],input[type='reset'],input[type='submit'],.button--primary{color:#fff;background-color:#dd4814}button:hover,input[type='button']:hover,input[type='reset']:hover,input[type='submit']:hover,.button--primary:hover{background-color:#c03f11}.button--secondary{color:#dd4814;background-color:#fff;border:1px solid #cdcdcd}.button--secondary:hover{background-color:#efefef}@media only screen and (min-width: 620px){.nav-secondary{border:1px solid #d2d2d2;border-top:0}}.nav-secondary .breadcrumb{margin-bottom:0;margin-left:0;padding-top:2px;padding-bottom:3px}@media only screen and (min-width: 620px){.nav-secondary .breadcrumb{float:left;margin-left:4px}}.nav-secondary .breadcrumb li{color:#fff;display:inline-block;margin:0;width:100%}@media only screen and (min-width: 620px){.nav-secondary .breadcrumb li{display:inline-block;width:auto}}.nav-secondary .breadcrumb li:first-of-type{border-bottom:1px solid #d2d2d2}@media only screen and (min-width: 620px){.nav-secondary .breadcrumb li:first-of-type{border-bottom:0}}.nav-secondary .breadcrumb li a{color:#888;font-size:1em;display:inline-block;width:100%;margin-right:0;padding:8px 10px;text-decoration:none}@media only screen and (min-width: 620px){.nav-secondary .breadcrumb li a{font-size:.875em}}@media only screen and (min-width: 620px){.nav-secondary .breadcrumb li .breadcrumb-link,.nav-secondary .breadcrumb li .breadcrumb-link--second-level,.nav-secondary .breadcrumb li .active{display:inline-block;float:none;width:auto}}.nav-secondary .breadcrumb li .breadcrumb-link:after,.nav-secondary .breadcrumb li .breadcrumb-link--second-level:after{content:'\203A';display:inline-block;height:5px;margin-left:8px;position:absolute;width:5px}.nav-secondary .second-level-nav,.nav-secondary .third-level-nav{display:none;overflow:hidden;width:100%;margin:0;padding-top:10px;padding-bottom:10px;border-bottom:1px solid #d2d2d2}@media only screen and (min-width: 620px){.nav-secondary .second-level-nav,.nav-secondary .third-level-nav{display:inline;float:none;margin-bottom:0;padding:0;width:auto;border-bottom:0}}.nav-secondary .second-level-nav li,.nav-secondary .third-level-nav li{margin:0}@media only screen and (min-width: 620px){.nav-secondary .second-level-nav li,.nav-secondary .third-level-nav li{float:none;width:auto}}.nav-secondary .second-level-nav li a,.nav-secondary .third-level-nav li a{font-size:.875em;display:block;width:100%;height:100%;padding:10px;color:#333}@media only screen and (max-width: 620px){.nav-secondary .second-level-nav li a.active,.nav-secondary .third-level-nav li a.active{font-weight:500}}@media only screen and (min-width: 620px){.nav-secondary .second-level-nav li a,.nav-secondary .third-level-nav li a{padding:8px 10px 0}.nav-secondary .second-level-nav li a.active,.nav-secondary .third-level-nav li a.active{color:#f7f7f7}}@media only screen and (min-width: 620px){.nav-secondary .second-level-nav li{width:auto}.nav-secondary .second-level-nav li .active,.nav-secondary .second-level-nav li .breadcrumb-link--second-level{color:#888}.nav-secondary .second-level-nav li .third-level-nav li a{color:#333}.nav-secondary .second-level-nav li .third-level-nav li a:hover{color:#f7f7f7}.nav-secondary .second-level-nav li .third-level-nav li .active{color:#f7f7f7;float:none}.nav-secondary .second-level-nav li .third-level-nav li .active:after{content:''}}.third-level-nav li a:hover{color:#f7f7f7}.third-level-nav li .active{color:#f7f7f7;float:none}@media only screen and (max-width: 619px){#breadcrumbs:hover .second-level-nav,#breadcrumbs:hover .third-level-nav,#breadcrumbs:hover .active{border:0;display:block;overflow:visible;float:left;width:100%;position:relative;clear:both}#breadcrumbs:hover li{border:0;float:left}#breadcrumbs:hover .second-level-nav{border-top:1px solid #d2d2d2}#breadcrumbs:hover .second-level-nav li{float:left}#breadcrumbs:hover .third-level-nav{border-bottom:1px solid #d2d2d2;padding-top:0}#breadcrumbs:hover .third-level-nav li{width:50%;display:block;padding-left:10px}}label{cursor:pointer;display:block;margin-bottom:4px}label.has-error{color:#df382c}label.has-warning{color:#eca918}label.has-success{color:#38b44a}label.has-information{color:#19b6ee}input[type='reset']{display:none}input[type='search']{-webkit-appearance:none;border-radius:0}input[type='checkbox']+label,input[type='radio']+label{display:inline;margin-left:5px;vertical-align:middle;width:auto}input.has-error{border:1px solid #df382c}input.has-warning{border:1px solid #eca918}input.has-success{border:1px solid #38b44a}input.has-information{border:1px solid #19b6ee}form ul{margin-left:0;list-style:none}textarea{overflow:auto;vertical-align:top}textarea[readonly='readonly']{color:#888;cursor:default}textarea[readonly='readonly']:active,textarea[readonly='readonly']:focus{border-color:#888;outline:none}fieldset{background-color:#f7f7f7;background-position:-15px -15px;background-repeat:no-repeat;border-radius:4px;border:0;margin-bottom:8px;padding:15px 20px}@media only screen and (min-width: 1440px){fieldset{padding:15px 20px}}fieldset h3{border-bottom:1px dotted #cdcdcd;margin-bottom:9px;padding-bottom:10px}form input,form select,form textarea{width:100%}@media only screen and (min-width: 768px){.one-col{float:left;width:6.40351%;margin-right:2.10526%}.one-col .one-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.two-col{float:left;width:14.91228%;margin-right:2.10526%}.two-col .one-col{float:left;width:43.81443%;margin-right:12.37113%}.two-col .two-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.three-col{float:left;width:23.42105%;margin-right:2.10526%}.three-col .one-col{float:left;width:27.83505%;margin-right:8.24742%}.three-col .two-col{float:left;width:63.91753%;margin-right:8.24742%}.three-col .three-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.four-col{float:left;width:31.92982%;margin-right:2.10526%}.four-col .one-col{float:left;width:20.36082%;margin-right:6.18557%}.four-col .two-col{float:left;width:46.90722%;margin-right:6.18557%}.four-col .three-col{float:left;width:73.45361%;margin-right:6.18557%}.four-col .four-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.five-col{float:left;width:40.4386%;margin-right:2.10526%}.five-col .one-col{float:left;width:16.04124%;margin-right:4.94845%}.five-col .two-col{float:left;width:37.03093%;margin-right:4.94845%}.five-col .three-col{float:left;width:58.02062%;margin-right:4.94845%}.five-col .four-col{float:left;width:79.01031%;margin-right:4.94845%}.five-col .five-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.six-col{float:left;width:48.94737%;margin-right:2.10526%}.six-col .one-col{float:left;width:13.23024%;margin-right:4.12371%}.six-col .two-col{float:left;width:30.58419%;margin-right:4.12371%}.six-col .three-col{float:left;width:47.93814%;margin-right:4.12371%}.six-col .four-col{float:left;width:65.2921%;margin-right:4.12371%}.six-col .five-col{float:left;width:82.64605%;margin-right:4.12371%}.six-col .six-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.seven-col{float:left;width:57.45614%;margin-right:2.10526%}.seven-col .one-col{float:left;width:11.25605%;margin-right:3.53461%}.seven-col .two-col{float:left;width:26.04671%;margin-right:3.53461%}.seven-col .three-col{float:left;width:40.83737%;margin-right:3.53461%}.seven-col .four-col{float:left;width:55.62802%;margin-right:3.53461%}.seven-col .five-col{float:left;width:70.41868%;margin-right:3.53461%}.seven-col .six-col{float:left;width:85.20934%;margin-right:3.53461%}.seven-col .seven-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.eight-col{float:left;width:65.96491%;margin-right:2.10526%}.eight-col .one-col{float:left;width:9.79381%;margin-right:3.09278%}.eight-col .two-col{float:left;width:22.68041%;margin-right:3.09278%}.eight-col .three-col{float:left;width:35.56701%;margin-right:3.09278%}.eight-col .four-col{float:left;width:48.45361%;margin-right:3.09278%}.eight-col .five-col{float:left;width:61.34021%;margin-right:3.09278%}.eight-col .six-col{float:left;width:74.2268%;margin-right:3.09278%}.eight-col .seven-col{float:left;width:87.1134%;margin-right:3.09278%}.eight-col .eight-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.nine-col{float:left;width:74.47368%;margin-right:2.10526%}.nine-col .one-col{float:left;width:8.66743%;margin-right:2.74914%}.nine-col .two-col{float:left;width:20.084%;margin-right:2.74914%}.nine-col .three-col{float:left;width:31.50057%;margin-right:2.74914%}.nine-col .four-col{float:left;width:42.91714%;margin-right:2.74914%}.nine-col .five-col{float:left;width:54.33372%;margin-right:2.74914%}.nine-col .six-col{float:left;width:65.75029%;margin-right:2.74914%}.nine-col .seven-col{float:left;width:77.16686%;margin-right:2.74914%}.nine-col .eight-col{float:left;width:88.58343%;margin-right:2.74914%}.nine-col .nine-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.ten-col{float:left;width:82.98246%;margin-right:2.10526%}.ten-col .one-col{float:left;width:7.7732%;margin-right:2.47423%}.ten-col .two-col{float:left;width:18.02062%;margin-right:2.47423%}.ten-col .three-col{float:left;width:28.26804%;margin-right:2.47423%}.ten-col .four-col{float:left;width:38.51546%;margin-right:2.47423%}.ten-col .five-col{float:left;width:48.76289%;margin-right:2.47423%}.ten-col .six-col{float:left;width:59.01031%;margin-right:2.47423%}.ten-col .seven-col{float:left;width:69.25773%;margin-right:2.47423%}.ten-col .eight-col{float:left;width:79.50515%;margin-right:2.47423%}.ten-col .nine-col{float:left;width:89.75258%;margin-right:2.47423%}.ten-col .ten-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.eleven-col{float:left;width:91.49123%;margin-right:2.10526%}.eleven-col .one-col{float:left;width:7.04609%;margin-right:2.2493%}.eleven-col .two-col{float:left;width:16.34148%;margin-right:2.2493%}.eleven-col .three-col{float:left;width:25.63687%;margin-right:2.2493%}.eleven-col .four-col{float:left;width:34.93227%;margin-right:2.2493%}.eleven-col .five-col{float:left;width:44.22766%;margin-right:2.2493%}.eleven-col .six-col{float:left;width:53.52305%;margin-right:2.2493%}.eleven-col .seven-col{float:left;width:62.81844%;margin-right:2.2493%}.eleven-col .eight-col{float:left;width:72.11383%;margin-right:2.2493%}.eleven-col .nine-col{float:left;width:81.40922%;margin-right:2.2493%}.eleven-col .ten-col{float:left;width:90.70461%;margin-right:2.2493%}.eleven-col .eleven-col{width:100%;margin-right:0}}@media only screen and (min-width: 768px){.prepend-one{margin-left:8.50877%}.prepend-two{margin-left:17.01754%}.prepend-three{margin-left:25.52632%}.prepend-four{margin-left:34.03509%}.prepend-five{margin-left:42.54386%}.prepend-six{margin-left:51.05263%}.prepend-seven{margin-left:59.5614%}.prepend-eight{margin-left:68.07018%}.prepend-nine{margin-left:76.57895%}.prepend-ten{margin-left:85.08772%}.prepend-eleven{margin-left:93.59649%}}@media only screen and (min-width: 768px){.append-one{margin-right:8.50877%}.append-two{margin-right:17.01754%}.append-three{margin-right:25.52632%}.append-four{margin-right:34.03509%}.append-five{margin-right:42.54386%}.append-six{margin-right:51.05263%}.append-seven{margin-right:59.5614%}.append-eight{margin-right:68.07018%}.append-nine{margin-right:76.57895%}.append-ten{margin-right:85.08772%}.append-eleven{margin-right:93.59649%}}@media only screen and (min-width: 768px){.push-one{float:left;position:relative;margin:0 -8.50877% 0 8.50877%}.push-two{float:left;position:relative;margin:0 -19.12281% 0 19.12281%}.push-three{float:left;position:relative;margin:0 -27.63158% 0 27.63158%}.push-four{float:left;position:relative;margin:0 -36.14035% 0 36.14035%}.push-five{float:left;position:relative;margin:0 -44.64912% 0 44.64912%}.push-six{float:left;position:relative;margin:0 -53.15789% 0 53.15789%}.push-seven{float:left;position:relative;margin:0 -61.66667% 0 61.66667%}.push-eight{float:left;position:relative;margin:0 -70.17544% 0 70.17544%}.push-nine{float:left;position:relative;margin:0 -78.68421% 0 78.68421%}.push-ten{float:left;position:relative;margin:0 -87.19298% 0 87.19298%}.push-eleven{float:left;position:relative;margin:0 -95.70175% 0 95.70175%}}@media only screen and (min-width: 768px){.pull-one{float:left;position:relative;margin-left:-6.40351%}.pull-two{float:left;position:relative;margin-left:17.01754%}.pull-three{float:left;position:relative;margin-left:25.52632%}.pull-four{float:left;position:relative;margin-left:34.03509%}.pull-five{float:left;position:relative;margin-left:42.54386%}.pull-six{float:left;position:relative;margin-left:51.05263%}.pull-seven{float:left;position:relative;margin-left:59.5614%}.pull-eight{float:left;position:relative;margin-left:68.07018%}.pull-nine{float:left;position:relative;margin-left:76.57895%}.pull-ten{float:left;position:relative;margin-left:85.08772%}.pull-eleven{float:left;position:relative;margin-left:93.59649%}}.banner{background:#f7f7f7;border-bottom:0;border-top:0;box-shadow:inset 0 -1px 0 #ccc;display:block;min-width:100%;position:relative;width:auto;z-index:2}@media only screen and (min-width: 620px){.banner{border-bottom:1px solid #ccc;box-shadow:none}}.banner .logo{position:relative;display:table;float:left;overflow:hidden;height:48px;margin:0 10px;border-left:0}@media only screen and (min-width: 620px){.banner .logo{margin:0 15px}}.banner .logo a{display:table-cell;height:100%;vertical-align:middle;color:#fff}.banner .logo a span{display:inline-block}.banner h2{font-size:1.563em;position:relative;top:14px;left:4px;display:block;margin-bottom:0;text-transform:lowercase}.banner h2 a,.banner h2 a:link,.banner h2 a:visited{float:left;text-decoration:none;color:#fff}.banner .nav-primary{overflow:hidden;margin:0 auto;border:0}@media only screen and (min-width: 620px){.banner .nav-primary{max-width:1440px}}.banner .nav-primary span{display:none}.banner .nav-primary ul{display:none;float:left;width:100%;margin:0;padding:0;border-top:1px solid #ccc;box-shadow:inset 0 -1px 0 #ccc;background-color:#ebebeb}@media only screen and (min-width: 620px){.banner .nav-primary ul{position:static;display:block;width:auto;border-top:0;background-color:transparent;box-shadow:none}}.banner .nav-primary ul li{float:left;width:50%;margin:0;border-right:1px solid #ccc;border-bottom:1px solid #ccc;background:transparent}@media only screen and (min-width: 620px){.banner .nav-primary ul li{width:auto;border-right:0;border-bottom:0;border-left:1px solid #e3e3e3}.banner .nav-primary ul li:last-child{border-right:1px solid #e3e3e3}.banner .nav-primary ul li:last-child a{border-right:0}}@media only screen and (max-width: 620px){.banner .nav-primary ul li:nth-child(2n+2){border-right:0}}.banner .nav-primary ul li a,.banner .nav-primary ul li a:link,.banner .nav-primary ul li a:visited{font-size:1em;font-weight:300;position:relative;display:block;margin-bottom:0;padding:8px 10px;text-align:left;text-decoration:none;background-color:#ebebeb;font-smoothing:subpixel-antialiased;color:#333}@media only screen and (min-width: 620px){.banner .nav-primary ul li a,.banner .nav-primary ul li a:link,.banner .nav-primary ul li a:visited{font-size:.875em;padding:14px 14px 13px;text-align:center;border-left:1px solid #fff;background-color:transparent;color:#fff}}.banner .nav-primary ul li a:hover,.banner .nav-primary ul li a:link:hover,.banner .nav-primary ul li a:visited:hover{background:#f2f2f2}@media only screen and (min-width: 620px){.banner .nav-primary ul li a:hover,.banner .nav-primary ul li a:link:hover,.banner .nav-primary ul li a:visited:hover{background-color:#fff}}.banner .nav-primary ul li a.active,.banner .nav-primary ul li a:link.active,.banner .nav-primary ul li a:visited.active{background-color:#ddd}@media only screen and (min-width: 620px){.banner .nav-primary ul li a.active,.banner .nav-primary ul li a:link.active,.banner .nav-primary ul li a:visited.active{background-color:#e3e3e3;border-left:0}}.banner .nav-toggle{position:absolute;top:0;right:0;display:block;width:48px;height:48px;cursor:pointer;text-indent:-99999px;background-image:url("https://assets.ubuntu.com/v1/12387180-navigation-menu-plain.svg");background-repeat:no-repeat;background-position:center center;background-size:25px auto}@media only screen and (min-width: 620px){.banner .nav-toggle{display:none}}.banner .nav-toggle .nav-toggle__link{width:48px;height:48px}.banner .nav-toggle .nav-toggle__link.open{display:block}.banner .nav-toggle .nav-toggle__link.close{display:none}@media only screen and (max-width: 620px){.banner #nav:hover ul{display:block}.banner #nav:hover ul ul{display:none}.banner #nav:hover .nav-toggle .nav-toggle__link.open{display:none}.banner #nav:hover .nav-toggle .nav-toggle__link.close{display:block}}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}li{font-size:1em;line-height:1.5;margin:0 0 .4em;padding:0}.list-ticks li{background-image:url("data:image/svg+xml;utf8, <svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 14 14'><circle fill='%23c4c4c4' cx='7' cy='7' r='7'/><path fill='%23fff' d='M6.1 10.813L2.41 8.105l1.184-1.613L5.9 8.187l4.393-4.394 1.414 1.414z' /></svg>")}.no-bullets{list-style:none;margin-left:0}.combined-list ul,.combined-list div{margin-bottom:0}.combined-list .last-item{border-bottom:1px dotted #888;padding-bottom:10px}.combined-list .last-col{margin-bottom:20px}.combined-list .last-col .last-item{border-bottom:0;padding-bottom:0}@media only screen and (min-width: 768px){.combined-list ul,.combined-list div{margin-bottom:20px}.combined-list .last-item{border-bottom:0;padding-bottom:0}}.inline-list{margin-left:0}.inline-list li{display:inline;list-style:none;margin-right:20px}.inline-list .last-item{margin-right:0}.list-step{list-style:none;margin-left:60px}@media only screen and (max-width: 1440px){.list-step__item:first-child{margin-top:10px}}@media only screen and (min-width: 1440px){.list-step__title{margin-bottom:0}}.list-step__bullet{box-shadow:0 1px 3px 1px rgba(51,51,51,0.2);background:#fff;border-radius:50%;padding:.3em .68em;display:inline-block;color:#f7f7f7;margin-right:.34375em;margin-bottom:.625em;margin-left:-60px}@media only screen and (max-width: 1440px){.list-step__bullet{position:absolute;top:-5px}}.row{border-bottom:1px dotted #888;clear:both;padding:20px 10px 0;position:relative}.row br{display:none}.row.no-padding-bottom{padding-bottom:0}.row::after{clear:both;content:'.';display:block;height:0;visibility:hidden}.row--light{background:#fff}.row--dark{background:#333;color:#fff}.row.row-grey,.row.row--grey{background:#f7f7f7;border:0;margin-top:-1px}.no-border{border:0}.row-hero{margin-top:20px;padding-top:0}.strip{width:100%;display:block}.strip-inner-wrapper{max-width:1440px;margin:auto}@media only screen and (min-width: 768px){.row-hero{margin-top:40px}.row{border-radius:0;margin:0;padding:40px 20px 20px}.row-grey{margin-top:-1px}}@media only screen and (min-width: 769px){.row br{display:block}}@media only screen and (min-width: 1440px){.row br{display:block}.row{padding:60px 20px 40px}.no-border{border:0}}.header-search [type="search"],.header-search [type="text"],.search-form [type="search"],.search-form [type="text"]{-webkit-appearance:none;background-color:#dedede;box-shadow:none;color:#333;display:block;float:left;font-size:1em;margin-bottom:0;padding:12px 10px;transition:all .5s ease-out;width:100%}.header-search .svg-search-handle,.search-form .svg-search-handle{fill:#333}.header-search .svg-search-frame,.search-form .svg-search-frame{stroke:#333}.header-search placeholder,.search-form placeholder{color:#333;opacity:1}.header-search input:placeholder,.search-form input:placeholder{color:#333;opacity:1}.header-search ::placeholder,.search-form ::placeholder{color:#333;opacity:1}.header-search [type="search"]:focus,.search-form [type="search"]:focus{background-color:#d3d3d3;border-color:#b3b3b3}.header-search [type=submit],.search-form [type=submit]{background:none;display:block;float:left;line-height:0;margin-left:-40px;overflow:visible;padding:3px 2px;width:auto}.header-search [type=submit]:hover,.search-form [type=submit]:hover{background:none}.header-search [type=submit] img,.search-form [type=submit] img{height:28px;width:28px;margin-top:2px}.banner .search-toggle{background-image:url("data:image/svg+xml;utf8, <svg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 90 90'><g color='%23333'><path fill='none' stroke-width='4' overflow='visible' enable-background='accumulate' d='M0 0h90v90H0z'/><path d='M69 36.5a33 33.5 0 1 1-66 0 33 33.5 0 1 1 66 0z' transform='matrix(.636 0 0 .627 16.114 16.12)' fill='none' stroke='%23333' stroke-width='9.5' overflow='visible' enable-background='accumulate'/><path d='M55.77 52.92L52.94 55.75l14 14 2.83-2.83-14-14z' font-size='xx-small' fill='%23333' stroke-width='6' overflow='visible' enable-background='accumulate' font-family='Sans' class='s0'/><path d='M60.97 57.03c-1.55-3.04 1.02-3.63 2.46-0.58 1.44-0.21 3.21 4.29l9.19 9.2c2.68 2.85 3.26 2.46 5.64 2.38-2.38 2.77-2.79-0.08-5.65l-9.19-9.2c-0.73-0.75-1.78-1.19-2.83-1.19z' font-size='xx-small' fill='%23333' stroke-width='11.8' overflow='visible' enable-background='accumulate' font-family='Sans' class='s0'/></g></svg>");background-position:center center;background-repeat:no-repeat;background-size:20px 20px;display:block;height:48px;outline:none;overflow:hidden;position:absolute;right:0;text-indent:-999em;top:0;width:24px}.banner .search-toggle .search-toggle__link{width:48px;height:48px}.banner .search-toggle .search-toggle__link.open{display:block}.banner .search-toggle .search-toggle__link.close{display:none}#site-search:hover form{display:block}#site-search:hover .search-toggle .search-toggle__link.open{display:none}#site-search:hover .search-toggle .search-toggle__link.close{display:block}.header-search,.search-form{background:#f7f7f7;border:0;display:none;float:left;position:relative;margin:0;width:100%;z-index:3}.search-form.active,.header-search.active,.header-search.open{display:block}.search-form div,.header-search div{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:#fff;margin:10px;position:relative;z-index:1}.search-form form [type="search"],.header-search form [type="search"]{background:#fff;border:0;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);color:#333;display:block;float:left;font-size:1em;height:auto;margin:0;padding:8px 10px;width:100%}.yes-js .header-inner .search-form,.yes-js .header-inner .header-search{display:none}.yes-js .header-inner .search-form form,.yes-js .header-inner .header-search form{margin-left:0;margin-right:0;overflow:hidden;padding:10px;position:relative;top:0;width:100%;z-index:999}@media only screen and (max-width: 620px){.banner .search-toggle{right:0}.no-svg .search-toggle,.opera-mini .search-toggle{background-image:url("https://assets.ubuntu.com/v1/75d8151d-search-white.png")}}@media only screen and (min-width: 620px){.banner .search-toggle{display:none}}@media only screen and (min-width: 620px){.search-form,.header-search{background:none;border-right:0 none;float:right;margin-bottom:0;max-width:220px;overflow:hidden;padding:7px 0 5px 14px}.search-form form [type="text"],.search-form form [type="search"],.header-search form [type="text"],.header-search form [type="search"]{box-shadow:0 2px 4px rgba(0,0,0,0.4) inset;box-sizing:content-box;background-color:#dedede;border:0 solid #d8d8d8;border-width:0 0 1px;color:#333;font-size:.813em;height:24px;margin-bottom:0;padding:.5em 2.5em .5em .5em;transition:all .5s ease 0s;width:86px}.search-form form [type="text"]:focus,.search-form form [type="search"]:focus,.header-search form [type="text"]:focus,.header-search form [type="search"]:focus{background-color:#d3d3d3;border-color:#c4c4c4}.search-form .svg-search-handle,.header-search .svg-search-handle{fill:#333}.search-form .svg-search-frame,.header-search .svg-search-frame{stroke:#333}.search-form placeholder,.header-search placeholder{color:#333}.search-form input:placeholder,.header-search input:placeholder{color:#333}.search-form ::placeholder,.header-search ::placeholder{color:#333}}@media only screen and (min-width: 620px){.header-search .svg-search-handle,.search-form .svg-search-handle{fill:#333}.header-search .svg-search-frame,.search-form .svg-search-frame{stroke:#333}.header-search placeholder,.search-form placeholder{color:#333}.header-search input:placeholder,.search-form input:placeholder{color:#333}.header-search ::placeholder,.search-form ::placeholder{color:#333}}@media only screen and (max-width: 620px){.banner .nav-primary .header-search{position:relative;top:0;width:100%}.banner .nav-primary .header-search [type="search"]{background-color:#ebebeb;color:#333}.banner .nav-primary .header-search [type="submit"]{background-color:transparent;height:38px;margin-top:0;width:32px}.banner .nav-primary .header-search [type="submit"] img,.banner .nav-primary .header-search [type="submit"] svg{max-width:none}.banner .nav-primary .header-search.open{display:block}.banner .search-toggle{background-image:url("data:image/svg+xml;utf8, <svg xmlns='http://www.w3.org/2000/svg' width='28' height='28' viewBox='0 0 90 90'><g color='%23333'><path fill='none' stroke-width='4' overflow='visible' enable-background='accumulate' d='M0 0h90v90H0z'/><path d='M69 36.5a33 33.5 0 1 1-66 0 33 33.5 0 1 1 66 0z' transform='matrix(.636 0 0 .627 16.114 16.12)' fill='none' stroke='%23333' stroke-width='9.5' overflow='visible' enable-background='accumulate'/><path d='M55.77 52.92L52.94 55.75l14 14 2.83-2.83-14-14z' font-size='xx-small' fill='%23333' stroke-width='6' overflow='visible' enable-background='accumulate' font-family='Sans' class='s0'/><path d='M60.97 57.03c-1.55-3.04 1.02-3.63 2.46-0.58 1.44-0.21 3.21 4.29l9.19 9.2c2.68 2.85 3.26 2.46 5.64 2.38-2.38 2.77-2.79-0.08-5.65l-9.19-9.2c-0.73-0.75-1.78-1.19-2.83-1.19z' font-size='xx-small' fill='%23333' stroke-width='11.8' overflow='visible' enable-background='accumulate' font-family='Sans' class='s0'/></g></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}.no-svg .banner .search-toggle,.opera-mini .banner .search-toggle{background-image:url("https://assets.ubuntu.com/v1/2196e362-search-white.svg")}.opera-mini x:-o-prefocus,.opera-mini .banner .search-toggle{background-size:25px auto}}@media only screen and (min-width: 620px){.search-form,.header-search{display:block}.search-form .svg-search-handle,.header-search .svg-search-handle{fill:#333}.search-form .svg-search-frame,.header-search .svg-search-frame{stroke:#333}.search-form form [type="text"]:focus,.header-search form [type="text"]:focus{width:160px}.search-form [type="search"],.search-form [type="text"],.header-search [type="search"],.header-search [type="text"]{padding:8px 10px}}@media only screen and (max-width: 1440px){.search-form,.header-search{margin-right:10px}}@media only screen and (max-width: 620px){.banner .search-toggle{right:48px}}.ubuntu-search .nav-secondary,.search-results .nav-secondary,.search-no-results .nav-secondary{display:none}.ubuntu-search section>h1,.ubuntu-search section article h1,.search-results section>h1,.search-results section article h1,.search-no-results section>h1,.search-no-results section article h1{padding-bottom:10px;font-size:1.438em;margin-bottom:0}.ubuntu-search section>h1,.search-results section>h1,.search-no-results section>h1{border-bottom:1px dotted #cdcdcd}.ubuntu-search .main-search,.search-results .main-search,.search-no-results .main-search{background-color:transparent;margin:0 0 20px;padding:20px 0}.ubuntu-search .main-search [type="search"],.search-results .main-search [type="search"],.search-no-results .main-search [type="search"]{border:1px solid #888;float:left;font-size:2em;padding:.2em 65px .2em .2em;width:100%}.ubuntu-search .main-search [type=submit],.search-results .main-search [type=submit],.search-no-results .main-search [type=submit]{width:32px;height:38px;background-repeat:no-repeat;background-position:center 8px;background-color:transparent;background-size:28px 28px;display:block;float:left;line-height:0;margin-left:-53px;margin-top:-4px;overflow:visible;padding:4px}.ubuntu-search .main-search [type=submit] img,.search-results .main-search [type=submit] img,.search-no-results .main-search [type=submit] img{height:45px;width:45px}.ubuntu-search .main-search [type=submit]:hover,.search-results .main-search [type=submit]:hover,.search-no-results .main-search [type=submit]:hover{background:none}.ubuntu-search .search-result h1 .title-main,.search-results .search-result h1 .title-main,.search-no-results .search-result h1 .title-main{margin-right:20px}.ubuntu-search .search-result h1 .result-url,.search-results .search-result h1 .result-url,.search-no-results .search-result h1 .result-url{color:#888;display:block;overflow:hidden;padding-bottom:2px;text-overflow:ellipsis;vertical-align:bottom}.ubuntu-search .search-result h1 .result-url a,.search-results .search-result h1 .result-url a,.search-no-results .search-result h1 .result-url a{color:#888}.ubuntu-search .search-result p,.search-results .search-result p,.search-no-results .search-result p{margin-bottom:0}.ubuntu-search .num-results,.search-results .num-results,.search-no-results .num-results{display:inline-block;margin-left:20px}.ubuntu-search .bottom-results-total,.search-results .bottom-results-total,.search-no-results .bottom-results-total{margin:0;overflow:visible;padding-top:20px;text-align:center;width:100%}.ubuntu-search .bottom-nav,.search-results .bottom-nav,.search-no-results .bottom-nav{margin-top:-26px;overflow:hidden}.ubuntu-search .bottom-nav ul,.search-results .bottom-nav ul,.search-no-results .bottom-nav ul{margin-bottom:0;margin-left:0;overflow:hidden;padding:0}.ubuntu-search .bottom-nav li,.search-results .bottom-nav li,.search-no-results .bottom-nav li{float:left;margin-left:15px}.ubuntu-search .bottom-nav li:first-child,.search-results .bottom-nav li:first-child,.search-no-results .bottom-nav li:first-child{margin-left:0}.ubuntu-search .nav-back,.search-results .nav-back,.search-no-results .nav-back{float:left}.ubuntu-search .nav-back li:before,.search-results .nav-back li:before,.search-no-results .nav-back li:before{color:#f7f7f7;content:'\2039';margin-right:5px}.ubuntu-search .nav-back .item-extreme:before,.search-results .nav-back .item-extreme:before,.search-no-results .nav-back .item-extreme:before{content:'\2039\2039'}.ubuntu-search .nav-forward,.search-results .nav-forward,.search-no-results .nav-forward{float:right}.ubuntu-search .nav-forward li:after,.search-results .nav-forward li:after,.search-no-results .nav-forward li:after{color:#f7f7f7;content:'\203A';margin-left:5px}.ubuntu-search .nav-forward .item-extreme:after,.search-results .nav-forward .item-extreme:after,.search-no-results .nav-forward .item-extreme:after{content:'\203A\203A'}.ubuntu-search .error-notification,.search-results .error-notification,.search-no-results .error-notification{background-color:#fff;color:#333;display:block;margin-top:20px;padding:20px;width:100%}.ubuntu-search .result-line,.search-results .result-line,.search-no-results .result-line{color:#888}.ubuntu-search .results-top,.search-results .results-top,.search-no-results .results-top{border-bottom:1px dotted #cdcdcd;padding-bottom:.5em}.ubuntu-search .search-container,.search-results .search-container,.search-no-results .search-container{padding-bottom:0}@media only screen and (min-width: 620px){.ubuntu-search .main-search [type=submit]{margin-left:-60px;margin-top:0}}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:300;src:url("../assets/fonts/ubuntu-l-webfont.woff2") format("woff2"),url("../assets/fonts/ubuntu-l-webfont.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:400;src:url("../assets/fonts/ubuntu-r-webfont.woff2") format("woff2"),url("../assets/fonts/ubuntu-r-webfont.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:normal;font-weight:700;src:url("../assets/fonts/ubuntu-b-webfont.woff2") format("woff2"),url("../assets/fonts/ubuntu-b-webfont.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:300;src:url("../assets/fonts/ubuntu-li-webfont.woff2") format("woff2"),url("../assets/fonts/ubuntu-li-webfont.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:400;src:url("../assets/fonts/ubuntu-ri-webfont.woff2") format("woff2"),url("../assets/fonts/ubuntu-ri-webfont.woff") format("woff")}@font-face{font-family:'Ubuntu';font-style:italic;font-weight:700;src:url("../assets/fonts/ubuntu-bi-webfont.woff2") format("woff2"),url("../assets/fonts/ubuntu-bi-webfont.woff") format("woff")}@font-face{font-family:'Ubuntu Mono';font-style:normal;font-weight:400;src:url("../assets/fonts/ubuntumono-r-webfont.woff2") format("woff2"),url("../assets/fonts/ubuntumono-r-webfont.woff") format("woff")}body{color:#333;font-family:'Ubuntu', Arial, 'libra sans', sans-serif;font-size:16px;font-weight:300}a:focus{outline:thin dotted}a:hover,a:active{outline:0}a{color:#f7f7f7;text-decoration:none}a:hover,a:active,a:focus{text-decoration:underline}strong{font-weight:400}.caps-centered,.muted-heading{font-size:.875em;margin-bottom:20px;text-align:center;text-transform:uppercase}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}pre{border-radius:4px;background-color:#fff;padding:.6em 1em;white-space:pre-wrap;word-wrap:break-word}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:.783em}p+h4,ul+h4,ol+h4,pre+h4{margin-top:1.21875}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}.intro{font-size:1em;line-height:1.4}.row div p:last-child,.row ul p:last-child{margin-bottom:0}.four-col p:last-child{margin-bottom:0}.note{color:#888;font-size:.813em}h1,h2,h3,h4,h5,h6{font-family:Ubuntu, Arial, 'libra sans', sans-serif;font-weight:300;line-height:1.3}h1{font-size:2.8125em;margin-bottom:.5em}h2{font-size:2em;margin-bottom:.5em}h3{font-size:1.4375em;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:.8125em;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}button,input,select,textarea{font-family:Ubuntu,Arial,'libra sans',sans-serif}@media only screen and (min-width: 768px) and (max-width: 1440px){h1{font-size:1.5234375em;margin-bottom:.5em}h2{font-size:1.348125em;margin-bottom:.5em}h3{font-size:1.1428125em;margin-bottom:.522em}h4{font-size:1.171875em;font-weight:400;margin-bottom:.615em}h5{font-size:.9375em;font-weight:700;margin-bottom:1em}h6{font-size:.6778125em;font-weight:400;margin-bottom:1em;letter-spacing:.1em;text-transform:uppercase}.intro{font-size:1.13333em}}@media only screen and (max-width: 768px){h1{font-size:1.421875em;margin-bottom:.4375em}h2{font-size:1.25825em;margin-bottom:.4375em}h3{font-size:1.066625em;margin-bottom:.45675em}h4{font-size:1.09375em;font-weight:400;margin-bottom:.538125em}h5{font-size:.875em;font-weight:700;margin-bottom:.875em}h6{font-size:.632625em;font-weight:400;margin-bottom:.875em;letter-spacing:.1em;text-transform:uppercase}p,li{font-size:.875em}}@media only screen and (min-width: 1440px){p,li,code,pre{font-size:16px;line-height:1.5;margin-bottom:.75em}.intro{font-size:1.25em}}dfn{font-style:italic}code,pre{font-family:'Ubuntu Mono', 'Consolas', 'Monaco', 'Lucida Console', 'Courier New', Courier, monospace}table{border-collapse:collapse;border-spacing:0;overflow-x:scroll;margin-bottom:20px;margin:0 0 2.5em;width:100%}table th,table td{background:#f7f7f7;border:1px dotted #888;padding:15px 10px}table td{text-align:center;vertical-align:middle}table thead th{border-collapse:separate;border-spacing:0 10px;background:#fee3d2;color:#333;font-weight:normal}table tbody th{font-weight:300;text-align:left}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}}body footer.global #nav-global li:first-of-type a{margin-left:0}footer.global{background:none;border-top:0;box-shadow:inset 0 2px 2px -1px #cdcdcd;clear:both;display:block;padding:30px 10px 20px;position:relative;width:100%}footer.global .legal{background-image:none;clear:both;margin:0 auto;min-height:40px;position:relative;width:100%}footer.global .legal p,footer.global .legal ul{padding-left:0}footer.global h2{font-size:.75em;line-height:1.4;margin-bottom:0;padding-bottom:.5em}footer.global h2,footer.global h2 a:link,footer.global h2 a:visited{color:#333;font-weight:normal}footer.global ul{margin:0}footer.global li a:hover{color:#f7f7f7}footer.global li ul li a:link,footer.global li ul li a:visited{color:#333;font-size:.75em}footer.global h2 a:hover,footer.global h2 a:active{color:#f7f7f7}footer.global p{color:#333;font-size:12px;margin-bottom:0}@media only screen and (max-width: 768px){footer.no-global .legal{box-shadow:0 2px 2px -1px #cdcdcd inset;box-sizing:content-box;margin-left:-10px;padding-left:10px;padding-right:10px;padding-top:10px}}@media only screen and (min-width: 1440px){footer.global .legal{width:1440px}footer.global{padding:30px 0 20px}}svg:not(:root){overflow:hidden}figure{width:100%}figure caption{display:block;width:100%;text-align:center}object,iframe,embed,canvas,video,audio{display:block;max-width:100%;margin:0 auto 20px}audio:not([controls]){display:none;height:0}[hidden]{display:none}.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}.inline-logos{float:left;margin-left:0;padding:0;text-align:center;width:100%}.inline-logos .inline-logos__item{display:inline-block;margin-right:20px;padding:0 0 20px;width:36%}@media only screen and (max-width: 300px){.inline-logos .inline-logos__item{margin:0 0 20px;width:100%}}.inline-logos .inline-logos__item.clear-row{clear:left}.inline-logos .inline-logos__item.last-item{border:0}.inline-logos .inline-logos__image{max-height:32px;max-width:115px;transition:all .3s ease-out;vertical-align:middle}@media only screen and (min-width: 768px){.inline-logos{padding-top:20px}.inline-logos .inline-logos__item{display:inline-block;height:56px;line-height:60px;margin:0 30px 30px;width:150px}.inline-logos .inline-logos__image{float:none;height:auto;max-height:56px;max-width:150px;vertical-align:middle}}@media only screen and (min-width: 1440px){.inline-logos__item{margin-bottom:40px}}@media only screen and (min-width: 768px){.equal-height__align-vertically{align-items:center;justify-content:center}}@media only screen and (min-width: 768px){.equal-height--vertical-divider{position:relative}.equal-height--vertical-divider__item{padding-left:10px;padding-right:10px}.equal-height--vertical-divider__item:before{content:'';position:absolute;right:-10px;top:0;height:100%;width:1px;border-right:1px dotted #888}.equal-height--vertical-divider .last-col,.equal-height--vertical-divider__item:last-of-type{padding-right:0}.equal-height--vertical-divider .last-col:before,.equal-height--vertical-divider__item:last-of-type:before{border-right:0}.equal-height--vertical-divider__item:first-of-type{padding-left:0}}@media only screen and (max-width: 768px){.equal-height--vertical-divider .equal-height--vertical-divider__item{border-bottom:1px dotted #888;padding-bottom:20px}.equal-height--vertical-divider .equal-height--vertical-divider__item:last-of-type{border-bottom:0;padding-bottom:inherit}}body{background:url("../assets/img/backgrounds/image-background-paper.png") repeat-y center top #f7f7f7}.button--neutral,.button--inline-neutral{color:#333;background-color:transparent;border:1px solid #cdcdcd}.button--neutral:focus,.button--neutral:active,.button--neutral:hover,.button--inline-neutral:focus,.button--inline-neutral:active,.button--inline-neutral:hover{background-color:rgba(0,0,0,0.1)}.button--neutral:disabled:focus,.button--neutral:disabled:active,.button--neutral:disabled:hover,.button--neutral.button--disabled:focus,.button--neutral.button--disabled:active,.button--neutral.button--disabled:hover,.button--inline-neutral:disabled:focus,.button--inline-neutral:disabled:active,.button--inline-neutral:disabled:hover,.button--inline-neutral.button--disabled:focus,.button--inline-neutral.button--disabled:active,.button--inline-neutral.button--disabled:hover{background-color:transparent}.button--inline-neutral{display:inline-block;width:auto}.button--positive,.button--inline-positive{color:#fff;background-color:#38b44a}.button--positive:focus,.button--positive:active,.button--positive:hover,.button--inline-positive:focus,.button--inline-positive:active,.button--inline-positive:hover{background-color:#2c8d3a}.button--positive:disabled:focus,.button--positive:disabled:active,.button--positive:disabled:hover,.button--positive.button--disabled:focus,.button--positive.button--disabled:active,.button--positive.button--disabled:hover,.button--inline-positive:disabled:focus,.button--inline-positive:disabled:active,.button--inline-positive:disabled:hover,.button--inline-positive.button--disabled:focus,.button--inline-positive.button--disabled:active,.button--inline-positive.button--disabled:hover{background-color:#38b44a}.button--inline-positive{display:inline-block;width:auto}.button--destructive,.button--inline-destructive{color:#fff;background-color:#df382c}.button--destructive:focus,.button--destructive:active,.button--destructive:hover,.button--inline-destructive:focus,.button--inline-destructive:active,.button--inline-destructive:hover{background-color:#bc271c}.button--destructive:disabled:focus,.button--destructive:disabled:active,.button--destructive:disabled:hover,.button--destructive.button--disabled:focus,.button--destructive.button--disabled:active,.button--destructive.button--disabled:hover,.button--inline-destructive:disabled:focus,.button--inline-destructive:disabled:active,.button--inline-destructive:disabled:hover,.button--inline-destructive.button--disabled:focus,.button--inline-destructive.button--disabled:active,.button--inline-destructive.button--disabled:hover{background-color:#df382c}.button--inline-destructive{display:inline-block;width:auto}.button--base,.button--inline-base{color:#333;background-color:transparent}.button--base:focus,.button--base:active,.button--base:hover,.button--inline-base:focus,.button--inline-base:active,.button--inline-base:hover{background-color:rgba(0,0,0,0.1)}.button--base:disabled:focus,.button--base:disabled:active,.button--base:disabled:hover,.button--base.button--disabled:focus,.button--base.button--disabled:active,.button--base.button--disabled:hover,.button--inline-base:disabled:focus,.button--inline-base:disabled:active,.button--inline-base:disabled:hover,.button--inline-base.button--disabled:focus,.button--inline-base.button--disabled:active,.button--inline-base.button--disabled:hover{background-color:transparent}.button--inline-base{display:inline-block;width:auto}.cookie-policy{box-shadow:0 -1px 2px rgba(0,0,0,0.2);background-color:#fae4dc;position:fixed;bottom:0;width:100%;z-index:100}.cookie-policy p{font-size:.8125em;margin-bottom:0;margin-left:0;padding:8px 0;width:100%}.cookie-policy .link-cta{background-image:url("https://assets.ubuntu.com/v1/3f057022-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}.no-svg .cookie-policy .link-cta,.opera-mini .cookie-policy .link-cta{background-image:url("https://assets.ubuntu.com/v1/898777ac-close-orange.png")}.deep-link{text-decoration:none}.deep-link:after{content:'';display:inline-block;margin-left:3px;opacity:0;position:relative;top:1px;width:1em;height:1em;background-image:url(https://assets.ubuntu.com/v1/128877a5-anchor_16.svg);background-position:0 80%;background-repeat:no-repeat;background-size:16px;transition:opacity .1s}.deep-link:hover{text-decoration:none}.deep-link:hover:after{opacity:1}.banner{background:#000;box-shadow:none}@media only screen and (min-width: 620px){.banner .nav-primary{width:auto}.banner ul{border-top:0;border-right:0;box-shadow:none}.banner li{width:auto;border-right:0;border-bottom:0}.banner li:last-child a{border-right:0}.banner a,.banner a:link,.banner a:visited{border-left:0}}@media only screen and (max-width: 768px){footer.global{padding-top:0}}.instruction{padding:0;position:relative;width:100%;border-bottom:1px dotted #ddd}.instruction .instruction__bullet,.instruction .instruction__details{padding:60px 40px;margin-bottom:0}.instruction .instruction__bullet{margin-right:0}.instruction .instruction__step{display:inline-block;border-radius:50%;width:50px;height:50px;line-height:50px;color:#fff;text-align:center;vertical-align:top;font-size:2em;font-weight:400}.instruction .instruction__title{display:inline;position:relative;top:6px;line-height:1.6}.instruction .command-line{position:relative;border-radius:4px;background-color:#2c001e;border:1px solid #2c001e;overflow:hidden;transition:all .2s}.instruction .command-line .command-line__input{border:0;background:transparent;font-size:1em;font-family:Ubuntu Mono;font-weight:300;padding:.7em 1em;color:#fff;width:100%}.instruction .command-line .command-line__copy-button{transition:background-color .2s;position:absolute;right:0;top:0;width:50px;border:0;height:100%;display:block;text-indent:-9999px;background-image:url("https://assets.ubuntu.com/v1/994e60f9-get-link-url_16.svg");background-repeat:no-repeat;background-position:center;background-color:#fff}.row{border-bottom:0;background-color:rgba(255,255,255,0.6)}@media only screen and (max-width: 768px){.row{padding-bottom:20px}}@media only screen and (max-width: 768px){.row-hero{padding-top:20px;margin-top:0}}.strip-white{background:#fff}.strip-dark{background:#333;color:#fff}.strip-dark a{color:#fff}.strip-trans{background:transparent}.social-list{list-style:none;padding-left:0;margin-left:0}.social-list__item--twitter,.social-list__item--google-plus,.social-list__item--facebook{margin-right:20px;float:left;text-indent:-99999px;background-image:url("https://assets.ubuntu.com/v1/ed986fc0-icon-social.svg");background-repeat:no-repeat;height:44px;width:44px;overflow:hidden;display:inline-block}.social-list__item--twitter:hover,.social-list__item--google-plus:hover,.social-list__item--facebook:hover{background-position-y:-45px}.social-list__item--twitter{background-position:0 0}.social-list__item--google-plus{background-position:-45px 0}.social-list__item--facebook{background-position:-90px 0}@media only screen and (min-width: 768px){.tooltip{position:relative;display:inline-block}.tooltip__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}.tooltip:hover .tooltip__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}.tooltip:hover .tooltip__content:before{position:absolute;top:100%;left:50%;margin-left:-5px;content:'';border:solid transparent;border-width:5px;border-top-color:#000}}a,.link{cursor:pointer;color:#f7f7f7;text-decoration:underline}pre{padding:10px 15px;background-color:#333;border:0;border-radius:2px;color:#cdcdcd}html{overflow-y:scroll;overflow-x:hidden;min-height:100%;color:#333;font:1em / 1.5 "'Ubuntu', Arial, 'libra sans', sans-serif"}a{color:#333;text-decoration:none;border-bottom:1px solid #c2c2c2}a:hover{text-decoration:none;color:#dd4814}p,li,code,pre{font-size:16px;font-size:1rem;line-height:1.5;margin-bottom:.75em}pre,code{text-align:left;white-space:pre-line;word-spacing:normal;word-wrap:break-word;tab-size:4;hyphens:none;direction:ltr}hr{margin-bottom:20px}h1,h2,h3,h4,h5{margin:10px 0;font-weight:300;line-height:1.5;color:#333}h1{font-size:2em}h1 small{font-size:75%}h2{font-size:1.4375em}h2 small{font-size:75%}h3{font-size:1.25em}h3 small{font-size:75%}h4{font-size:1em}h4 small{font-size:75%}h5{font-size:0.875em}h5 small{font-size:75%}.gigantic{font-size:45px;font-size:2.8125rem}.mega{font-size:40px;font-size:2.5rem}input[type='text'],input[type='number'],input[type='search'],input[type='password'],input[type='email'],input[type='url'],input[type='tel']{padding:7px 10px;box-shadow:none;width:100%}input[type='text']::placeholder,input[type='number']::placeholder,input[type='search']::placeholder,input[type='password']::placeholder,input[type='email']::placeholder,input[type='url']::placeholder,input[type='tel']::placeholder{color:#888}input[type='text'][disabled],input[type='number'][disabled],input[type='search'][disabled],input[type='password'][disabled],input[type='email'][disabled],input[type='url'][disabled],input[type='tel'][disabled]{color:#888;background-color:transparent}input[type='number']{padding-right:15px}input[type='search']{appearance:textfield}input[type='search']::-webkit-search-decoration,input[type='search']::-webkit-search-cancel-button{appearance:none}input[type='checkbox']{margin:4px 0 0;margin-top:1px 9;line-height:normal}input[type='radio'],input[type='image']{display:inline-block;margin-right:10px}textarea{height:auto;min-height:175px;padding:7px 10px !important;box-shadow:none;width:100%;line-height:20px}textarea::placeholder{color:#888}textarea[disabled]{color:#888;background-color:transparent}select{display:block;clear:both;cursor:pointer;margin:0;background-image:url("../assets/images/forms/chevron-down.svg");background-repeat:no-repeat;background-position:top 14px right 10px;background-color:#fff;padding:7px 30px 7px 10px !important;box-shadow:none;width:100%;-moz-appearance:none;appearance:none;text-indent:.01px;text-overflow:''}select[multiple],select[size]{height:auto;background-image:none;padding-top:10px}select[disabled]{color:#888;background-image:none;background-color:transparent}select:-moz-focusring{color:transparent;text-shadow:0 0 0 #000}select::-ms-expand{display:none}fieldset{background:none;margin-left:0;padding:0}label{display:inline-block;max-width:100%;margin-bottom:5px}[type="checkbox"]:not(:checked),[type="checkbox"]:checked{position:absolute;left:-9999px}[type="checkbox"]+label{height:16px;position:relative;padding-left:25px;cursor:pointer}[type="checkbox"]+label:before{content:'';position:absolute;left:0;top:3px;width:11px;height:11px;border:1px solid #cdcdcd;background:#fff;border-radius:2px}[type="checkbox"]:checked+label:before{background-color:#dd4814;border-color:#dd4814}[type="checkbox"]:checked+label:after{content:'✔';position:absolute;line-height:13px;top:3px;left:3px;font-size:10px;color:#fff;transition:all .2s}@-moz-document url-prefix(){[type="checkbox"]:checked+label:after{font-size:13px;left:1px}}[type="checkbox"][disabled]{cursor:not-allowed}[type="checkbox"][disabled]+label{cursor:not-allowed}[type="checkbox"][disabled]+label:before{opacity:.5}[type="radio"]:not(:checked),[type="radio"]:checked{position:absolute;left:-9999px}[type="radio"]+label{position:relative;padding-left:25px;cursor:pointer}[type="radio"]+label:before{content:'';position:absolute;left:0;top:1px;width:13px;height:13px;border:1px solid #cdcdcd;background:#fff;border-radius:50%}[type="radio"]:checked+label:after{content:'';position:absolute;left:3px;top:4px;width:9px;height:9px;background:#dd4814;border-radius:50%}.tags{width:100%}.tags .tag-list{width:100%;margin:0}.tags .tag-list .tag-item{display:inline-block;float:left;line-height:36px;margin-bottom:0;margin-right:10px;word-wrap:break-word}.tags .tag-list .tag-item .remove-button{border-bottom:0}.tags .input{width:100% !important}.onoffswitch{position:relative;display:inline-block;vertical-align:middle;width:38px;margin:0 0 4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.onoffswitch[disabled] .onoffswitch-checkbox,.onoffswitch[disabled] .onoffswitch-label{opacity:.5;pointer-events:none}.onoffswitch-external-label{display:inline-block;margin-left:5px}.onoffswitch-checkbox{display:none !important}.onoffswitch-label{display:block !important;overflow:hidden;cursor:pointer;border-radius:2px;padding-left:0 !important;margin:0 !important}.onoffswitch-label:before,.onoffswitch-label:after{display:none}.onoffswitch-inner{display:block;width:200%;margin-left:-100%;transition:margin .3s ease-in 0s}.onoffswitch-inner:before,.onoffswitch-inner:after{display:block;float:left;width:50%;height:18px;padding:0;line-height:18px;font-size:14px;color:#fff;font-family:Trebuchet, Arial, sans-serif;font-weight:bold;box-sizing:border-box}.onoffswitch-inner:before{content:'';padding-left:10px;background-color:#38b44a;color:#fff}.onoffswitch-inner:after{content:'';padding-right:10px;background-color:#eee;color:#888;text-align:right}.onoffswitch-switch{display:block;width:19px;height:16px;margin:0;background:#fff;position:absolute;top:0;bottom:0;right:19px;border:1px solid #d2d2d2;border-radius:2px;transition:all .3s ease-in 0s;box-sizing:border-box}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-inner{margin-left:0}.onoffswitch-checkbox:checked+.onoffswitch-label .onoffswitch-switch{right:0}dl dt{clear:left;color:#333}dl dd{color:#333;margin-left:0}dl dt,dl dd{display:inline-block;float:left;line-height:36px;margin-bottom:10px !important;word-wrap:break-word}dl dt:last-child,dl dd:last-child{margin-bottom:0}.wrapper{min-height:100%;height:auto !important;height:100%;margin:0 auto;position:relative;background:rgba(255,255,255,0.4)}.wrapper:after{content:'';position:absolute;display:block;top:0;right:0;bottom:0;left:0;background:url("../assets/images/backgrounds/background-paper.png");height:100%;width:100%;z-index:-1}.wrapper--inner{max-width:1440px;width:100%;margin:0 auto;clear:both;display:block}.row{background-color:transparent;border-top:1px dotted #cdcdcd}.row:first-of-type{border-top:0}.button--secondary{line-height:18px}.button--primary:hover,.button--destructive:hover,.button--positive:hover{color:#fff}.button--base:hover,.button--neutral:hover{color:#333}.button--large{height:auto;padding-top:15px;padding-bottom:15px}.button-group{position:relative;width:100%;vertical-align:middle;clear:both;min-width:160px}.button-group.button-group--inline{display:inline-block;width:auto}.button-group .button-group__link{display:inline-block;float:left;text-align:left;padding-right:35px}.button-group .button-group__link::after{content:'';display:inline-block;position:absolute;top:15px;right:15px;width:4px;height:4px;vertical-align:middle;border-right:1px solid;border-bottom:1px solid;transform:rotate(45deg)}.button-group .button-group__dropdown{border-radius:3px;left:0;margin: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 .3s ease-in;position:absolute;top:36px;clear:both;min-width:160px}.button-group .button-group__item{float:left;clear:both;padding:5px 10px;margin:0;width:100%}.button-group .button-group__item .button-group__item-link{color:#333;cursor:pointer;width:100%;float:left;margin:0;border:0;text-transform:lowercase;white-space:nowrap}.button-group .button-group__item .button-group__item-link:first-letter{text-transform:uppercase}.button-group .button-group__item .button-group__item-link:hover{color:#dd4814;text-decoration:none}.form .form__group{margin-bottom:10px}.form .form__group .form__group-input{position:relative}.form .form__group .form__group-input .form__group-remove{position:absolute;top:10px;right:10px;cursor:pointer;height:16px;width:16px;background:url("../assets/images/icons/remove.svg") no-repeat;background-size:75% 75%;background-position:center;display:inline-block}.form .form__group .form__group-input .icon,.form .form__group .form__group-input .icon--status-failed,.form .form__group .form__group-input .icon--status-in-progress,.form .form__group .form__group-input .icon--status-queued,.form .form__group .form__group-input .icon--status-succeeded,.form .form__group .form__group-input .icon--status-waiting{position:absolute;top:10px;right:10px;display:inline-block}.form .form__group.form__group--subtle .form__group-label{color:#888}.form .form__group.form__group--subtle input,.form .form__group.form__group--subtle select,.form .form__group.form__group--subtle textarea{border-color:#e3e3e3;background-color:transparent}.form .form__group.form__group--subtle input:hover,.form .form__group.form__group--subtle select:hover,.form .form__group.form__group--subtle textarea:hover{border-color:#cdcdcd;background-color:#fff;outline:none}.form .form__group.form__group--subtle input:active,.form .form__group.form__group--subtle input:focus,.form .form__group.form__group--subtle select:active,.form .form__group.form__group--subtle select:focus,.form .form__group.form__group--subtle textarea:active,.form .form__group.form__group--subtle textarea:focus{border-color:#888;background-color:#fff;outline:none}.form .form__fieldset .form__group:last-of-type{margin-bottom:0}.form .form__siblings{float:left;width:100%;margin-bottom:10px}.form .form__siblings:hover .form__group--subtle input,.form .form__siblings:hover .form__group--subtle select,.form .form__siblings:hover .form__group--subtle textarea{border-color:#cdcdcd;background-color:#fff;outline:none}.form .form__siblings.is-active .form__group--subtle input,.form .form__siblings.is-active .form__group--subtle select,.form .form__siblings.is-active .form__group--subtle textarea{border-color:#cdcdcd;background-color:#fff;outline:none}.form.form--stack .form__group{width:100%;float:left}.form.form--stack .form__group [class*='-col']{margin-bottom:0}.form.form--stack .form__group .form__group-label{margin-top:0;margin-bottom:0;line-height:34px;vertical-align:top}.form.form--stack .form__group .form__group-input{min-height:34px}.form.form--stack .form__group .form__group-input .onoffswitch{margin-top:9px}.form.form--inline .form__fieldset{display:inline-block;width:auto;margin:0;vertical-align:middle}.form.form--inline .form__group{display:inline-block;margin:0 20px 0 0;vertical-align:top}.form.form--inline .form__group .form__group-label{margin-bottom:0;margin-right:10px;vertical-align:top;line-height:34px}.form.form--inline .form__group .form__group-label .icon--left{position:absolute;left:0;top:12px}.form.form--inline .form__group input,.form.form--inline .form__group select,.form.form--inline .form__group .form__group-input{display:inline-block;width:auto;min-height:34px}.form.form--inline .form__group [type='checkbox']+label,.form.form--inline .form__group [type='radio']+label{line-height:34px}.form.form--inline .form__group .onoffswitch{margin:9px 0 0}.form.form--inline .form__group .onoffswitch-external-label{margin:0;vertical-align:middle;line-height:34px}.form .form__help-text{font-size:14px;font-size:0.875rem;color:#888}.form__error{margin:0;color:#df382c}.form__error .form__error-item{margin:6px 0}.code-block{overflow:auto;margin:.5em 0;padding:1em;border:1px solid #cdcdcd;border-radius:.5em}.code-block .code-block__line{float:left;clear:both;margin:0}.code-block.code-block--terminal{color:#fff;border:0;background-color:#333}.code-block.code-block--numbering{counter-reset:line-numbering}.code-block.code-block--numbering .code-block__line::before{width:1.5em;padding-right:1em;content:counter(line-numbering);counter-increment:line-numbering;user-select:none;text-align:right;pointer-events:none;opacity:.5}.flash-messages{width:100%;float:left;margin:0}.flash-messages .flash-messages__item{box-sizing:border-box;border-radius:2px;list-style:none;padding:15px 20px;margin:0 0 20px;background:#fff;background-position:top 50% left 15px;background-repeat:no-repeat;box-shadow:0 1px 1px rgba(0,0,0,0.1)}.flash-messages .flash-messages__item:last-of-type{margin-bottom:0}.flash-messages .flash-messages__item.flash-messages__item--error{background:#fff url("../assets/images/icons/error.svg") no-repeat;background-size:16px 16px;background-position:15px center;padding-left:45px}.flash-messages .flash-messages__item.flash-messages__item--info{background:#fff url("../assets/images/icons/info.svg") no-repeat;background-size:16px 16px;background-position:15px center;padding-left:45px}.flash-messages .flash-messages__item.flash-messages__item--warning{background:#fff url("../assets/images/icons/warning.svg") no-repeat;background-size:16px 16px;background-position:15px center;padding-left:45px}.flash-messages .flash-messages__item.flash-messages__item--success{background:#fff url("../assets/images/icons/success.svg") no-repeat;background-size:16px 16px;background-position:15px center;padding-left:45px}.icon,.icon--status-failed,.icon--status-in-progress,.icon--status-queued,.icon--status-succeeded,.icon--status-waiting{width:16px;height:16px;padding:0;border-bottom:0 !important;display:inline-block;vertical-align:middle;text-indent:999em}.icon.icon--add,.icon--add.icon--status-failed,.icon--add.icon--status-in-progress,.icon--add.icon--status-queued,.icon--add.icon--status-succeeded,.icon--add.icon--status-waiting{background:url("../assets/images/icons/add.svg") no-repeat;background-size:100% 100%}.icon.icon--account,.icon--account.icon--status-failed,.icon--account.icon--status-in-progress,.icon--account.icon--status-queued,.icon--account.icon--status-succeeded,.icon--account.icon--status-waiting{background:url("../assets/images/icons/account.svg") no-repeat;background-size:100% 100%}.icon.icon--cross,.icon--cross.icon--status-failed,.icon--cross.icon--status-in-progress,.icon--cross.icon--status-queued,.icon--cross.icon--status-succeeded,.icon--cross.icon--status-waiting{background:url("../assets/images/icons/cross.svg") no-repeat;background-size:100% 100%}.icon.icon--cross-orange,.icon--cross-orange.icon--status-failed,.icon--cross-orange.icon--status-in-progress,.icon--cross-orange.icon--status-queued,.icon--cross-orange.icon--status-succeeded,.icon--cross-orange.icon--status-waiting{background:url("../assets/images/icons/cross-orange.svg") no-repeat;background-size:100% 100%}.icon.icon--debug,.icon--debug.icon--status-failed,.icon--debug.icon--status-in-progress,.icon--debug.icon--status-queued,.icon--debug.icon--status-succeeded,.icon--debug.icon--status-waiting{background:url("../assets/images/icons/debug.svg") no-repeat;background-size:100% 100%}.icon.icon--delete,.icon--delete.icon--status-failed,.icon--delete.icon--status-in-progress,.icon--delete.icon--status-queued,.icon--delete.icon--status-succeeded,.icon--delete.icon--status-waiting{background:url("../assets/images/icons/delete.svg") no-repeat;background-size:100% 100%}.icon.icon--edit,.icon--edit.icon--status-failed,.icon--edit.icon--status-in-progress,.icon--edit.icon--status-queued,.icon--edit.icon--status-succeeded,.icon--edit.icon--status-waiting{background:url("../assets/images/icons/edit.svg") no-repeat;background-size:100% 100%}.icon.icon--error,.icon--error.icon--status-failed,.icon--error.icon--status-in-progress,.icon--error.icon--status-queued,.icon--error.icon--status-succeeded,.icon--error.icon--status-waiting{background:url("../assets/images/icons/error.svg") no-repeat;background-size:100% 100%}.icon.icon--help,.icon--help.icon--status-failed,.icon--help.icon--status-in-progress,.icon--help.icon--status-queued,.icon--help.icon--status-succeeded,.icon--help.icon--status-waiting{background:url("../assets/images/icons/help.svg") no-repeat;background-size:100% 100%}.icon.icon--info,.icon--info.icon--status-failed,.icon--info.icon--status-in-progress,.icon--info.icon--status-queued,.icon--info.icon--status-succeeded,.icon--info.icon--status-waiting{background:url("../assets/images/icons/info.svg") no-repeat;background-size:100% 100%}.icon.icon--loading,.icon--loading.icon--status-failed,.icon--loading.icon--status-in-progress,.icon--loading.icon--status-queued,.icon--loading.icon--status-succeeded,.icon--loading.icon--status-waiting{background:url("../assets/images/icons/loading.png") no-repeat;background-size:100% 100%}.icon.icon--mount,.icon--mount.icon--status-failed,.icon--mount.icon--status-in-progress,.icon--mount.icon--status-queued,.icon--mount.icon--status-succeeded,.icon--mount.icon--status-waiting{background:url("../assets/images/icons/mount.svg") no-repeat;background-size:100% 100%}.icon.icon--unmount,.icon--unmount.icon--status-failed,.icon--unmount.icon--status-in-progress,.icon--unmount.icon--status-queued,.icon--unmount.icon--status-succeeded,.icon--unmount.icon--status-waiting{background:url("../assets/images/icons/unmount.svg") no-repeat;background-size:100% 100%}.icon.icon--partition,.icon--partition.icon--status-failed,.icon--partition.icon--status-in-progress,.icon--partition.icon--status-queued,.icon--partition.icon--status-succeeded,.icon--partition.icon--status-waiting{background:url("../assets/images/icons/partition.svg") no-repeat;background-size:100% 100%}.icon.icon--power-error,.icon--power-error.icon--status-failed,.icon--power-error.icon--status-in-progress,.icon--power-error.icon--status-queued,.icon--power-error.icon--status-succeeded,.icon--power-error.icon--status-waiting{background:url("../assets/images/icons/power-error.svg") no-repeat;background-size:100% 100%}.icon.icon--power-off,.icon--power-off.icon--status-failed,.icon--power-off.icon--status-in-progress,.icon--power-off.icon--status-queued,.icon--power-off.icon--status-succeeded,.icon--power-off.icon--status-waiting{background:url("../assets/images/icons/power-off.svg") no-repeat;background-size:100% 100%}.icon.icon--power-on,.icon--power-on.icon--status-failed,.icon--power-on.icon--status-in-progress,.icon--power-on.icon--status-queued,.icon--power-on.icon--status-succeeded,.icon--power-on.icon--status-waiting{background:url("../assets/images/icons/power-on.svg") no-repeat;background-size:100% 100%}.icon.icon--remove,.icon--remove.icon--status-failed,.icon--remove.icon--status-in-progress,.icon--remove.icon--status-queued,.icon--remove.icon--status-succeeded,.icon--remove.icon--status-waiting{background:url("../assets/images/icons/remove.svg") no-repeat;background-size:100% 100%}.icon.icon--success,.icon--success.icon--status-failed,.icon--success.icon--status-in-progress,.icon--success.icon--status-queued,.icon--success.icon--status-succeeded,.icon--success.icon--status-waiting{background:url("../assets/images/icons/success.svg") no-repeat;background-size:100% 100%}.icon.icon--success-mono,.icon--success-mono.icon--status-failed,.icon--success-mono.icon--status-in-progress,.icon--success-mono.icon--status-queued,.icon--success-mono.icon--status-succeeded,.icon--success-mono.icon--status-waiting{background:url("../assets/images/icons/success-mono.svg") no-repeat;background-size:100% 100%}.icon.icon--success-grey,.icon--success-grey.icon--status-failed,.icon--success-grey.icon--status-in-progress,.icon--success-grey.icon--status-queued,.icon--success-grey.icon--status-succeeded,.icon--success-grey.icon--status-waiting{background:url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="success"><rect id="rect6708" x="0" y="9.99999989e-06" width="16" height="16"></rect><circle id="circle6710" stroke="#888" stroke-width="1.5" fill="#888" cx="8" cy="8.00001" r="7.2500086"></circle><polygon id="path6712" fill="#fff" points="11.80029 4.92345 11.73439 4.98115 6.99964 9.12837 4.22407 6.74743 3.38501 7.69631 7.00033 11.50002 12.5 5.71278 11.80029 4.92349"></polygon></g></g></svg>');background-size:100% 100%}.icon.icon--settings,.icon--settings.icon--status-failed,.icon--settings.icon--status-in-progress,.icon--settings.icon--status-queued,.icon--settings.icon--status-succeeded,.icon--settings.icon--status-waiting{background:url("../assets/images/icons/settings.svg") no-repeat;background-size:100% 100%}.icon.icon--sync,.icon--sync.icon--status-failed,.icon--sync.icon--status-in-progress,.icon--sync.icon--status-queued,.icon--sync.icon--status-succeeded,.icon--sync.icon--status-waiting{background:url("../assets/images/icons/sync.svg") no-repeat;background-size:100% 100%}.icon.icon--search,.icon--search.icon--status-failed,.icon--search.icon--status-in-progress,.icon--search.icon--status-queued,.icon--search.icon--status-succeeded,.icon--search.icon--status-waiting{background:url("../assets/images/icons/magnifying_glass.svg") no-repeat;background-size:100% 100%}.icon.icon--system-shutdown,.icon--system-shutdown.icon--status-failed,.icon--system-shutdown.icon--status-in-progress,.icon--system-shutdown.icon--status-queued,.icon--system-shutdown.icon--status-succeeded,.icon--system-shutdown.icon--status-waiting{background:url("../assets/images/icons/system-shutdown.svg") no-repeat;background-size:100% 100%}.icon.icon--tooltip,.icon--tooltip.icon--status-failed,.icon--tooltip.icon--status-in-progress,.icon--tooltip.icon--status-queued,.icon--tooltip.icon--status-succeeded,.icon--tooltip.icon--status-waiting{background:url("../assets/images/icons/tooltip.svg") no-repeat;background-size:100% 100%}.icon.icon--tags,.icon--tags.icon--status-failed,.icon--tags.icon--status-in-progress,.icon--tags.icon--status-queued,.icon--tags.icon--status-succeeded,.icon--tags.icon--status-waiting{background:url("../assets/images/icons/tags.svg") no-repeat;background-size:100% 100%}.icon.icon--tick,.icon--tick.icon--status-failed,.icon--tick.icon--status-in-progress,.icon--tick.icon--status-queued,.icon--tick.icon--status-succeeded,.icon--tick.icon--status-waiting{background:url("../assets/images/icons/tick.svg") no-repeat;background-size:100% 100%}.icon.icon--logical-volume,.icon--logical-volume.icon--status-failed,.icon--logical-volume.icon--status-in-progress,.icon--logical-volume.icon--status-queued,.icon--logical-volume.icon--status-succeeded,.icon--logical-volume.icon--status-waiting{background:url("../assets/images/icons/logical-volume.svg") no-repeat;background-size:100% 100%}.icon.icon--warning,.icon--warning.icon--status-failed,.icon--warning.icon--status-in-progress,.icon--warning.icon--status-queued,.icon--warning.icon--status-succeeded,.icon--warning.icon--status-waiting{background:url("../assets/images/icons/warning.svg") no-repeat;background-size:100% 100%}.icon.icon--warning-mono,.icon--warning-mono.icon--status-failed,.icon--warning-mono.icon--status-in-progress,.icon--warning-mono.icon--status-queued,.icon--warning-mono.icon--status-succeeded,.icon--warning-mono.icon--status-waiting{background:url("../assets/images/icons/warning-mono.svg") no-repeat}.icon.icon--open,.icon--open.icon--status-failed,.icon--open.icon--status-in-progress,.icon--open.icon--status-queued,.icon--open.icon--status-succeeded,.icon--open.icon--status-waiting{background:url("../assets/images/forms/chevron-down.svg") no-repeat;background-size:10px 4px;background-position:center 4px}.icon.icon--close,.icon--close.icon--status-failed,.icon--close.icon--status-in-progress,.icon--close.icon--status-queued,.icon--close.icon--status-succeeded,.icon--close.icon--status-waiting{background:url("../assets/images/forms/chevron-up.svg") no-repeat;background-size:10px 4px;background-position:center 4px}.icon--status-failed{content:url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="status-queued" transform="translate(1, 1)"><g id="Page-1"><g id="status-queued"><g id="Group"><circle id="Oval" stroke="#ed3146" stroke-width="2" cx="6" cy="6" r="6"></circle><circle id="Oval-Copy" class="status-circle" fill="#ed3146" cx="6" cy="6" r="4"></circle></g></g></g></g></g></svg>')}.icon--status-in-progress{content:url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="status-queued" transform="translate(1, 1)"><g id="Page-1"><g id="status-queued"><g id="Group"><circle id="Oval" stroke="#19b6ee" stroke-width="2" cx="6" cy="6" r="6"></circle><circle id="Oval-Copy" class="status-circle" fill="#19b6ee" cx="6" cy="6" r="4"></circle></g></g></g></g></g></svg>')}.icon--status-queued{content:url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="status-queued" transform="translate(1, 1)"><g id="Page-1"><g id="status-queued"><g id="Group"><circle id="Oval" stroke="#888" stroke-width="2" cx="6" cy="6" r="6"></circle><circle id="Oval-Copy" class="status-circle" fill="#888" cx="6" cy="6" r="4"></circle></g></g></g></g></g></svg>')}.icon--status-succeeded{content:url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="status-queued" transform="translate(1, 1)"><g id="Page-1"><g id="status-queued"><g id="Group"><circle id="Oval" stroke="#3eb34f" stroke-width="2" cx="6" cy="6" r="6"></circle><circle id="Oval-Copy" class="status-circle" fill="#3eb34f" cx="6" cy="6" r="4"></circle></g></g></g></g></g></svg>')}.icon--status-waiting{content:url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="status-queued" transform="translate(1, 1)"><g id="Page-1"><g id="status-queued"><g id="Group"><circle id="Oval" stroke="#f99b0f" stroke-width="2" cx="6" cy="6" r="6"></circle><circle id="Oval-Copy" class="status-circle" fill="#f99b0f" cx="6" cy="6" r="4"></circle></g></g></g></g></g></svg>')}.icon--small{width:14px;height:14px}.icon--large{width:20px;height:20px}.icon--mega{width:23px;height:23px}.icon--gigantic{width:32px;height:32px}h1 .icon,h1 .icon--status-failed,h1 .icon--status-in-progress,h1 .icon--status-queued,h1 .icon--status-succeeded,h1 .icon--status-waiting{margin-top:-6px}h2 .icon,h2 .icon--status-failed,h2 .icon--status-in-progress,h2 .icon--status-queued,h2 .icon--status-succeeded,h2 .icon--status-waiting,h3 .icon,h3 .icon--status-failed,h3 .icon--status-in-progress,h3 .icon--status-queued,h3 .icon--status-succeeded,h3 .icon--status-waiting{margin-top:-5px}h4 .icon,h4 .icon--status-failed,h4 .icon--status-in-progress,h4 .icon--status-queued,h4 .icon--status-succeeded,h4 .icon--status-waiting,h5 .icon,h5 .icon--status-failed,h5 .icon--status-in-progress,h5 .icon--status-queued,h5 .icon--status-succeeded,h5 .icon--status-waiting,p .icon,p .icon--status-failed,p .icon--status-in-progress,p .icon--status-queued,p .icon--status-succeeded,p .icon--status-waiting,label .icon,label .icon--status-failed,label .icon--status-in-progress,label .icon--status-queued,label .icon--status-succeeded,label .icon--status-waiting,button .icon,button .icon--status-failed,button .icon--status-in-progress,button .icon--status-queued,button .icon--status-succeeded,button .icon--status-waiting,a .icon,a .icon--status-failed,a .icon--status-in-progress,a .icon--status-queued,a .icon--status-succeeded,a .icon--status-waiting,th .icon,th .icon--status-failed,th .icon--status-in-progress,th .icon--status-queued,th .icon--status-succeeded,th .icon--status-waiting,td .icon,td .icon--status-failed,td .icon--status-in-progress,td .icon--status-queued,td .icon--status-succeeded,td .icon--status-waiting,.table__header .icon,.table__header .icon--status-failed,.table__header .icon--status-in-progress,.table__header .icon--status-queued,.table__header .icon--status-succeeded,.table__header .icon--status-waiting,.table__data .icon,.table__data .icon--status-failed,.table__data .icon--status-in-progress,.table__data .icon--status-queued,.table__data .icon--status-succeeded,.table__data .icon--status-waiting{margin-top:-3px}.list__tree{list-style:none;border-left:1px solid #d2d2d2;position:relative}.list__tree.list__tree--sub-level{margin-top:10px;margin-left:20px;clear:both}.list__tree.list__tree--sub-level .list__item .list__item-feedback{left:180px}.list__tree .list__item{list-style:none}.list__tree .list__item:before{content:'';width:12px;height:1px;background:#d2d2d2;display:inline-block;position:relative;top:-4px;margin-right:5px}.list__tree .list__item:last-child::after{content:'';width:4px;height:1em;position:absolute;display:block;left:-2px;bottom:-6px;background:#fafafa}.list__tree .list__item .list__item-feedback{position:relative;left:200px;margin-top:-24px}table,.table{border-color:#d2d2d2;border-spacing:0;overflow-x:scroll;margin:0 0 20px;width:100%;text-align:left;border-collapse:separate}table tr,.table table tr,table .table tr,.table .table__row{width:100%;border-color:#b2b2b2;border-bottom-style:dotted;border-bottom-width:1px}table th,.table table th,table .table th,table td,.table table td,table .table td,.table .table__header,.table .table__data{font-size:16px;font-size:1rem;padding:10px;box-sizing:border-box;min-height:21px;background:none;border:0;text-align:left;border-collapse:separate;vertical-align:top;backface-visibility:hidden;position:relative}table thead tr,.table table thead tr,table thead .table tr,.table .table__head .table__row{color:#888;border-bottom:1px solid}table thead tr:hover,.table .table__head .table__row:hover{background-color:transparent}table thead th,.table table thead th,table thead .table th,.table .table__head .table__header{font-size:13px;font-size:0.8125rem;background:none;color:#888;font-size:13px}table thead th input[type="radio"]+label,.table .table__head .table__header input[type="radio"]+label,table thead th input[type="checkbox"]+label,.table .table__head .table__header input[type="checkbox"]+label{margin:0;top:-3px}table thead th a:link,table thead th a:visited,.table .table__head .table__header .table__header-link{color:#888;border-bottom:0}table thead th a:hover:link,table thead th a:hover:visited,.table .table__head .table__header .table__header-link:hover{color:#333;text-decoration:none}table thead th a.is-active:link,table thead th a.is-active:visited,.table .table__head .table__header .is-active.table__header-link{color:#333;text-decoration:none}table thead th a.is-sorted:link,table thead th a.is-sorted:visited,.table .table__head .table__header .is-sorted.table__header-link{border-bottom:1px solid #333}table thead .divide,.table .table__head .table__header-divide,.table .table__head .divide{width:1px;display:inline-block;background:#888;height:10px;margin:0 5px}table .numerical,.table .numerical{text-align:right}table input[type="radio"]+label,.table input[type="radio"]+label,table input[type="checkbox"]+label,.table input[type="checkbox"]+label{margin:0;top:-1px}table th{color:#888;border-bottom:1px solid}table td{border-color:#b2b2b2;border-bottom-style:dotted;border-bottom-width:1px}table td a:link,table td a:visited{color:#333;border-bottom:1px solid #c2c2c2}table td a:link:hover,table td a:visited:hover{text-decoration:none;color:#dd4814}table thead{width:100% !important;display:table-header-group !important}table thead.table__head--sticky{background:#fff;padding:0;width:100vw !important;left:0 !important;right:0 !important;height:auto}table thead.table__head--sticky tr{max-width:1440px;width:100%;margin:0 auto;display:block;float:none;border-bottom:0;overflow:hidden}table thead.table__head--sticky tr th{border-bottom:0;float:left}.table{display:table}.table .table__row{float:left;display:table-row}.table .table__row:hover{background-color:#fff}.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.is-active{background-color:#fff}.table .table__row.is-active .table__controls{z-index:1;opacity:1}.table .table__row.is-active .table__controls--secondary{z-index:1;opacity:1}.table .table__row.is-active .table__dropdown .table__row{display:none}.table .table__row.is-active .table__dropdown .table__row.is-active{display:block}.table .table__header,.table .table__data{display:table-cell;float:left}.table .table__data a:link,.table .table__data a:visited{color:#333;border-bottom:1px solid #c2c2c2}.table .table__data a:link:hover,.table .table__data a:visited:hover{text-decoration:none;color:#dd4814}.table .table__head{display:table-head;width:100%;box-sizing:border-box;width:auto !important}.table .table__head.table__head--sticky{background:#fff;padding:0;width:100vw !important;left:0 !important;right:0 !important;border-top:1px dotted #d2d2d2;box-shadow:0 1px 1px rgba(0,0,0,0.1);height:auto !important}.table .table__head.table__head--sticky .table__row{max-width:1440px;width:100%;margin:0 auto;display:block;float:none;border-bottom:0;overflow:hidden}.table .table__body{display:table-row-group}.table .table__footer{display:table-footer-group}.table .table__label{clear:both;display:block;margin-top:5px;line-height:16px;color:#bcbcbc}.table .table__label a{color:#bcbcbc}.table .table__label a:hover{color:#f7f7f7}.table .table__label.is-active a{color:#f7f7f7}.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__controls a,.table .table__controls a:link,.table .table__controls a:visited{color:#333;border-bottom:1px solid #c2c2c2}.table .table__controls a:hover,.table .table__controls a:link:hover,.table .table__controls a:visited:hover{text-decoration:none;color:#dd4814}.table .table__input{display:inline-block;background-color:#fff;border-color:#d2d2d2;background-position:right 10px top 16px;margin:-7px 0}.table .table__input[disabled]{background-color:transparent;border-color:transparent;pointer-events:none;background-position:-9999px -9999px;color:#333}.table .table__dropdown{width:100%}.table .table__dropdown .table__row{border-bottom:0;display:none;position:relative}.table .table__dropdown .table__row--indent{padding-left:41px !important;float:left;width:100%;box-sizing:border-box}.table .table__dropdown .table__row:before{display:block;margin:0 auto;width:calc(100% - 20px);border-top:1px dotted #d2d2d2;position:absolute;height:1px;content:'';top:0;left:10px}.table .table__dropdown .table__row.table__row--head{border-bottom:0}.table .table__dropdown .table__row.table__row--head .table__header{color:#bcbcbc;font-size:13px}.table .table__dropdown .table__row.u-border--none:before{display:none}.table .table__dropdown .table__row.u-border:before{display:block;margin:0 auto;width:calc(100% - 20px);border-top:1px dotted #d2d2d2;position:absolute;height:1px;content:'';top:0;left:10px}.table .table__dropdown .table__row.is-active .table__input{background-color:#fff;border-color:#d2d2d2;background-position:right 10px top 16px;pointer-events:all}.table .table__dropdown .table__row.is-active .table__input[disabled]{border-color:transparent;cursor:pointer}.table .table__dropdown--info .table__row{border-bottom:0}.table .table__dropdown--info .table__data{color:#bcbcbc}.form .form__group input,.form .form__group select{margin:0}.table--error{border-color:#df382c}.table--error .table__header,.table--error .table__data,.table--error th,.table--error td{border-color:#df382c;background-color:#fadfdd}.table--warning{border-color:#eca918}.table--warning .table__header,.table--warning .table__data,.table--warning th,.table--warning td{border-color:#eca918;background-color:#fcefd4}.table--success{border-color:#38b44a}.table--success .table__header,.table--success .table__data,.table--success th,.table--success td{border-color:#38b44a;background-color:#caeecf}.table--information{border-color:#19b6ee}.table--information .table__header,.table--information .table__data,.table--information th,.table--information td{border-color:#19b6ee;background-color:#d7f2fc}.table-col--1{width:1%}.table-col--2{width:2%}.table-col--3{width:3%}.table-col--4{width:4%}.table-col--5{width:5%}.table-col--6{width:6%}.table-col--7{width:7%}.table-col--8{width:8%}.table-col--9{width:9%}.table-col--10{width:10%}.table-col--11{width:11%}.table-col--12{width:12%}.table-col--13{width:13%}.table-col--14{width:14%}.table-col--15{width:15%}.table-col--16{width:16%}.table-col--17{width:17%}.table-col--18{width:18%}.table-col--19{width:19%}.table-col--20{width:20%}.table-col--21{width:21%}.table-col--22{width:22%}.table-col--23{width:23%}.table-col--24{width:24%}.table-col--25{width:25%}.table-col--26{width:26%}.table-col--27{width:27%}.table-col--28{width:28%}.table-col--29{width:29%}.table-col--30{width:30%}.table-col--31{width:31%}.table-col--32{width:32%}.table-col--33{width:33%}.table-col--34{width:34%}.table-col--35{width:35%}.table-col--36{width:36%}.table-col--37{width:37%}.table-col--38{width:38%}.table-col--39{width:39%}.table-col--40{width:40%}.table-col--41{width:41%}.table-col--42{width:42%}.table-col--43{width:43%}.table-col--44{width:44%}.table-col--45{width:45%}.table-col--46{width:46%}.table-col--47{width:47%}.table-col--48{width:48%}.table-col--49{width:49%}.table-col--50{width:50%}.table-col--51{width:51%}.table-col--52{width:52%}.table-col--53{width:53%}.table-col--54{width:54%}.table-col--55{width:55%}.table-col--56{width:56%}.table-col--57{width:57%}.table-col--58{width:58%}.table-col--59{width:59%}.table-col--60{width:60%}.table-col--61{width:61%}.table-col--62{width:62%}.table-col--63{width:63%}.table-col--64{width:64%}.table-col--65{width:65%}.table-col--66{width:66%}.table-col--67{width:67%}.table-col--68{width:68%}.table-col--69{width:69%}.table-col--70{width:70%}.table-col--71{width:71%}.table-col--72{width:72%}.table-col--73{width:73%}.table-col--74{width:74%}.table-col--75{width:75%}.table-col--76{width:76%}.table-col--77{width:77%}.table-col--78{width:78%}.table-col--79{width:79%}.table-col--80{width:80%}.table-col--81{width:81%}.table-col--82{width:82%}.table-col--83{width:83%}.table-col--84{width:84%}.table-col--85{width:85%}.table-col--86{width:86%}.table-col--87{width:87%}.table-col--88{width:88%}.table-col--89{width:89%}.table-col--90{width:90%}.table-col--91{width:91%}.table-col--92{width:92%}.table-col--93{width:93%}.table-col--94{width:94%}.table-col--95{width:95%}.table-col--96{width:96%}.table-col--97{width:97%}.table-col--98{width:98%}.table-col--99{width:99%}.table-col--100{width:100%}.tabs{display:inline-block}.tabs .tabs__tab{font-size:18px;font-size:1.125rem;display:inline-block;list-style-type:none}.tabs .tabs__tab .tabs__tab-link{color:#888;text-decoration:none;border-bottom:0}.tabs .tabs__tab:hover .tabs__tab-link{border-bottom:3px solid #888}.tabs .tabs__tab:after{content:'';width:1px;display:inline-block;background:#d2d2d2;height:11px;padding:0;margin:0 5px}.tabs .tabs__tab:last-child::after{display:none}.tabs .is-active .tabs__tab-link,.tabs .is-active:hover .tabs__tab-link{border-bottom:3px solid #dd4814}.tooltip{position:relative}.tooltip::before{position:absolute;left:50%;transform:translateX(-50%) translateY(-14px);content:'';width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;z-index:-1;border-top:5px solid #333;opacity:0;visibility:hidden;bottom:100%;margin-bottom:-11px}.tooltip::after{content:attr(aria-label);font-size:13px;font-weight:400;line-height:16px;position:absolute;z-index:-1;left:50%;bottom:100%;transform:translateX(-50%) translateY(-8px);background:#333;color:#fff;padding:10px;height:auto;text-indent:0;opacity:0;visibility:hidden;border-radius:5px;box-shadow:0 1px 3px 0 rgba(51,51,51,0.2);white-space:pre;box-sizing:border-box;font-style:normal}.tooltip:hover::after,.tooltip:hover::before{opacity:1 !important;z-index:1000;visibility:visible}.tooltip.tooltip--right::before{border-top:5px solid transparent;border-right:5px solid #333;border-bottom:5px solid transparent;left:100%;bottom:inherit;top:50%;transform:translateX(4px) translateY(-50%)}.tooltip.tooltip--right::after{left:100%;bottom:inherit;top:50%;margin-bottom:-14px;transform:translateX(14px) translateY(-50%)}.tooltip.tooltip--bottom::before{border-top:0;border-right:5px solid transparent;border-bottom:5px solid #333;border-left:5px solid transparent;left:50%;bottom:inherit;top:100%;transform:translateX(-50%) translateY(8px)}.tooltip.tooltip--bottom::after{left:50%;bottom:inherit;top:100%;margin-bottom:0;transform:translateX(-50%) translateY(13px)}.tooltip.tooltip--left::before{border-top:5px solid transparent;border-left:5px solid #333;border-bottom:5px solid transparent;left:-4px;bottom:inherit;top:50%;transform:translateX(-100%) translateY(-50%)}.tooltip.tooltip--left::after{left:-14px;bottom:inherit;top:50%;margin-bottom:-14px;transform:translateX(-100%) translateY(-50%)}.accordion{box-sizing:border-box;border-radius:2px;list-style:none;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);margin-bottom:40px}.accordion.is-disabled{opacity:.5;pointer-events:none}.accordion .accordion__title{font-size:20px;font-size:1.25rem;border-bottom:1px dotted #b2b2b2;padding:8px 20px 9px;margin:0}.accordion .accordion__tab{border-bottom:1px dotted #b2b2b2}.accordion .accordion__tab:last-of-type{border:0}.accordion .accordion__tab .accordion__tab-title.is-active{background-image:url("../assets/images/forms/chevron_up.svg")}.accordion .accordion__tab .accordion__tab-title.is-active+.accordion__tab-content{max-height:400px;transition:max-height .5s ease-in}.accordion .accordion__tab .accordion__tab-content{max-height:0;transition:max-height .5s ease-out;overflow:hidden;overflow:auto}.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:.15em}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item .accordion__tab-link{box-sizing:border-box;color:#333;width:100%;display:inline-block;padding-right:20px;border-bottom:0;outline:0}.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.is-active{margin-bottom:.15em;font-weight:400}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.is-active .accordion__tab-link{background:transparent url("../assets/images/icons/cross.svg") top 7px right 0 no-repeat;text-decoration:none}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.is-active:hover{color:#f7f7f7}.accordion .accordion__tab .accordion__tab-content .accordion__tab-list .accordion__tab-item.is-active:hover .accordion__tab-link{color:#dd4814;background-image:url("../assets/images/icons/cross_orange.svg")}.accordion .accordion__tab .accordion__tab-title,.accordion .accordion__tab .accordion__tab-title.is-active{padding:12px 20px;margin:0;color:#888;cursor:pointer;background:transparent url("../assets/images/forms/chevron_down.svg") top 20px right 20px no-repeat}.action-card{background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);margin-bottom:40px;padding:20px 20px 10px;box-sizing:border-box;width:100%;display:inline-block;clear:both}.action-card .action-card__title{font-size:23px;margin-bottom:20px}.action-card .action-card__controls{border-top:1px dotted #888;width:100%;display:inline-block;margin:10px 0 0;padding:10px 0 0;box-sizing:border-box}.banner{background-color:#000}@media only screen and (min-width: 620px){.banner{box-shadow:none}.banner .nav-primary{max-width:none}.banner .nav-primary .logo{height:auto;margin-top:12px}.banner .nav-primary .logo a{border-bottom:0}.banner .nav-primary ul li{border-left:1px solid #333}.banner .nav-primary ul li:last-child{border-right:1px solid #333;border-left:1px solid #333}.banner .nav-primary ul li a,.banner .nav-primary ul li a:link,.banner .nav-primary ul li a:visited{box-sizing:border-box;border-bottom:0;border-left:0}.banner .nav-primary ul li a:hover,.banner .nav-primary ul li a:link:hover,.banner .nav-primary ul li a:visited:hover{background-color:rgba(51,51,51,0.9)}.banner .nav-primary ul li a.active,.banner .nav-primary ul li a:link.active,.banner .nav-primary ul li a:visited.active{background-color:transparent;box-shadow:inset 0px -3px #dd4814}.banner .nav-primary ul li a.active:hover,.banner .nav-primary ul li a:link.active:hover,.banner .nav-primary ul li a:visited.active:hover{background-color:rgba(51,51,51,0.9)}}.page-header{box-sizing:border-box;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);padding:0 20px;height:auto !important;width:100%;float:left;margin-bottom:20px}.page-header .page-header__title{font-size:32px;font-size:2rem;margin:0;padding:34px 0;display:inline-block}.page-header .page-header__title [contenteditable="true"]{font-size:32px;font-size:2rem;padding:8px 10px;width:auto;box-sizing:border-box;border:1px solid transparent;margin:-20px 0 -20px -10px;border-radius:2px;color:#333;cursor:default;display:inline-block}.page-header .page-header__title [contenteditable="true"].editmode,.page-header .page-header__title [contenteditable="true"].editable:hover{border:1px solid #D2D2D2;cursor:text}.page-header .page-header__title [contenteditable="true"].editmode:hover,.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:#df382c}.page-header .page-header__title .page-header__title-dot{display:inline-block;width:auto;padding:0}.page-header .page-header__title .page-header__title-domain{font-size:32px;font-size:2rem;display:inline-block;width:auto;min-height:66px;max-height:66px;line-height:25px;margin:-20px 0;background-position:top 32px right 10px;padding:13px 10px !important}.page-header .page-header__status{font-size:19px;font-size:1.1875rem;width:auto;display:inline-block;position:relative;margin-left:20px;color:#888}.page-header .page-header__status .page-header__status-check{font-size:16px;font-size:1rem;margin-left:10px;color:inherit;border:0}.page-header .page-header__status .page-header__status-check:hover{text-decoration:underline}.page-header .page-header__controls{padding:40px 0;display:inline-block;float:right}.page-header .page-header__controls .page-header__controls-feedback{color:#333;text-decoration:none;border-bottom:1px solid #c2c2c2}.page-header .page-header__controls .page-header__controls-feedback:hover{text-decoration:none;color:#dd4814;cursor:pointer}.page-header .page-header__dropdown{max-height:0;overflow:hidden;-webkit-transition:max-height 0.3s ease;-moz-transition:max-height 0.3s ease;transition:max-height 0.3s ease}.page-header .page-header__dropdown.is-open{max-height:1000px}.page-header .page-header__dropdown .page-header__section{border-top:1px dotted #888;padding-top:20px;padding-bottom:20px}.page-header .page-header__dropdown .page-header__message{width:auto;display:inline-block;float:none;margin:0 20px 0 0;line-height:36px}.page-header .page-header__dropdown .page-header__message--error{background:url("../assets/images/icons/error.svg") no-repeat;background-size:16px 16px;background-position:0 10px;padding-left:25px}.page-header .page-header__dropdown .page-header__message--info{background:url("../assets/images/icons/info.svg") no-repeat;background-size:16px 16px;background-position:0 10px;padding-left:25px}.page-header .page-header__dropdown .page-header__message--warning{background:url("../assets/images/icons/warning.svg") no-repeat;background-size:16px 16px;background-position:0 10px;padding-left:25px}.page-header .page-header__dropdown .page-header__message--success{background:url("../assets/images/icons/success.svg") no-repeat;background-size:16px 16px;background-position:0 10px;padding-left:25px}.page-header .page-header__dropdown .page-header__controls{padding:0;float:right}.search{position:relative}.search .search__input{font-size:16px;font-size:1rem;box-sizing:border-box;border-radius:4px;list-style:none;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,0.1);width:100%;border:0;padding:15px;appearance:textfield}.search .search__input::placeholder{color:#888}.search .search__input::-ms-clear{display:none}.search .search__input::-webkit-search-decoration,.search .search__input::-webkit-search-cancel-button,.search .search__input::-webkit-search-results-button,.search .search__input::-webkit-search-results-decoration{display:none}.search .search__input:disabled,.search .search__input.search--disabled{background-color:#fff;opacity:.5;pointer-events:none}.search .search__input:disabled+.search__submit,.search .search__input.search--disabled+.search__submit{pointer-events:none;opacity:.5}.search .search__submit{position:absolute;top:15px;right:15px;background-color:transparent;background-image:url("../assets/images/icons/magnifying_glass.svg");background-position:center;background-repeat:no-repeat;background-size:20px;text-indent:-999em;display:block;width:20px;height:20px;overflow:hidden;outline:none;padding:0;border:0}.search .search__submit:hover{background-color:transparent;background-image:url("../assets/images/icons/magnifying_glass.svg")}.search .search__submit.search__submit--close{background-image:url("../assets/images/icons/remove.svg");background-size:16px}.u-animation--spin{animation:spin 1s infinite linear !important}.u-animation--pulse{animation:pulse 1s ease-out !important;animation-iteration-count:infinite !important;opacity:0}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes pulse{0%{transform:scale(0.1, 0.1);opacity:0}50%{opacity:1}100%{transform:scale(1.2, 1.2);opacity:0}}.u-border{border:1px dotted #cdcdcd !important}.u-border--top{border-top:1px dotted #cdcdcd !important}.u-border--right{border-right:1px dotted #cdcdcd !important}.u-border--bottom{border-bottom:1px dotted #cdcdcd !important}.u-border--left{border-left:1px dotted #cdcdcd !important}.u-border--dotted{border-style:dotted !important}.u-border--solid{border-style:solid !important}.u-border--dashed{border-style:dashed !important}.u-border--none{border:0 !important}.u-align--right{text-align:right !important}.u-align--left{text-align:left !important}.u-align--center{text-align:center !important}.u-position--relative{position:relative !important}.u-position--fixed{position:fixed !important}.u-position--absolute{position:absolute !important}.u-float--right{float:right !important}.u-float--left{float:left !important}.u-float--none{float:none !important}.u-muted{opacity:.5 !important;filter:alpha(opacity=50) !important}.u-clear{clear:both !important}.u-display--block{display:block !important}.u-display--inline{display:inline !important}.u-display--inline-block{display:inline-block !important}.u-display--hidden{display:none !important}.u-width--full{width:100% !important}.u-width--half{width:50% !important}.u-width--third{width:calc(100%/3) !important}.u-width--quater{width:25% !important}.u-margin{margin:20px}.u-margin--none{margin:0 !important}.u-margin--tiny{margin:5px !important}.u-margin--small{margin:10px !important}.u-margin--medium{margin:30px !important}.u-margin--large{margin:40px !important}.u-margin--huge{margin:80px !important}.u-margin--top{margin-top:20px !important}.u-margin--top-none{margin-top:0 !important}.u-margin--top-tiny{margin-top:5px !important}.u-margin--top-small{margin-top:10px !important}.u-margin--top-medium{margin-top:30px !important}.u-margin--top-large{margin-top:40px !important}.u-margin--top-huge{margin-top:80px !important}.u-margin--right{margin-right:20px !important}.u-margin--right-none{margin-right:0 !important}.u-margin--right-tiny{margin-right:5px !important}.u-margin--right-small{margin-right:10px !important}.u-margin--right-medium{margin-right:30px !important}.u-margin--right-large{margin-right:40px !important}.u-margin--right-huge{margin-right:80px !important}.u-margin--bottom{margin-bottom:20px !important}.u-margin--bottom-none{margin-bottom:0 !important}.u-margin--bottom-tiny{margin-bottom:5px !important}.u-margin--bottom-small{margin-bottom:10px !important}.u-margin--bottom-medium{margin-bottom:30px !important}.u-margin--bottom-large{margin-bottom:40px !important}.u-margin--bottom-huge{margin-bottom:80px !important}.u-margin--left{margin-left:20px !important}.u-margin--left-none{margin-left:0 !important}.u-margin--left-tiny{margin-left:5px !important}.u-margin--left-small{margin-left:10px !important}.u-margin--left-medium{margin-left:30px !important}.u-margin--left-large{margin-left:40px !important}.u-margin--left-huge{margin-left:80px !important}.u-padding{padding:20px}.u-padding--none{padding:0 !important}.u-padding--tiny{padding:5px !important}.u-padding--small{padding:10px !important}.u-padding--medium{padding:30px !important}.u-padding--large{padding:40px !important}.u-padding--huge{padding:80px !important}.u-padding--top{padding-top:20px !important}.u-padding--top-none{padding-top:0 !important}.u-padding--top-tiny{padding-top:5px !important}.u-padding--top-small{padding-top:10px !important}.u-padding--top-medium{padding-top:30px !important}.u-padding--top-large{padding-top:40px !important}.u-padding--top-huge{padding-top:80px !important}.u-padding--right{padding-right:20px !important}.u-padding--right-none{padding-right:0 !important}.u-padding--right-tiny{padding-right:5px !important}.u-padding--right-small{padding-right:10px !important}.u-padding--right-medium{padding-right:30px !important}.u-padding--right-large{padding-right:40px !important}.u-padding--right-huge{padding-right:80px !important}.u-padding--bottom{padding-bottom:20px !important}.u-padding--bottom-none{padding-bottom:0 !important}.u-padding--bottom-tiny{padding-bottom:5px !important}.u-padding--bottom-small{padding-bottom:10px !important}.u-padding--bottom-medium{padding-bottom:30px !important}.u-padding--bottom-large{padding-bottom:40px !important}.u-padding--bottom-huge{padding-bottom:80px !important}.u-padding--left{padding-left:20px !important}.u-padding--left-none{padding-left:0 !important}.u-padding--left-tiny{padding-left:5px !important}.u-padding--left-small{padding-left:10px !important}.u-padding--left-medium{padding-left:30px !important}.u-padding--left-large{padding-left:40px !important}.u-padding--left-huge{padding-left:80px !important}.u-text--subtle{color:#888;font-size:.9375rem}.u-text--error{color:#df382c !important}.u-border--error{border-color:#df382c !important}.u-background--error{background-color:#df382c !important}.has-error{border:1px solid #df382c !important}.has-error:focus{border:1px solid #df382c !important}.u-text--off{color:#d2d2d2 !important}.u-border--off{border-color:#d2d2d2 !important}.u-background--off{background-color:#d2d2d2 !important}.has-off{border:1px solid #d2d2d2 !important}.has-off:focus{border:1px solid #d2d2d2 !important}.u-text--warning{color:#eca918 !important}.u-border--warning{border-color:#eca918 !important}.u-background--warning{background-color:#eca918 !important}.has-warning{border:1px solid #eca918 !important}.has-warning:focus{border:1px solid #eca918 !important}.u-text--success{color:#38b44a !important}.u-border--success{border-color:#38b44a !important}.u-background--success{background-color:#38b44a !important}.has-success{border:1px solid #38b44a !important}.has-success:focus{border:1px solid #38b44a !important}.u-text--on{color:#38b44a !important}.u-border--on{border-color:#38b44a !important}.u-background--on{background-color:#38b44a !important}.has-on{border:1px solid #38b44a !important}.has-on:focus{border:1px solid #38b44a !important}.u-text--information{color:#19b6ee !important}.u-border--information{border-color:#19b6ee !important}.u-background--information{background-color:#19b6ee !important}.has-information{border:1px solid #19b6ee !important}.has-information:focus{border:1px solid #19b6ee !important}.u-text--loading{color:#2ab7ec !important}.u-border--loading{border-color:#2ab7ec !important}.u-background--loading{background-color:#2ab7ec !important}.has-loading{border:1px solid #2ab7ec !important}.has-loading:focus{border:1px solid #2ab7ec !important}.u-vertical-align{position:relative;top:50%;transform:translateY(-50%)}.u-text--truncate{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.hidden{display:none}.small-icon{width:12px}.images-info{text-align:center;padding:10px}.images-warning{box-sizing:border-box;border-radius:2px;list-style:none;padding:15px 20px 15px 45px;background-repeat:no-repeat;box-shadow:0 1px 1px rgba(0,0,0,0.1);background:#fff url("../assets/images/icons/error.svg") no-repeat;background-size:16px 16px;background-position:15px center;margin-bottom:20px}#loader{width:10px;margin:16px auto 0 auto}#importing{box-sizing:border-box;border-radius:2px;list-style:none;padding:15px;font-size:16px;margin:0 0 20px;background:#fff;background-position:top 50% left 15px;background-repeat:no-repeat;box-shadow:0 1px 1px rgba(0,0,0,0.1)}#importing .spinner{margin-top:-3px}.spinner{width:16px;height:16px;padding:0;border-bottom:0 !important;display:inline-block;vertical-align:middle;text-indent:999em;background:url("../assets/images/icons/loading.png") no-repeat;background-size:100% 100%}.spin{animation:spin 1s infinite linear !important}.importing-dot{opacity:0;-webkit-animation:dot 1.3s infinite;animation:dot 1.3s infinite}.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:13px;right:15px}.script-content{width:100%;overflow:hidden}.script-content .content{margin:20px 0 0}
1564
1565=== renamed file 'src/maasserver/static/css/build.css' => 'src/maasserver/static/css/build.css.moved'
1566=== modified file 'src/maasserver/static/js/angular/controllers/dashboard.js'
1567=== modified file 'src/maasserver/static/js/angular/controllers/node_details.js'
1568=== modified file 'src/maasserver/static/js/angular/controllers/tests/test_dashboard.js'
1569=== modified file 'src/maasserver/static/js/angular/controllers/tests/test_node_details.js'
1570--- src/maasserver/static/js/angular/controllers/tests/test_node_details.js 2017-04-20 08:58:42 +0000
1571+++ src/maasserver/static/js/angular/controllers/tests/test_node_details.js 2017-04-25 09:34:40 +0000
1572@@ -1039,46 +1039,89 @@
1573 });
1574 });
1575
1576- it("calls performAction with hwe kernel", function() {
1577- var controller = makeController();
1578- spyOn(MachinesManager, "performAction").and.returnValue(
1579- $q.defer().promise);
1580- $scope.node = node;
1581- $scope.action.option = {
1582- name: "deploy"
1583- };
1584- $scope.osSelection.osystem = "ubuntu";
1585- $scope.osSelection.release = "ubuntu/xenial";
1586- $scope.osSelection.hwe_kernel = "hwe-16.04-edge";
1587- $scope.actionGo();
1588- expect(MachinesManager.performAction).toHaveBeenCalledWith(
1589- node, "deploy", {
1590- osystem: "ubuntu",
1591- distro_series: "xenial",
1592- hwe_kernel: "hwe-16.04-edge"
1593- });
1594- });
1595-
1596- it("calls performAction with ga kernel", function() {
1597- var controller = makeController();
1598- spyOn(MachinesManager, "performAction").and.returnValue(
1599- $q.defer().promise);
1600- $scope.node = node;
1601- $scope.action.option = {
1602- name: "deploy"
1603- };
1604- $scope.osSelection.osystem = "ubuntu";
1605- $scope.osSelection.release = "ubuntu/xenial";
1606- $scope.osSelection.hwe_kernel = "ga-16.04";
1607- $scope.actionGo();
1608- expect(MachinesManager.performAction).toHaveBeenCalledWith(
1609- node, "deploy", {
1610- osystem: "ubuntu",
1611- distro_series: "xenial",
1612- hwe_kernel: "ga-16.04"
1613- });
1614- });
1615-
1616+<<<<<<< TREE
1617+ it("calls performAction with hwe kernel", function() {
1618+ var controller = makeController();
1619+ spyOn(MachinesManager, "performAction").and.returnValue(
1620+ $q.defer().promise);
1621+ $scope.node = node;
1622+ $scope.action.option = {
1623+ name: "deploy"
1624+ };
1625+ $scope.osSelection.osystem = "ubuntu";
1626+ $scope.osSelection.release = "ubuntu/xenial";
1627+ $scope.osSelection.hwe_kernel = "hwe-16.04-edge";
1628+ $scope.actionGo();
1629+ expect(MachinesManager.performAction).toHaveBeenCalledWith(
1630+ node, "deploy", {
1631+ osystem: "ubuntu",
1632+ distro_series: "xenial",
1633+ hwe_kernel: "hwe-16.04-edge"
1634+ });
1635+ });
1636+
1637+ it("calls performAction with ga kernel", function() {
1638+ var controller = makeController();
1639+ spyOn(MachinesManager, "performAction").and.returnValue(
1640+ $q.defer().promise);
1641+ $scope.node = node;
1642+ $scope.action.option = {
1643+ name: "deploy"
1644+ };
1645+ $scope.osSelection.osystem = "ubuntu";
1646+ $scope.osSelection.release = "ubuntu/xenial";
1647+ $scope.osSelection.hwe_kernel = "ga-16.04";
1648+ $scope.actionGo();
1649+ expect(MachinesManager.performAction).toHaveBeenCalledWith(
1650+ node, "deploy", {
1651+ osystem: "ubuntu",
1652+ distro_series: "xenial",
1653+ hwe_kernel: "ga-16.04"
1654+ });
1655+ });
1656+
1657+=======
1658+ it("calls performAction with hwe kernel", function() {
1659+ var controller = makeController();
1660+ spyOn(MachinesManager, "performAction").and.returnValue(
1661+ $q.defer().promise);
1662+ $scope.node = node;
1663+ $scope.actionOption = {
1664+ name: "deploy"
1665+ };
1666+ $scope.osSelection.osystem = "ubuntu";
1667+ $scope.osSelection.release = "ubuntu/xenial";
1668+ $scope.osSelection.hwe_kernel = "hwe-16.04-edge";
1669+ $scope.actionGo();
1670+ expect(MachinesManager.performAction).toHaveBeenCalledWith(
1671+ node, "deploy", {
1672+ osystem: "ubuntu",
1673+ distro_series: "xenial",
1674+ hwe_kernel: "hwe-16.04-edge"
1675+ });
1676+ });
1677+
1678+ it("calls performAction with ga kernel", function() {
1679+ var controller = makeController();
1680+ spyOn(MachinesManager, "performAction").and.returnValue(
1681+ $q.defer().promise);
1682+ $scope.node = node;
1683+ $scope.actionOption = {
1684+ name: "deploy"
1685+ };
1686+ $scope.osSelection.osystem = "ubuntu";
1687+ $scope.osSelection.release = "ubuntu/xenial";
1688+ $scope.osSelection.hwe_kernel = "ga-16.04";
1689+ $scope.actionGo();
1690+ expect(MachinesManager.performAction).toHaveBeenCalledWith(
1691+ node, "deploy", {
1692+ osystem: "ubuntu",
1693+ distro_series: "xenial",
1694+ hwe_kernel: "ga-16.04"
1695+ });
1696+ });
1697+
1698+>>>>>>> MERGE-SOURCE
1699 it("calls performAction with commissionOptions", function() {
1700 var controller = makeController();
1701 spyOn(MachinesManager, "performAction").and.returnValue(
1702
1703=== modified file 'src/maasserver/static/js/angular/directives/boot_images.js'
1704=== modified file 'src/maasserver/static/js/angular/directives/error_overlay.js'
1705=== modified file 'src/maasserver/static/js/angular/directives/maas_obj_form.js'
1706=== modified file 'src/maasserver/static/js/angular/directives/tests/test_boot_images.js'
1707=== modified file 'src/maasserver/static/js/angular/directives/tests/test_maas_obj_form.js'
1708=== modified file 'src/maasserver/static/js/angular/maas.js'
1709--- src/maasserver/static/js/angular/maas.js 2017-03-10 18:38:46 +0000
1710+++ src/maasserver/static/js/angular/maas.js 2017-04-25 09:34:40 +0000
1711@@ -8,8 +8,13 @@
1712 * conflicts with Django templates.
1713 */
1714
1715+<<<<<<< TREE
1716 angular.module('MAAS',
1717 ['ngRoute', 'ngCookies', 'ngSanitize', 'ngTagsInput', 'sticky']).config(
1718+=======
1719+angular.module('MAAS',
1720+ ['ngRoute', 'ngCookies', 'ngTagsInput', 'sticky']).config(
1721+>>>>>>> MERGE-SOURCE
1722 function($interpolateProvider, $routeProvider, $httpProvider) {
1723 $interpolateProvider.startSymbol('{$');
1724 $interpolateProvider.endSymbol('$}');
1725
1726=== modified file 'src/maasserver/static/partials/boot-images.html'
1727=== modified file 'src/maasserver/static/partials/dashboard.html'
1728--- src/maasserver/static/partials/dashboard.html 2017-04-18 10:57:48 +0000
1729+++ src/maasserver/static/partials/dashboard.html 2017-04-25 09:34:40 +0000
1730@@ -1,3 +1,4 @@
1731+<<<<<<< TREE
1732 <header class="page-header" sticky media-query="min-width: 769px" window-width>
1733 <div class="wrapper--inner">
1734 <h1 class="page-header__title">Device discovery</h1>
1735@@ -117,8 +118,156 @@
1736 <dt class="two-col">Subnet</dt>
1737 <dd class="four-col last-col">{$ getSubnetName(discovery.subnet) $}</dd>
1738 </dl>
1739+=======
1740+<div data-ng-hide="loaded">
1741+ <header class="page-header" sticky>
1742+ <div class="wrapper--inner">
1743+ <h1 class="page-header__title">Device discovery</h1>
1744+ <p class="page-header__status">
1745+ <span class="u-text--loading"><i class="icon u-margin--right-tiny icon--loading u-animation--spin"></i>Searching network for devices&hellip;</span>
1746+ </p>
1747+ </div>
1748+ </header>
1749+ <section class="row">
1750+ <div class="wrapper--inner">
1751+ <div class="twelve-col">
1752+ <table>
1753+ <thead>
1754+ <tr>
1755+ <th class="table-col--37">Name</th>
1756+ <th class="table-col--15">Mac address</th>
1757+ <th class="table-col--13">IP</th>
1758+ <th class="table-col--15">Rack</th>
1759+ <th class="table-col--20">Last seen</th>
1760+ </tr>
1761+ </thead>
1762+ <tbody>
1763+ <tr>
1764+ <td colspan="5">
1765+ No new discoveries
1766+ </td>
1767+ </tr>
1768+ </tbody>
1769+ </table>
1770+ </div>
1771+ </div>
1772+ </section>
1773+</div>
1774+<div class="ng-hide" data-ng-show="loaded">
1775+ <header class="page-header" sticky>
1776+ <div class="wrapper--inner">
1777+ <h1 class="page-header__title">Device discovery</h1>
1778+ <p class="page-header__status" >{$ discoveredDevices.length $} items discovered</p>
1779+ <div class="page-header__controls" data-ng-if="networkDiscovery">
1780+ <maas-obj-form obj="networkDiscovery" manager="configManager" inline="true">
1781+ <maas-obj-field type="onoffswitch" key="value" label="Discovery enabled"
1782+ on-value="enabled" off-value="disabled" subtle="true" label-left="true"
1783+ label-info="When enabled, MAAS will use passive techniques, such as listening to&#xa; ARP requests and DNS advertisements, to observe networks attached&#xa; to rack controllers. Active subnet mapping can also be enabled in the&#xa; Device Discovery section of the Settings page."></maas-obj-field>
1784+ </maas-obj-form>
1785+ </div>
1786+ </div>
1787+ </header>
1788+ <section class="row">
1789+ <div class="wrapper--inner">
1790+ <ul class="flash-messages u-padding--bottom" data-ng-if="networkDiscovery.value === 'disabled'">
1791+ <li class="flash-messages__item flash-messages__item--warning">List of devices will not update as discovery is turned off</li>
1792+ </ul>
1793+ <div class="twelve-col">
1794+ <div class="table" >
1795+ <header class="table__head" sticky sticky-class="table__head--sticky" offset="116">
1796+ <div class="table__row">
1797+ <div class="table__header table-col--37">Name</div>
1798+ <div class="table__header table-col--15">Mac address</div>
1799+ <div class="table__header table-col--13">IP</div>
1800+ <div class="table__header table-col--15">Rack</div>
1801+ <div class="table__header table-col--20">Last seen</div>
1802+ </div>
1803+ </header>
1804+ <div class="table__body">
1805+ <div class="table__row table--success" data-ng-if="convertTo.saved">
1806+ <div class="table__data table-col--97">
1807+ <i class="icon icon--success"></i> {$ convertTo.hostname $} has been add to {$ site $}.
1808+ <a href="#/node/{$ convertTo.parent $}" data-ng-if="convertTo.parent">Go to the machine devices page.</a>
1809+ <a href="#/nodes/?tab=devices" data-ng-if="!convertTo.parent">Go to the device listing.</a>
1810+ </div>
1811+ <div class="table__data table-col--3">
1812+ <i class="icon icon--cross tooltip" aria-label="Clear"
1813+ data-ng-click="convertTo.saved = false">Clear</i>
1814+ </div>
1815+ </div>
1816+ <div class="table__row" data-ng-if="!discoveredDevices.length">
1817+ <div class="table__data table-col--100">
1818+ No new discoveries
1819+ </div>
1820+ </div>
1821+ <div class="table__row"
1822+ data-ng-repeat="discovery in discoveredDevices | orderBy:'-last_seen' track by discovery.first_seen"
1823+ data-ng-class="{'is-active' : discovery.first_seen === selectedDevice}">
1824+ <div data-ng-if="discovery.first_seen !== selectedDevice"
1825+ data-ng-dblclick="toggleSelected(discovery.first_seen)">
1826+ <div class="table__data table-col--37">
1827+ {$ getDiscoveryName(discovery) $}
1828+ <i data-ng-show="discovery.is_external_dhcp === true" class="icon icon--info tooltip u-margin--left-tiny ng-hide" aria-label="This device is providing DHCP."></i>
1829+ </div>
1830+ <div class="table__data table-col--15">
1831+ {$ discovery.mac_address $}<br/>
1832+ <small class="u-text--subtle">{$ discovery.mac_organization || 'Unknown' $}</small>
1833+ </div>
1834+ <div class="table__data table-col--13 u-text--truncate">
1835+ {$ discovery.ip $}
1836+ </div>
1837+ <div class="table__data table-col--15">
1838+ {$ discovery.observer_hostname $}
1839+ </div>
1840+ <div class="table__data table-col--17">
1841+ <time>{$ discovery.last_seen $}</time>
1842+ </div>
1843+ <div class="table__data table-col--3">
1844+ <i class="icon icon--open tooltip" aria-label="Open"
1845+ data-ng-click="toggleSelected(discovery.first_seen)">Open</i>
1846+ </div>
1847+ </div>
1848+ <maas-obj-form data-ng-if="discovery.first_seen === selectedDevice"
1849+ obj="convertTo" manager="proxyManager" pre-process="preProcess"
1850+ after-save="afterSave" table-form="true" save-on-blur="false">
1851+ <div class="table__data table-col--20">
1852+ <maas-obj-field class="u-margin--bottom-none" type="text" key="hostname"
1853+ disable-label="true" placeholder="Hostname (optional)"></maas-obj-field>
1854+ </div>
1855+ <div class="table__data table-col--77"></div>
1856+ <div class="table__data table-col--3">
1857+ <i class="icon icon--close tooltip" aria-label="Close"
1858+ data-ng-click="toggleSelected(discovery.first_seen)">Close</i>
1859+ </div>
1860+ <div class="table__dropdown">
1861+ <div class="table__row is-active">
1862+ <div class="table__data table-col--100">
1863+ <div class="six-col">
1864+ <dl>
1865+ <dt class="two-col">Mac</dt>
1866+ <dd class="four-col last-col">{$ discovery.mac_address $}</dd>
1867+ <dt class="two-col">IP</dt>
1868+ <dd class="four-col last-col">{$ discovery.ip $}</dd>
1869+ <dt class="two-col">Rack</dt>
1870+ <dd class="four-col last-col">{$ discovery.observer_hostname $}</dd>
1871+ <dt class="two-col">Last seen</dt>
1872+ <dd class="four-col last-col"><time>{$ discovery.last_seen $}</time></dd>
1873+ </dl>
1874+ </div>
1875+ <div class="six-col last-col">
1876+ <dl>
1877+ <dt class="two-col">Fabric</dt>
1878+ <dd class="four-col last-col">{$ discovery.fabric_name $}</dd>
1879+ <dt class="two-col">VLAN</dt>
1880+ <dd class="four-col last-col">{$ getVLANName(discovery.vlan) $}</dd>
1881+ <dt class="two-col">Subnet</dt>
1882+ <dd class="four-col last-col">{$ getSubnetName(discovery.subnet) $}</dd>
1883+ </dl>
1884+ </div>
1885+>>>>>>> MERGE-SOURCE
1886 </div>
1887 </div>
1888+<<<<<<< TREE
1889 </div>
1890 <div class="table__row is-active u-padding--top-small">
1891 <div class="table__data table-col--100">
1892@@ -138,7 +287,22 @@
1893 <option value="device">Device</option>
1894 <option value="interface">Interface</option>
1895 </select>
1896+=======
1897+ <div class="table__row is-active u-padding--top-small">
1898+ <div class="table__data table-col--100">
1899+ <fieldset class="form__fieldset six-col">
1900+ <div class="form__group">
1901+ <label class="form__group-label two-col u-margin--bottom-small">Type</label>
1902+ <div class="form__group-input three-col">
1903+ <select name="type" ng-model="convertTo.type">
1904+ <option value="" disabled>Choose type</option>
1905+ <option value="device">Device</option>
1906+ <option value="interface">Interface</option>
1907+ </select>
1908+ </div>
1909+>>>>>>> MERGE-SOURCE
1910 </div>
1911+<<<<<<< TREE
1912 </div>
1913 <maas-obj-field type="options" key="domain" label="Domain" placeholder="Choose domain"
1914 label-width="two" input-width="three" subtle="false"
1915@@ -178,9 +342,55 @@
1916 </div>
1917 </div>
1918 </maas-obj-form>
1919+=======
1920+ <maas-obj-field type="options" key="domain" label="Domain" placeholder="Choose domain"
1921+ label-width="two" input-width="three" subtle="false"
1922+ options="domain as domain.name for domain in domains"
1923+ data-ng-if="convertTo.type === 'device'"></maas-obj-field>
1924+ <maas-obj-field type="options" subtle="false" key="system_id" label="Device name" placeholder="Select device name"
1925+ options="device.system_id as device.fqdn for device in devices | orderBy:'fqdn'"
1926+ label-width="two" label-info="Create as an interface on the selected device." input-width="three"
1927+ data-ng-if="convertTo.type === 'interface'"></maas-obj-field>
1928+ </fieldset>
1929+ <fieldset class="form__fieldset six-col last-col">
1930+ <maas-obj-field type="options" subtle="false" key="parent" label="Parent" placeholder="Select parent (optional)" placeholder-enabled="true"
1931+ options="machine.system_id as machine.fqdn for machine in machines | filter:{status_code: 6} | orderBy:'fqdn'"
1932+ label-width="two" label-info="Assign this device as a child of the parent machine." input-width="three"
1933+ data-ng-if="convertTo.type === 'device'"></maas-obj-field>
1934+ <maas-obj-field type="options" subtle="false" key="ip_assignment" label="IP assignment" placeholder="Select IP assignment"
1935+ options="option[0] as option[1] for option in convertTo.deviceIPOptions" label-width="two" input-width="three"></maas-obj-field>
1936+ </fieldset>
1937+ </div>
1938+ </div>
1939+ <div class="table__row is-active">
1940+ <div class="table__data u-float--left">
1941+ <maas-obj-errors></maas-obj-errors>
1942+ </div>
1943+ <div class="table__data u-float--right">
1944+ <a class="button--base button--inline" data-ng-click="toggleSelected(selectedDevice)">Cancel</a>
1945+ <button class="button--secondary button--inline"
1946+ data-ng-click="convertTo.goTo = true"
1947+ data-ng-if="!convertTo.$maasForm.getValue('parent')"
1948+ maas-obj-save>Save and go to device listing</button>
1949+ <button class="button--secondary button--inline"
1950+ data-ng-click="convertTo.goTo = true"
1951+ data-ng-if="convertTo.$maasForm.getValue('parent')"
1952+ maas-obj-save>Save and go to machine details</button>
1953+ <button class="button--primary button--inline" maas-obj-save>Save</button>
1954+ </div>
1955+ </div>
1956+ </div>
1957+ </maas-obj-form>
1958+ </div>
1959+>>>>>>> MERGE-SOURCE
1960 </div>
1961 </div>
1962 </div>
1963 </div>
1964+<<<<<<< TREE
1965 </div>
1966 </div>
1967+=======
1968+ </section>
1969+</div>
1970+>>>>>>> MERGE-SOURCE
1971
1972=== modified file 'src/maasserver/static/partials/domain-details.html'
1973--- src/maasserver/static/partials/domain-details.html 2017-03-27 13:09:56 +0000
1974+++ src/maasserver/static/partials/domain-details.html 2017-04-25 09:34:40 +0000
1975@@ -1,4 +1,8 @@
1976+<<<<<<< TREE
1977 <header class="page-header" sticky media-query="min-width: 769px">
1978+=======
1979+<header class="page-header" sticky>
1980+>>>>>>> MERGE-SOURCE
1981 <div class="wrapper--inner">
1982 <h1 class="page-header__title">
1983 {$ domain.displayname $}:
1984
1985=== modified file 'src/maasserver/static/partials/domains-list.html'
1986--- src/maasserver/static/partials/domains-list.html 2017-04-04 13:24:28 +0000
1987+++ src/maasserver/static/partials/domains-list.html 2017-04-25 09:34:40 +0000
1988@@ -1,4 +1,8 @@
1989+<<<<<<< TREE
1990 <header class="page-header" sticky media-query="min-width: 769px">
1991+=======
1992+<header class="page-header" sticky>
1993+>>>>>>> MERGE-SOURCE
1994 <div class="wrapper--inner">
1995 <h1 class="page-header__title">DNS</h1>
1996 <p class="page-header__status" data-ng-show="loading"><span class="u-text--loading"><i class="icon icon--loading u-animation--spin"></i> Loading...</span></p>
1997
1998=== modified file 'src/maasserver/static/partials/error.html'
1999--- src/maasserver/static/partials/error.html 2017-01-28 00:51:47 +0000
2000+++ src/maasserver/static/partials/error.html 2017-04-25 09:34:40 +0000
2001@@ -1,4 +1,8 @@
2002+<<<<<<< TREE
2003 <header class="page-header" sticky media-query="min-width: 769px">
2004+=======
2005+<header class="page-header" sticky>
2006+>>>>>>> MERGE-SOURCE
2007 <div class="wrapper--inner">
2008 <h1 class="page-header__title">Error</h1>
2009 <div class="page-header__controls">
2010
2011=== modified file 'src/maasserver/static/partials/fabric-details.html'
2012--- src/maasserver/static/partials/fabric-details.html 2017-03-27 13:09:56 +0000
2013+++ src/maasserver/static/partials/fabric-details.html 2017-04-25 09:34:40 +0000
2014@@ -1,12 +1,20 @@
2015 <div data-ng-hide="loaded">
2016+<<<<<<< TREE
2017 <header class="page-header" sticky media-query="min-width: 769px">
2018+=======
2019+ <header class="page-header" sticky>
2020+>>>>>>> MERGE-SOURCE
2021 <div class="wrapper--inner">
2022 <h1 class="page-header__title">Loading...</h1>
2023 </div>
2024 </header>
2025 </div>
2026 <div class="ng-hide" data-ng-show="loaded">
2027+<<<<<<< TREE
2028 <header class="page-header" sticky media-query="min-width: 769px">
2029+=======
2030+ <header class="page-header" sticky>
2031+>>>>>>> MERGE-SOURCE
2032 <div class="wrapper--inner">
2033 <h1 class="page-header__title">{$ fabric.name $}</h1>
2034 <div class="page-header__controls ng-hide" data-ng-show="isSuperUser() && !isDefaultFabric() && !loading">
2035
2036=== modified file 'src/maasserver/static/partials/images.html'
2037=== modified file 'src/maasserver/static/partials/intro-user.html'
2038--- src/maasserver/static/partials/intro-user.html 2017-02-17 14:23:04 +0000
2039+++ src/maasserver/static/partials/intro-user.html 2017-04-25 09:34:40 +0000
2040@@ -1,4 +1,5 @@
2041 <div class="row" data-ng-if="!loading">
2042+<<<<<<< TREE
2043 <div class="wrapper--inner">
2044 <div class="twelve-col">
2045 <div class="action-card">
2046@@ -29,5 +30,37 @@
2047 data-ng-disabled="!canContinue()"
2048 data-ng-click="clickContinue()">Go to dashboard</button>
2049 </div>
2050+=======
2051+ <div class="wrapper--inner">
2052+ <div class="twelve-col">
2053+ <div class="action-card">
2054+ <h2 class="action-card__title">
2055+ <i class="icon icon--large u-margin--right-tiny"
2056+ data-ng-class="{'icon--success': canContinue(), 'icon--success-grey': !canContinue()}"></i>
2057+ SSH keys for {$ user.username $}
2058+ </h2>
2059+ <div class="action-card__controls">
2060+ <p class="u-margin--top">Add multiple keys from Launchpad and Github or enter them manually.</p>
2061+ <h3>Keys</h3>
2062+ <maas-ssh-keys></maas-ssh-keys>
2063+ </div>
2064+ </div>
2065+ <div class="action-card"
2066+ data-ng-if="isSuperUser()"
2067+ data-ng-class="{'u-muted': !canContinue()}">
2068+ <h2 class="action-card__title">
2069+ MAAS has been successfully set up
2070+ </h2>
2071+ <div class="action-card__controls">
2072+ <p class="u-margin--top"><i class="icon icon--success u-margin--right-small"></i>Once DHCP is enabled, set your machines to PXE boot and they will be automatically enlisted in the Nodes tab.</p>
2073+ <p class="u-margin--top"><i class="icon icon--success u-margin--right-small"></i>Discovered MAC/IP pairs in your network will be listed on your dashboard and can be added to MAAS.</p>
2074+ <p class="u-margin--top u-margin--bottom"><i class="icon icon--success u-margin--right-small"></i>The fabrics, VLANs and subnets in your network will be automatically added to MAAS in Networks.</p>
2075+ </div>
2076+ </div>
2077+ <button class="button button--primary button--large"
2078+ data-ng-disabled="!canContinue()"
2079+ data-ng-click="clickContinue()">Go to dashboard</button>
2080+ </div>
2081+>>>>>>> MERGE-SOURCE
2082 </div>
2083 </div>
2084
2085=== modified file 'src/maasserver/static/partials/intro.html'
2086--- src/maasserver/static/partials/intro.html 2017-02-17 14:23:04 +0000
2087+++ src/maasserver/static/partials/intro.html 2017-04-25 09:34:40 +0000
2088@@ -1,4 +1,5 @@
2089 <div class="row" data-ng-if="!loading">
2090+<<<<<<< TREE
2091 <div class="wrapper--inner">
2092 <div class="twelve-col-col">
2093 <div class="action-card">
2094@@ -67,5 +68,75 @@
2095 data-ng-disabled="!canContinue()"
2096 data-ng-click="clickContinue()">Continue</button>
2097 </div>
2098+=======
2099+ <div class="wrapper--inner">
2100+ <div class="twelve-col-col">
2101+ <div class="action-card">
2102+ <h2 class="action-card__title">
2103+ <i class="icon icon--large u-margin--right-tiny"
2104+ data-ng-class="{ 'icon--success': !welcomeInError(), 'icon--error': welcomeInError() }"></i>
2105+ Welcome to MAAS
2106+ </h2>
2107+ <div class="action-card__controls">
2108+ <div class="u-margin--top">
2109+ <maas-obj-form obj="maasName" manager="configManager">
2110+ <div class="five-col">
2111+ <maas-obj-field type="text" key="value" label="Region name" placeholder="e.g. us-west" subtle="false" blur-on-enter="true"></maas-obj-field>
2112+ </div>
2113+ </maas-obj-form>
2114+ </div>
2115+ </div>
2116+ </div>
2117+ <div class="action-card">
2118+ <h2 class="action-card__title">
2119+ <i class="icon icon--large u-margin--right-tiny"
2120+ data-ng-class="{ 'icon--success': !networkInError(), 'icon--error': networkInError() }"></i>
2121+ Connectivity
2122+ </h2>
2123+ <div class="action-card__controls">
2124+ <div class="row u-border--none u-padding--none u-margin--top">
2125+ <maas-obj-form obj="upstreamDNS" manager="configManager">
2126+ <div class="five-col">
2127+ <maas-obj-field type="text" key="value" label="DNS forwarder" placeholder="e.g. 8.8.8.8" subtle="false" blur-on-enter="true"></maas-obj-field>
2128+ </div>
2129+ <div class="five-col u-padding--top-tiny"></div>
2130+ <div class="seven-col last-col u-text--subtle">The address used to resolve domains not managed by MAAS. The value is used as the value of 'forwarders' in the DNS server configuration.</div>
2131+ </maas-obj-form>
2132+ </div>
2133+ <div class="row u-border--none u-padding--none">
2134+ <maas-obj-form obj="mainArchive" manager="repoManager">
2135+ <div class="five-col">
2136+ <maas-obj-field type="text" key="url" label="Ubuntu archive" subtle="false" blur-on-enter="true"></maas-obj-field>
2137+ </div>
2138+ <div class="five-col u-padding--top-tiny"></div>
2139+ <div class="seven-col last-col u-text--subtle">The server where machines retrieve packages for Intel architectures.</div>
2140+ </maas-obj-form>
2141+ </div>
2142+ <div class="row u-border--none u-padding--none">
2143+ <maas-obj-form obj="portsArchive" manager="repoManager">
2144+ <div class="five-col">
2145+ <maas-obj-field type="text" key="url" label="Ubuntu extra architectures" subtle="false" blur-on-enter="true"></maas-obj-field>
2146+ </div>
2147+ <div class="five-col u-padding--top-tiny"></div>
2148+ <div class="seven-col last-col u-text--subtle">Archive used by machines to retrieve packages for non-Intel architectures.</div>
2149+ </maas-obj-form>
2150+ </div>
2151+ <div class="row u-border--none u-padding--none">
2152+ <maas-obj-form obj="httpProxy" manager="configManager">
2153+ <div class="five-col">
2154+ <maas-obj-field type="text" key="value" label="APT &amp; HTTP/HTTPS proxy server" subtle="false" blur-on-enter="true"></maas-obj-field>
2155+ </div>
2156+ <div class="five-col u-padding--top-tiny"></div>
2157+ <div class="seven-col last-col u-text--subtle">This will be passed onto deployed machines to use as a proxy for APT traffic. MAAS also uses the proxy for downloading boot images. In no URL is provided, the build-in MAAS proxy will be used.</div>
2158+ </maas-obj-form>
2159+ </div>
2160+ </div>
2161+ </div>
2162+ <maas-boot-images design="'action-card'"></maas-boot-images>
2163+ <button class="button button--primary button--large"
2164+ data-ng-disabled="!canContinue()"
2165+ data-ng-click="clickContinue()">Continue</button>
2166+ </div>
2167+>>>>>>> MERGE-SOURCE
2168 </div>
2169 </div>
2170
2171=== modified file 'src/maasserver/static/partials/networks-list.html'
2172--- src/maasserver/static/partials/networks-list.html 2017-04-10 15:35:18 +0000
2173+++ src/maasserver/static/partials/networks-list.html 2017-04-25 09:34:40 +0000
2174@@ -1,4 +1,8 @@
2175+<<<<<<< TREE
2176 <header class="page-header" sticky media-query="min-width: 769px">
2177+=======
2178+<header class="page-header" sticky>
2179+>>>>>>> MERGE-SOURCE
2180 <div class="wrapper--inner">
2181 <h1 class="page-header__title">Subnets</h1>
2182 <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2183
2184=== modified file 'src/maasserver/static/partials/node-details.html'
2185--- src/maasserver/static/partials/node-details.html 2017-04-20 08:58:42 +0000
2186+++ src/maasserver/static/partials/node-details.html 2017-04-25 09:34:40 +0000
2187@@ -1,12 +1,22 @@
2188+<<<<<<< TREE
2189 <div data-ng-if="!loaded">
2190 <header class="page-header">
2191+=======
2192+<div data-ng-hide="loaded">
2193+ <header class="page-header" sticky>
2194+>>>>>>> MERGE-SOURCE
2195 <div class="wrapper--inner">
2196 <h1 class="page-header__title">Loading...</h1>
2197 </div>
2198 </header>
2199 </div>
2200+<<<<<<< TREE
2201 <div data-ng-if="loaded">
2202 <header sticky use-placeholder="true" media-query="min-width: 769px" class="page-header u-margin--bottom-none">
2203+=======
2204+<div class="ng-hide" data-ng-show="loaded">
2205+ <header class="page-header" sticky>
2206+>>>>>>> MERGE-SOURCE
2207 <div class="wrapper--inner">
2208 <h1 class="page-header__title">
2209 <span contenteditable="true"
2210@@ -45,6 +55,7 @@
2211 </div>
2212
2213 <!-- XXX blake_r 2015-02-19 - Need to add e2e test. -->
2214+<<<<<<< TREE
2215 <div class="page-header__dropdown" data-ng-class="{ 'is-open': action.option }">
2216 <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-if="!isDevice && !node.dhcp_on">
2217 <p class="page-header__message page-header__message--warning">MAAS is not providing DHCP.</p>
2218@@ -221,6 +232,97 @@
2219 data-ng-class="{ 'is-active': section.area === 'power'}"
2220 data-ng-click="section.area = 'power'">Power</button>
2221 </nav>
2222+=======
2223+ <div class="page-header__dropdown" data-ng-class="{ 'is-open': actionOption }">
2224+
2225+ <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="!node.dhcp_on">
2226+ <p class="page-header__message page-header__message--warning">
2227+ MAAS is not providing DHCP.
2228+ </p>
2229+ </div>
2230+
2231+ <!-- XXX blake_r 2015-02-19 - Need to add e2e test. -->
2232+ <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-hide="isActionError() || isDeployError() || isSSHKeyError() || hasActionPowerError(actionOption.name)">
2233+ <form class="form form--inline">
2234+ <fieldset class="form__fieldset ng-hide" data-ng-show="actionOption.name === 'commission'">
2235+ <div class="form__group">
2236+ <input class="checkbox" id="enableSSH" type="checkbox"
2237+ data-ng-model="commissionOptions.enableSSH">
2238+ <label for="enableSSH">Allow SSH access and prevent machine from powering off</label>
2239+ </div>
2240+ <div class="form__group">
2241+ <input class="checkbox" id="skipNetworking" type="checkbox"
2242+ data-ng-model="commissionOptions.skipNetworking">
2243+ <label for="skipNetworking">Retain network configuration</label>
2244+ </div>
2245+ <div class="form__group">
2246+ <input class="checkbox" id="skipStorage" type="checkbox"
2247+ data-ng-model="commissionOptions.skipStorage">
2248+ <label for="skipStorage">Retain storage configuration</label>
2249+ </div>
2250+ </fieldset>
2251+ <fieldset class="form__fieldset ng-hide" data-ng-show="actionOption.name === 'deploy'">
2252+ <div class="form__group">
2253+ <label for="image" class="form__group-label">Choose your image</label>
2254+ <div class="form__group-input">
2255+ <span data-maas-os-select="osinfo" data-ng-model="osSelection"></span>
2256+ </div>
2257+ </div>
2258+ </fieldset>
2259+ <fieldset class="form__fieldset" data-ng-if="actionOption.name === 'release'">
2260+ <div class="form__group">
2261+ <span data-maas-release-options="releaseOptions"></span>
2262+ </div>
2263+ </fieldset>
2264+ <div class="page-header__controls">
2265+ <a href="" class="button--base button--inline" data-ng-click="actionCancel()">Cancel</a>
2266+ <button class="button--primary button--inline" data-ng-click="actionGo()">Go</button>
2267+ </div>
2268+ </form>
2269+ </div>
2270+
2271+ <!-- XXX blake_r 2015-02-19 - Need to add e2e test. -->
2272+ <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="isActionError()">
2273+ <p class="page-header__message page-header__message--error">
2274+ Node failed to be {$ actionOption.sentence $}, because of the following error: {$ actionError $}
2275+ </p>
2276+ <div class="page-header__controls">
2277+ <a href="" class="button--base button--inline" data-ng-click="actionCancel()">Cancel</a>
2278+ <button class="button--primary button--inline" data-ng-click="actionGo()">Retry</button>
2279+ </div>
2280+ </div>
2281+
2282+ <!-- XXX blake_r 2015-02-19 - Need to add e2e test. -->
2283+ <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="isDeployError()">
2284+ <p class="page-header__message page-header__message--error">
2285+ Node cannot be {$ actionOption.sentence $}, because the required boot images have not been imported. To import boot images, visit the <a href="images/">images page</a>.
2286+ </p>
2287+ <div class="page-header__controls">
2288+ <a href="" class="button--base button--inline" data-ng-click="actionCancel()">Cancel</a>
2289+ </div>
2290+ </div>
2291+
2292+ <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="hasActionPowerError(actionOption.name)">
2293+ <p class="page-header__message page-header__message--error">
2294+ Node cannot be {$ actionOption.sentence $}, because power control software for the
2295+ node is missing from its rack controller. To proceed, install the
2296+ {$ getPowerErrors() $} on the rack controller.
2297+ </p>
2298+ <div class="page-header__controls">
2299+ <a href="" class="button--base button--inline" data-ng-click="actionCancel()">Cancel</a>
2300+ </div>
2301+ </div>
2302+
2303+ <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="isSSHKeyError()">
2304+ <p class="page-header__message page-header__message--error">
2305+ Node cannot be {$ actionOption.sentence $}, because an SSH key has not been added to your account. To add an SSH key, visit <a href="account/prefs/">your account page</a>.
2306+ </p>
2307+ <div class="page-header__controls">
2308+ <a href="" class="button--base button--inline" data-ng-click="actionCancel()">Cancel</a>
2309+ </div>
2310+ </div>
2311+ </div>
2312+>>>>>>> MERGE-SOURCE
2313 </div>
2314 </div>
2315 <section class="row" data-ng-if="section.area === 'summary'">
2316
2317=== modified file 'src/maasserver/static/partials/node-events.html'
2318--- src/maasserver/static/partials/node-events.html 2017-04-05 02:36:06 +0000
2319+++ src/maasserver/static/partials/node-events.html 2017-04-25 09:34:40 +0000
2320@@ -1,12 +1,20 @@
2321 <div data-ng-hide="loaded">
2322+<<<<<<< TREE
2323 <header class="page-header" sticky media-query="min-width: 769px">
2324+=======
2325+ <header class="page-header" sticky>
2326+>>>>>>> MERGE-SOURCE
2327 <div class="wrapper--inner">
2328 <h1 class="page-header__title">Loading...</h1>
2329 </div>
2330 </header>
2331 </div>
2332 <div class="ng-hide" data-ng-show="loaded">
2333+<<<<<<< TREE
2334 <header class="page-header" sticky>
2335+=======
2336+ <header class="page-header u-margin--bottom" sticky>
2337+>>>>>>> MERGE-SOURCE
2338 <div class="wrapper--inner">
2339 <h1 class="page-header__title">{$ node.fqdn $}</h1>
2340 <p class="page-header__status">
2341@@ -27,8 +35,13 @@
2342 class="search__input" data-ng-model="search" />
2343 <input type="submit" class="search__submit" />
2344 </div>
2345+<<<<<<< TREE
2346 <table id="events-listing" window-width>
2347 <thead data-ng-if="windowWidth >= 769" sticky sticky-class="table__head--sticky" offset="88" media-query="min-width: 768px">
2348+=======
2349+ <table id="events-listing">
2350+ <thead sticky use-placeholder="false" sticky-class="table__head--sticky" offset="116">
2351+>>>>>>> MERGE-SOURCE
2352 <tr>
2353 <th class="table-col--1"></th>
2354 <th class="table-col--79">Event</th>
2355
2356=== modified file 'src/maasserver/static/partials/node-result.html'
2357--- src/maasserver/static/partials/node-result.html 2017-04-06 16:11:44 +0000
2358+++ src/maasserver/static/partials/node-result.html 2017-04-25 09:34:40 +0000
2359@@ -1,12 +1,20 @@
2360 <div data-ng-hide="loaded">
2361+<<<<<<< TREE
2362 <header class="page-header" sticky media-query="min-width: 769px">
2363+=======
2364+ <header class="page-header" sticky>
2365+>>>>>>> MERGE-SOURCE
2366 <div class="wrapper--inner">
2367 <h1 class="page-header__title">Loading...</h1>
2368 </div>
2369 </header>
2370 </div>
2371 <div class="ng-hide" data-ng-show="loaded">
2372+<<<<<<< TREE
2373 <header class="page-header" sticky media-query="min-width: 769px">
2374+=======
2375+ <header class="page-header" sticky>
2376+>>>>>>> MERGE-SOURCE
2377 <div class="wrapper--inner">
2378 <h1 class="page-header__title">{$ node.fqdn $}</h1>
2379 <p class="page-header__status">{$ filename $}</p>
2380
2381=== modified file 'src/maasserver/static/partials/nodes-list.html'
2382--- src/maasserver/static/partials/nodes-list.html 2017-04-13 10:43:13 +0000
2383+++ src/maasserver/static/partials/nodes-list.html 2017-04-25 09:34:40 +0000
2384@@ -1,3 +1,4 @@
2385+<<<<<<< TREE
2386 <header class="page-header u-margin--bottom-none" sticky media-query="min-width: 769px">
2387 <div class="wrapper--inner">
2388 <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2389@@ -941,3 +942,914 @@
2390 </div>
2391 </div>
2392 </div>
2393+=======
2394+<header class="page-header" sticky>
2395+ <div class="wrapper--inner">
2396+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2397+ <h1 class="page-header__title">{$ $parent.site $} MAAS</h1>
2398+
2399+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2400+ <ul class="tabs">
2401+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2402+ <li class="tabs__tab"
2403+ data-ng-class="{ 'is-active': currentpage === 'nodes' }">
2404+ <a href=""
2405+ class="tabs__tab-link tooltip"
2406+ aria-label="A deployable node managed by MAAS."
2407+ data-ng-click="toggleTab('nodes')">
2408+ {$ nodes.length $} <ng-pluralize count="nodes.length" when="{'one': 'Machine', 'other': 'Machines'}"></ng-pluralize>
2409+ </a>
2410+ </li>
2411+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2412+ <li class="tabs__tab" data-ng-class="{ 'is-active': currentpage === 'devices' }">
2413+ <a href=""
2414+ class="tabs__tab-link tooltip"
2415+ aria-label="A node known to MAAS, but is not deployable."
2416+ data-ng-click="toggleTab('devices')">
2417+ {$ devices.length $} <ng-pluralize count="devices.length" when="{'one': 'Device', 'other': 'Devices'}"></ng-pluralize>
2418+ </a>
2419+ </li>
2420+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2421+ <li class="tabs__tab" data-ng-if="isSuperUser()"
2422+ data-ng-class="{ 'is-active': currentpage === 'controllers' }">
2423+ <a href=""
2424+ class="tabs__tab-link tooltip"
2425+ aria-label="A node that provides MAAS services."
2426+ data-ng-click="toggleTab('controllers')">
2427+ {$ controllers.length $} <ng-pluralize count="controllers.length" when="{'one': 'Controller', 'other': 'Controllers'}"></ng-pluralize>
2428+ </a>
2429+ </li>
2430+ </ul>
2431+
2432+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2433+ <p class="page-header__status" data-ng-show="loading"><span class="u-text--loading"><i class="icon icon--loading u-animation--spin"></i> Loading...</span></p>
2434+
2435+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2436+ <div class="page-header__controls u-float--right" data-ng-show="currentpage === 'nodes'">
2437+ <div data-ng-hide="tabs.nodes.selectedItems.length">
2438+ <div data-maas-cta="addHardwareOptions"
2439+ data-ng-model="addHardwareOption"
2440+ data-ng-change="addHardwareOptionChanged()" data-default-title="Add hardware">
2441+ </div>
2442+ </div>
2443+ <div class="ng-hide" data-ng-show="tabs.nodes.selectedItems.length">
2444+ <span class="page-header__controls-feedback u-margin--right" data-ng-click="showSelected('nodes')">
2445+ {$ tabs.nodes.selectedItems.length $} Selected
2446+ </span>
2447+ <div data-maas-cta="tabs.nodes.takeActionOptions"
2448+ data-ng-model="tabs.nodes.actionOption"
2449+ data-ng-change="actionOptionSelected('nodes')">
2450+ </div>
2451+ </div>
2452+ </div>
2453+
2454+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2455+ <div class="page-header__controls u-float--right" data-ng-show="currentpage === 'devices'">
2456+ <div data-ng-hide="tabs.devices.selectedItems.length">
2457+ <button class="button--primary button--inline"
2458+ data-ng-click="addDevice()"
2459+ data-ng-hide="addDeviceScope.viewable">Add Device</button>
2460+ <button class="button--secondary button--inline ng-hide"
2461+ data-ng-click="cancelAddDevice()"
2462+ data-ng-show="addDeviceScope.viewable">Cancel add device</button>
2463+ </div>
2464+ <div data-ng-show="tabs.devices.selectedItems.length">
2465+ <span class="page-header__controls-feedback u-margin--right" data-ng-click="showSelected('devices')">
2466+ {$ tabs.devices.selectedItems.length $} Selected
2467+ </span>
2468+ <div data-maas-cta="tabs.devices.takeActionOptions"
2469+ data-ng-model="tabs.devices.actionOption"
2470+ data-ng-change="actionOptionSelected('devices')">
2471+ </div>
2472+ </div>
2473+ </div>
2474+
2475+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2476+ <div class="page-header__controls u-float--right" data-ng-show="currentpage === 'controllers'">
2477+ <div data-ng-if="!tabs.controllers.selectedItems.length">
2478+ <button class="button--primary button--inline"
2479+ data-ng-click="tabs.controllers.addController = true"
2480+ data-ng-hide="tabs.controllers.addController">Add rack controller</button>
2481+ <button class="button--secondary button--inline ng-hide"
2482+ data-ng-click="tabs.controllers.addController = false"
2483+ data-ng-show="tabs.controllers.addController">Close add rack controller</button>
2484+ </div>
2485+ <div data-ng-show="tabs.controllers.selectedItems.length">
2486+ <span class="page-header__controls-feedback u-margin--right" data-ng-click="showSelected('controllers')">
2487+ {$ tabs.controllers.selectedItems.length $} Selected
2488+ </span>
2489+ <div data-maas-cta="tabs.controllers.takeActionOptions"
2490+ data-ng-model="tabs.controllers.actionOption"
2491+ data-ng-change="actionOptionSelected('controllers')">
2492+ </div>
2493+ </div>
2494+ </div>
2495+
2496+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2497+ <div class="page-header__dropdown" data-ng-class="{ 'is-open': tabs.nodes.actionOption }">
2498+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2499+ <section class="page-header__section twelve-col u-margin--bottom-none" data-ng-hide="isActionError('nodes') || hasActionsInProgress('nodes')">
2500+ <form class="form form--inline">
2501+ <fieldset class="form__fieldset ng-hide" data-ng-show="tabs.nodes.actionOption.name === 'commission'">
2502+ <div class="form__group">
2503+ <input class="form__group-label" id="enableSSH" type="checkbox"
2504+ data-ng-model="tabs.nodes.commissionOptions.enableSSH">
2505+ <label class="checkbox-label" for="enableSSH">Allow SSH access and prevent machine from powering off</label>
2506+ </div>
2507+ <div class="form__group">
2508+ <input class="form__group-label" id="skipNetworking" type="checkbox"
2509+ data-ng-model="tabs.nodes.commissionOptions.skipNetworking">
2510+ <label class="checkbox-label" for="skipNetworking">Retain network configuration</label>
2511+ </div>
2512+ <div class="form__group">
2513+ <input class="form__group-label" id="skipStorage" type="checkbox"
2514+ data-ng-model="tabs.nodes.commissionOptions.skipStorage">
2515+ <label class="checkbox-label" for="skipStorage">Retain storage configuration</label>
2516+ </div>
2517+ </fieldset>
2518+ <fieldset class="form__fieldset ng-hide" data-ng-show="tabs.nodes.actionOption.name === 'deploy'">
2519+ <div class="form__group">
2520+ <label for="image" class="form__group-label">Choose your image</label>
2521+ <div class="form__group-input">
2522+ <span data-maas-os-select="osinfo" data-ng-model="tabs.nodes.osSelection"></span>
2523+ </div>
2524+ </div>
2525+ </fieldset>
2526+ <fieldset class="form__fieldset" data-ng-if="tabs.nodes.actionOption.name === 'release'">
2527+ <div class="form__group">
2528+ <span data-maas-release-options="tabs.nodes.releaseOptions"></span>
2529+ </div>
2530+ </fieldset>
2531+ <fieldset class="form__fieldset ng-hide" data-ng-show="tabs.nodes.actionOption.name === 'set-zone'">
2532+ <div class="form__group">
2533+ <label for="zone" class="form__group-label">Select Zone</label>
2534+ <div class="form__group-input">
2535+ <select name="zone" id="zone" placeholder="Choose a zone"
2536+ data-ng-model="tabs.nodes.zoneSelection"
2537+ data-ng-options="zone as zone.name for zone in zones">
2538+ <option value="" disabled="disabled">Choose a zone</option>
2539+ </select>
2540+ </div>
2541+ </div>
2542+ </fieldset>
2543+ <div class="page-header__controls">
2544+ <a href="" class="button--base button--inline" data-ng-click="actionCancel('nodes')">Cancel</a>
2545+ <button class="button--primary button--inline" data-ng-click="actionGo('nodes')" data-ng-hide="hasActionsFailed('nodes')">Go</button>
2546+ <button class="button--primary button--inline" data-ng-click="actionGo('nodes')" data-ng-show="hasActionsFailed('nodes')">Retry</button>
2547+ </div>
2548+ </form>
2549+ </section>
2550+
2551+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2552+ <section class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="isActionError('nodes')">
2553+ <p data-ng-hide="isDeployError('nodes') || isSSHKeyError('nodes')"
2554+ class="page-header__message page-header__message--error ng-hide">
2555+ {$ tabs.nodes.actionErrorCount $}
2556+ <span data-ng-pluralize count="tabs.nodes.selectedItems.length" when="{'one': 'node', 'other': 'nodes'}"></span>
2557+ cannot be {$ tabs.nodes.actionOption.sentence $}. To proceed, update your selection.
2558+ </p>
2559+ <p class="page-header__message page-header__message--error ng-hide" data-ng-show="isDeployError('nodes')">
2560+ {$ tabs.nodes.selectedItems.length $}
2561+ <span data-ng-pluralize count="tabs.nodes.selectedItems.length" when="{'one': 'node', 'other': 'nodes'}"></span>
2562+ cannot be {$ tabs.nodes.actionOption.sentence $}, because the required boot images have not been imported. To import boot images, visit the <a href="#/images">images page</a>.
2563+ </p>
2564+ <p class="page-header__message page-header__message--error ng-hide" data-ng-show="isSSHKeyError('nodes')">
2565+ {$ tabs.nodes.selectedItems.length $}
2566+ <span data-ng-pluralize count="tabs.nodes.selectedItems.length" when="{'one': 'node', 'other': 'nodes'}"></span>
2567+ cannot be {$ tabs.nodes.actionOption.sentence $}, because an SSH key has not been added to your account. To add an SSH key, visit <a href="account/prefs/">your account page</a>.
2568+ </p>
2569+ </section>
2570+
2571+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2572+ <section class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="hasActionsInProgress('nodes') || hasActionsFailed('nodes')">
2573+ <p class="page-header__message" data-ng-show="hasActionsInProgress('nodes')">
2574+ <i class="icon icon--loading u-animation--spin"></i>
2575+ {$ tabs.nodes.actionProgress.completed $} of {$ tabs.nodes.actionProgress.total $}
2576+ nodes are transitioning to {$ tabs.nodes.actionOption.sentence $}.
2577+ </p>
2578+ <p class="page-header__message page-header__message--error"
2579+ data-ng-repeat="(error, nodes) in tabs.nodes.actionProgress.errors">
2580+ The {$ tabs.nodes.actionOption.title.toLowerCase() $} action for {$ nodes.length $}
2581+ <span data-ng-pluralize count="nodes.length" when="{'one': 'node', 'other': 'nodes'}"></span>
2582+ failed with error: {$ error $}
2583+ </p>
2584+ </section>
2585+ </div>
2586+
2587+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2588+ <div class="page-header__dropdown" data-ng-class="{ 'is-open': addHardwareScope.viewable }" data-ng-controller="AddHardwareController">
2589+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2590+ <section class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="showMachine()">
2591+ <h3 class="page-header__dropdown-title">Add machine</h3>
2592+ <form class="form form--stack">
2593+ <fieldset class="form__fieldset six-col">
2594+ <div class="form__group">
2595+ <label for="machine-name" class="form__label two-col">Machine name</label>
2596+ <div class="form__group-input three-col">
2597+ <input type="text" id="machine-name" placeholder="Choose a machine name (optional)"
2598+ data-ng-model="machine.name">
2599+ </div>
2600+ </div>
2601+ <div class="form__group">
2602+ <label for="domain" class="form__group-label two-col">Domain</label>
2603+ <div class="form__group-input three-col">
2604+ <select name="domain" id="domain"
2605+ data-ng-model="machine.domain"
2606+ data-ng-options="domain as domain.name for domain in domains">
2607+ <option value="" disabled>Choose a domain</option>
2608+ </select>
2609+ </div>
2610+ </div>
2611+ <div class="form__group">
2612+ <label for="architecture" class="form__group-label two-col">Architecture</label>
2613+ <div class="form__group-input three-col">
2614+ <select name="architecture" id="architecture"
2615+ data-ng-model="machine.architecture"
2616+ data-ng-options="arch for arch in architectures">
2617+ <option value="" disabled>Choose an architecture</option>
2618+ </select>
2619+ </div>
2620+ </div>
2621+ <div class="form__group">
2622+ <label for="min_hwe_kernel" class="form__group-label two-col">Minimum Kernel</label>
2623+ <div class="form__group-input three-col">
2624+ <select name="min_hwe_kernel" id="min_hwe_kernel" placeholder="No minimum kernel"
2625+ data-ng-model="machine.min_hwe_kernel"
2626+ data-ng-options="hwe_kernel[0] as hwe_kernel[1] for hwe_kernel in hwe_kernels">
2627+ <option value="">No minimum kernel</option>
2628+ </select>
2629+ </div>
2630+ </div>
2631+ <div class="form__group">
2632+ <label for="zone" class="form__group-label two-col">Zone</label>
2633+ <select name="zone" id="zone" class="three-col" placeholder="Choose a zone"
2634+ data-ng-model="machine.zone"
2635+ data-ng-options="zone as zone.name for zone in zones">
2636+ </select>
2637+ </div>
2638+ <div class="form__group" data-ng-repeat="mac in machine.macs">
2639+ <label for="mac-address" class="form__group-label two-col"><span data-ng-hide="mac !== machine.macs[0]">MAC Address</span>&nbsp;</label>
2640+ <div class="form__group-input three-col">
2641+ <input type="text" id="mac-address" placeholder="00:00:00:00:00:00"
2642+ data-ng-class="{ 'has-error': mac.error }"
2643+ data-ng-model="mac.mac" data-ng-change="validateMac(mac)">
2644+ <span class="form__group-remove" title="Delete MAC"
2645+ data-ng-hide="mac === machine.macs[0]" data-ng-click="removeMac(mac)"></span>
2646+ </div>
2647+ </div>
2648+ <div class="form__group">
2649+ <div class="five-col">
2650+ <a href="" class="button--secondary button--inline u-float--right" data-ng-click="addMac()">+ Add MAC Address</a>
2651+ </div>
2652+ </div>
2653+ </fieldset>
2654+ <fieldset class="form__fieldset six-col last-col"
2655+ data-maas-power-parameters="power_types"
2656+ data-ng-model="machine.power">
2657+ </fieldset>
2658+ </form>
2659+ </section>
2660+ <section class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="showChassis()">
2661+ <h3 class="page-header__dropdown-title">Add chassis</h3>
2662+ <form action="post" class="form form--stack">
2663+ <fieldset class="form__fieldset six-col"
2664+ data-maas-power-parameters="chassisPowerTypes"
2665+ data-ng-model="chassis.power">
2666+ </fieldset>
2667+ <fieldset class="form__fieldset six-col last-col">
2668+ <div class="form__group">
2669+ <label for="domain" class="form__group-label two-col">Domain</label>
2670+ <div class="form__group-input three-col">
2671+ <select name="domain" id="domain" placeholder="Choose a domain"
2672+ data-ng-model="chassis.domain"
2673+ data-ng-options="domain as domain.name for domain in domains">
2674+ </select>
2675+ </div>
2676+ </div>
2677+ </fieldset>
2678+ </form>
2679+ </section>
2680+
2681+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2682+ <section class="page-header__section twelve-col u-margin--bottom-none" data-ng-show="showMachine()">
2683+ <p class="page-header__message page-header__message--error ng-hide" data-ng-show="error">{$ error $}</p>
2684+ <div class="page-header__controls">
2685+ <a href="" class="button--base button--inline" data-ng-click="cancel()">Cancel</a>
2686+ <button class="button--secondary button--inline"
2687+ data-ng-class="{ disabled: machineHasError() }"
2688+ data-ng-click="saveMachine(true)">Save and add another</button>
2689+ <button class="button--primary button--inline"
2690+ data-ng-class="{ disabled: machineHasError() }"
2691+ data-ng-click="saveMachine(false)">Save machine</button>
2692+ </div>
2693+ </section>
2694+
2695+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2696+ <section class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="showChassis()">
2697+ <p class="page-header__message page-header__message--error ng-hide" data-ng-show="error">{$ error $}</p>
2698+ <div class="page-header__controls">
2699+ <a href="" class="button--base button--inline" data-ng-click="cancel()">Cancel</a>
2700+ <button class="button--secondary button--inline"
2701+ data-ng-class="{ disabled: chassisHasErrors() }"
2702+ data-ng-click="saveChassis(true)">Save and add another</button>
2703+ <button class="button--primary button--inline"
2704+ data-ng-class="{ disabled: chassisHasErrors() }"
2705+ data-ng-click="saveChassis(false)">Save chassis</button>
2706+ </div>
2707+ </section>
2708+
2709+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2710+ <section class="page-header__section twelve-col u-margin--bottom-none" data-ng-hide="architectures.length">
2711+ <p class="page-header__message page-header__message--error">
2712+ Cannot add {$ mode $} until boot images have been imported. To fix, visit the <a href="#/images">images page</a>.
2713+ </p>
2714+ </section>
2715+ </div>
2716+
2717+ <!-- XXX blake_r 2015-04-02 - Need to add e2e test. -->
2718+ <div class="page-header__dropdown" data-ng-class="{ 'is-open': tabs.devices.actionOption }">
2719+ <!-- XXX blake_r 2015-04-02 - Need to add e2e test. -->
2720+ <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-hide="isActionError('devices') || hasActionsInProgress('devices')">
2721+ <!-- XXX blake_r 2015-04-02 - Need to add e2e test. -->
2722+ <form class="form form--inline">
2723+ <fieldset class="form__fieldset ng-hide" data-ng-show="tabs.devices.actionOption.name === 'set-zone'">
2724+ <div class="form__group">
2725+ <label class="form__group-label" for="zone">Set zone</label>
2726+ <select name="zone" id="zone" placeholder="Choose a zone"
2727+ data-ng-model="tabs.devices.zoneSelection"
2728+ data-ng-options="zone as zone.name for zone in zones">
2729+ <option value="" disabled="disabled">Choose a zone</option>
2730+ </select>
2731+ </div>
2732+ </fieldset>
2733+ <div class="page-header__controls">
2734+ <a href="" class="button--base button--inline" data-ng-click="actionCancel('devices')">Cancel</a>
2735+ <button class="button--primary button--inline" data-ng-click="actionGo('devices')">Go</button>
2736+ </div>
2737+ </form>
2738+ </div>
2739+
2740+ <!-- XXX blake_r 2015-04-02 - Need to add e2e test. -->
2741+ <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="isActionError('devices')">
2742+ <p class="page-header__message page-header__message--error">
2743+ {$ tabs.devices.actionErrorCount $}
2744+ <span data-ng-pluralize count="tabs.devices.selectedItems.length" when="{'one': 'device', 'other': 'devices'}"></span>
2745+ cannot be {$ tabs.devices.actionOption.sentence $}. To proceed, update your selection.
2746+ </p>
2747+ </div>
2748+
2749+ <!-- XXX blake_r 2015-05-07 - Need to add e2e test. -->
2750+ <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="hasActionsInProgress('devices') || hasActionsFailed('devices')">
2751+ <p class="page-header__message" data-ng-show="hasActionsInProgress('devices')">
2752+ <i class="icon icon--loading u-animation--spin"></i>
2753+ {$ tabs.devices.actionProgress.completed $} of {$ tabs.devices.actionProgress.total $}
2754+ devices have been {$ tabs.devices.actionOption.sentence $}.
2755+ </p>
2756+ <p class="page-header__message page-header__message--error"
2757+ data-ng-repeat="(error, devices) in tabs.devices.actionProgress.errors">
2758+ The {$ tabs.devices.actionOption.title.toLowerCase() $} action for {$ devices.length $}
2759+ <span data-ng-pluralize count="devices.length" when="{'one': 'device', 'other': 'devices'}"></span>
2760+ failed with error: {$ error $}
2761+ </p>
2762+ </div>
2763+ </div>
2764+
2765+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2766+ <div class="page-header__dropdown" data-ng-class="{ 'is-open': addDeviceScope.viewable }" data-ng-controller="AddDeviceController">
2767+ <section class="page-header__section twelve-col u-margin--bottom-none">
2768+ <h3 class="page-header__dropdown-title">Add device</h3>
2769+ <form action="" class="form form--stack">
2770+ <fieldset class="form__fieldset six-col">
2771+ <div class="form__group">
2772+ <label for="device-name" class="form__group-label two-col">Name</label>
2773+ <div class="form__group-input three-col">
2774+ <input type="text" id="device-name" placeholder="Name your device"
2775+ data-ng-model="device.name"
2776+ data-ng-class="{ 'has-error': nameHasError() }">
2777+ </div>
2778+
2779+ </div>
2780+ <div class="form__group">
2781+ <label for="domain" class="form__group-label two-col">Domain</label>
2782+ <div class="form__group-input three-col">
2783+ <select name="domain" id="domain" placeholder="Choose a domain"
2784+ data-ng-model="device.domain"
2785+ data-ng-options="domain as domain.name for domain in domains">
2786+ </select>
2787+ </div>
2788+ </div>
2789+ </fieldset>
2790+ </form>
2791+ <table>
2792+ <thead>
2793+ <tr>
2794+ <th class="table-col--20">MAC address</th>
2795+ <th class="table-col--20">IP assignment</th>
2796+ <th class="table-col--20">Subnet</th>
2797+ <th class="table-col--35">IP address</th>
2798+ <th class="table-col--5"></th>
2799+ </tr>
2800+ </thead>
2801+ <tbody>
2802+ <tr data-ng-repeat="interface in device.interfaces">
2803+ <td class="table-col--20">
2804+ <input type="text" id="mac-address" placeholder="00:00:00:00:00:00"
2805+ data-ng-model="interface.mac"
2806+ data-ng-class="{ 'has-error': macHasError(interface) }">
2807+ </td>
2808+ <td class="table-col--20">
2809+ <select name="ip-assignment" id="ip-assignment"
2810+ placeholder="Select IP assignment" data-ng-model="interface.ipAssignment"
2811+ data-ng-options="assigment.title for assigment in ipAssignments">
2812+ <option value="" disabled selected>Select IP assignment</option>
2813+ </select>
2814+ </td>
2815+ <td class="table-col--20">
2816+ <select name="subnet" id="subnet"
2817+ placeholder="Select subnet" data-ng-model="interface.subnetId"
2818+ data-ng-options="subnet.id as subnet.name for subnet in subnets"
2819+ data-ng-show="interface.ipAssignment.name === 'static'">
2820+ <option value="" disabled selected>Select subnet</option>
2821+ </select>
2822+ </td>
2823+ <td class="table-col--35">
2824+ <input type="text" id="ip-address" placeholder="000.000.000.000"
2825+ data-ng-model="interface.ipAddress"
2826+ data-ng-class="{ 'has-error': ipHasError(interface) }"
2827+ data-ng-show="interface.ipAssignment.name === 'external'">
2828+ <input type="text" id="ip-address"
2829+ data-ng-model="interface.ipAddress"
2830+ data-ng-class="{ 'has-error': ipHasError(interface) }"
2831+ data-ng-show="interface.ipAssignment.name === 'static'">
2832+ </td>
2833+ <td class="table-col--5 u-u-align---right">
2834+ <!-- space needed to set correct height -->
2835+ <span data-ng-show="isPrimaryInterface(interface)">&nbsp;</span>
2836+ <a title="icon icon--delete" class="icon icon--remove"
2837+ data-ng-click="deleteInterface(interface)"
2838+ data-ng-hide="isPrimaryInterface(interface)">delete</a>
2839+ </td>
2840+ </tr>
2841+ </tbody>
2842+ </table>
2843+ <button class="button--secondary button--inline" data-ng-click="addInterface()">+ Add another interface</button>
2844+ </section>
2845+ <section class="page-header__section twelve-col u-margin--bottom-none twelve-col u-margin--bottom-none">
2846+ <form class="form form--inline">
2847+ <p class="page-header__message page-header__message--error ng-hide" data-ng-show="error">{$ error $}</p>
2848+ <div class="page-header__controls">
2849+ <a href="" class="button--base button--inline" data-ng-click="cancel()">Cancel</a>
2850+ <button class="button--secondary button--inline"
2851+ data-ng-class="{ disabled: deviceHasError() }"
2852+ data-ng-click="save(true)">Save and add another</button>
2853+ <button class="button--primary button--inline"
2854+ data-ng-class="{ disabled: deviceHasError() }"
2855+ data-ng-click="save(false)">Save device</button>
2856+ </div>
2857+ </form>
2858+ </section>
2859+ </div>
2860+
2861+ <!-- XXX blake_r 2015-04-02 - Need to add e2e test. -->
2862+ <div class="page-header__dropdown" data-ng-class="{ 'is-open': tabs.controllers.actionOption }">
2863+ <!-- XXX blake_r 2015-04-02 - Need to add e2e test. -->
2864+ <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-hide="isActionError('controllers') || hasActionsInProgress('controllers')">
2865+ <!-- XXX blake_r 2015-04-02 - Need to add e2e test. -->
2866+ <form class="form form--inline">
2867+ <fieldset class="form__fieldset ng-hide" data-ng-show="tabs.controllers.actionOption.name === 'set-zone'">
2868+ <div class="form__group">
2869+ <label for="zone" class="form__group-label">Select Zone</label>
2870+ <div class="form__group-input">
2871+ <select name="zone" id="zone" placeholder="Choose a zone"
2872+ data-ng-model="tabs.controllers.zoneSelection"
2873+ data-ng-options="zone as zone.name for zone in zones">
2874+ <option value="" disabled="disabled">Choose a zone</option>
2875+ </select>
2876+ </div>
2877+ </div>
2878+ </fieldset>
2879+ <div class="page-header__controls">
2880+ <a href="" class="button--base button--inline" data-ng-click="actionCancel('controllers')">Cancel</a>
2881+ <button class="button--primary button--inline" data-ng-click="actionGo('controllers')">Go</button>
2882+ </div>
2883+ </form>
2884+ </div>
2885+
2886+ <!-- XXX blake_r 2015-04-02 - Need to add e2e test. -->
2887+ <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="isActionError('controllers')">
2888+ <form class="form form--inline">
2889+ <p class="page-header__message page-header__message--error">
2890+ {$ tabs.controllers.actionErrorCount $}
2891+ <span data-ng-pluralize count="tabs.controllers.selectedItems.length" when="{'one': 'controller', 'other': 'controllers'}"></span>
2892+ cannot be {$ tabs.controllers.actionOption.sentence $}. To proceed, update your selection.
2893+ </p>
2894+ </form>
2895+ </div>
2896+
2897+ <!-- XXX blake_r 2015-05-07 - Need to add e2e test. -->
2898+ <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="hasActionsInProgress('controllers') || hasActionsFailed('controllers')">
2899+ <form class="form form--inline">
2900+ <p class="page-header__message" data-ng-show="hasActionsInProgress('controllers')">
2901+ <i class="icon icon--loading u-animation--spin u-margin--right-small"></i>
2902+ {$ tabs.controllers.actionProgress.completed $} of {$ tabs.controllers.actionProgress.total $}
2903+ controllers have been {$ tabs.controllers.actionOption.sentence $}.
2904+ </p>
2905+ <p class="page-header__message page-header__message--error"
2906+ data-ng-repeat="(error, controllers) in tabs.controllers.actionProgress.errors">
2907+ The {$ tabs.controllers.actionOption.title.toLowerCase() $} action for {$ controllers.length $}
2908+ <span data-ng-pluralize count="controllers.length" when="{'one': 'controller', 'other': 'controllers'}"></span>
2909+ failed with error: {$ error $}
2910+ </p>
2911+ </form>
2912+ </div>
2913+ </div>
2914+
2915+ <div class="page-header__dropdown" data-ng-class="{ 'is-open': tabs.controllers.addController }">
2916+
2917+ <!-- XXX blake_r 2015-05-07 - Need to add e2e test. -->
2918+ <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="tabs.controllers.addController">
2919+ <h3 class="page-header__dropdown-title">Add rack controller</h3>
2920+ <form class="form">
2921+ <pre class="u-margin--none">
2922+<code># To add a new rack controller, SSH into the rack controller.
2923+# Install the maas-rack-controller package.
2924+sudo apt install maas-rack-controller
2925+# Register the rack controller with this MAAS. If the rack controller (and machines)
2926+# don't have access to the URL, use a different IP address to allow connection.
2927+sudo maas-rack register --url {$ tabs.controllers.registerUrl $} --secret {$ tabs.controllers.registerSecret $}</code>
2928+ </pre>
2929+ </form>
2930+ </div>
2931+ <div class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="tabs.controllers.addController">
2932+ <form class="form form--inline">
2933+ <div class="page-header__controls">
2934+ <button class="button--secondary button--inline"
2935+ data-ng-click="tabs.controllers.addController = false">Close</button>
2936+ </div>
2937+ </form>
2938+ </div>
2939+ </div>
2940+ </div>
2941+</header>
2942+<div class="row u-padding--top-none">
2943+ <div class="wrapper--inner">
2944+ <aside class="three-col">
2945+ <div class="accordion maas-accordion" data-ng-show="currentpage === 'nodes'"
2946+ data-ng-class="{ 'is-disabled': tabs.nodes.actionOption }">
2947+ <h3 class="accordion__title">Filter by</h3>
2948+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2949+ <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.status.length">
2950+ <h4 class="accordion__tab-title maas-accordion-tab is-active">Status</h4>
2951+ <div class="accordion__tab-content">
2952+ <ul class="accordion__tab-list">
2953+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
2954+ <li class="accordion__tab-item" data-ng-repeat="status in tabs.nodes.metadata.status | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('status', status.name, 'nodes') }">
2955+ <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('status', status.name, 'nodes')">{$ status.name $} ({$ status.count $})</a>
2956+ </li>
2957+ </ul>
2958+ </div>
2959+ </div>
2960+ <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.owner.length">
2961+ <h4 class="accordion__tab-title maas-accordion-tab">Owner</h4>
2962+ <div class="accordion__tab-content">
2963+ <ul class="accordion__tab-list">
2964+ <li class="accordion__tab-item" data-ng-repeat="owner in tabs.nodes.metadata.owner | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('owner', owner.name, 'nodes') }">
2965+ <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('owner', owner.name, 'nodes')">{$ owner.name $} ({$ owner.count $})</a>
2966+ </li>
2967+ </ul>
2968+ </div>
2969+ </div>
2970+ <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.release.length">
2971+ <h4 class="accordion__tab-title maas-accordion-tab">OS/Release</h4>
2972+ <div class="accordion__tab-content">
2973+ <ul class="accordion__tab-list">
2974+ <li class="accordion__tab-item" data-ng-repeat="release in tabs.nodes.metadata.release | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('release', release.name, 'nodes') }">
2975+ <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('release', release.name, 'nodes')">{$ getReleaseTitle(release.name) $} ({$ release.count $})</a>
2976+ </li>
2977+ </ul>
2978+ </div>
2979+ </div>
2980+ <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.tags.length">
2981+ <h4 class="accordion__tab-title maas-accordion-tab">Tags</h4>
2982+ <div class="accordion__tab-content">
2983+ <ul class="accordion__tab-list">
2984+ <li class="accordion__tab-item" data-ng-repeat="tag in tabs.nodes.metadata.tags | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('tags', tag.name, 'nodes') }">
2985+ <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('tags', tag.name, 'nodes')">{$ tag.name $} ({$ tag.count $})</a>
2986+ </li>
2987+ </ul>
2988+ </div>
2989+ </div>
2990+ <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.storage_tags.length">
2991+ <h4 class="accordion__tab-title maas-accordion-tab">Storage Tags</h4>
2992+ <div class="accordion__tab-content">
2993+ <ul class="accordion__tab-list">
2994+ <li class="accordion__tab-item" data-ng-repeat="tag in tabs.nodes.metadata.storage_tags | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('storage_tags', tag.name, 'nodes') }">
2995+ <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('storage_tags', tag.name, 'nodes')">{$ tag.name $} ({$ tag.count $})</a>
2996+ </li>
2997+ </ul>
2998+ </div>
2999+ </div>
3000+ <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.subnets.length">
3001+ <h4 class="accordion__tab-title maas-accordion-tab">Subnets</h4>
3002+ <div class="accordion__tab-content">
3003+ <ul class="accordion__tab-list">
3004+ <li class="accordion__tab-item" data-ng-repeat="subnet in tabs.nodes.metadata.subnets | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('subnets', subnet.name, 'nodes') }">
3005+ <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('subnets', subnet.name, 'nodes')">{$ subnet.name $} ({$ subnet.count $})</a>
3006+ </li>
3007+ </ul>
3008+ </div>
3009+ </div>
3010+ <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.fabrics.length">
3011+ <h4 class="accordion__tab-title maas-accordion-tab">Fabrics</h4>
3012+ <div class="accordion__tab-content">
3013+ <ul class="accordion__tab-list">
3014+ <li class="accordion__tab-item" data-ng-repeat="fabric in tabs.nodes.metadata.fabrics | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('fabrics', fabric.name, 'nodes') }">
3015+ <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('fabrics', fabric.name, 'nodes')">{$ fabric.name $} ({$ fabric.count $})</a>
3016+ </li>
3017+ </ul>
3018+ </div>
3019+ </div>
3020+ <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.spaces.length">
3021+ <h4 class="accordion__tab-title maas-accordion-tab">Spaces</h4>
3022+ <div class="accordion__tab-content">
3023+ <ul class="accordion__tab-list">
3024+ <li class="accordion__tab-item" data-ng-repeat="space in tabs.nodes.metadata.spaces | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('spaces', space.name, 'nodes') }">
3025+ <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('spaces', space.name, 'nodes')">{$ space.name $} ({$ space.count $})</a>
3026+ </li>
3027+ </ul>
3028+ </div>
3029+ </div>
3030+ <div class="ng-hide accordion__tab" data-ng-show="tabs.nodes.metadata.zone.length">
3031+ <h4 class="accordion__tab-title maas-accordion-tab">Zones</h4>
3032+ <div class="accordion__tab-content">
3033+ <ul class="accordion__tab-list">
3034+ <li class="accordion__tab-item" data-ng-repeat="zone in tabs.nodes.metadata.zone | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('zone', zone.name, 'nodes') }">
3035+ <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('zone', zone.name, 'nodes')">{$ zone.name $} ({$ zone.count $})</a>
3036+ </li>
3037+ </ul>
3038+ </div>
3039+ </div>
3040+ </div>
3041+ <div class="accordion three-col maas-accordion ng-hide" data-ng-show="currentpage === 'devices'"
3042+ data-ng-class="{ 'is-disabled': tabs.devices.actionOption }">
3043+ <h3 class="accordion__title">Filter by</h3>
3044+ <!-- XXX rvba 2015-02-25 - Need to add e2e test. -->
3045+ <div class="ng-hide accordion__tab" data-ng-show="tabs.devices.metadata.owner.length">
3046+ <h4 class="accordion__tab-title maas-accordion-tab active">Owner</h4>
3047+ <div class="accordion__tab-content">
3048+ <ul class="accordion__tab-list">
3049+ <li class="accordion__tab-item" data-ng-repeat="owner in tabs.devices.metadata.owner | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('owner', owner.name, 'devices') }">
3050+ <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('owner', owner.name, 'devices')">{$ owner.name $} ({$ owner.count $})</a>
3051+ </li>
3052+ </ul>
3053+ </div>
3054+ </div>
3055+ <div class="ng-hide accordion__tab" data-ng-show="tabs.devices.metadata.tags.length">
3056+ <h4 class="accordion__tab-title maas-accordion-tab">Tags</h4>
3057+ <div class="accordion__tab-content">
3058+ <ul class="accordion__tab-list">
3059+ <li class="accordion__tab-item" data-ng-repeat="tag in tabs.devices.metadata.tags | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('tags', tag.name, 'devices') }">
3060+ <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('tags', tag.name, 'devices')">{$ tag.name $} ({$ tag.count $})</a>
3061+ </li>
3062+ </ul>
3063+ </div>
3064+ </div>
3065+ <div class="ng-hide accordion__tab" data-ng-show="tabs.devices.metadata.zone.length">
3066+ <h4 class="accordion__tab-title maas-accordion-tab">Zones</h4>
3067+ <div class="accordion__tab-content">
3068+ <ul class="accordion__tab-list">
3069+ <li class="accordion__tab-item" data-ng-repeat="zone in tabs.devices.metadata.zone | orderBy:['name', '-count']" data-ng-class="{ 'is-active': isFilterActive('zone', zone.name, 'devices') }">
3070+ <a class="accordion__tab-link" href="" data-ng-click="toggleFilter('zone', zone.name, 'devices')">{$ zone.name $} ({$ zone.count $})</a>
3071+ </li>
3072+ </ul>
3073+ </div>
3074+ </div>
3075+ </div>
3076+ </aside>
3077+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
3078+ <div class="nine-col last-col" data-ng-show="currentpage === 'nodes'">
3079+ <form>
3080+ <div id="search-bar" class="search nine-col">
3081+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
3082+ <input
3083+ type="search" placeholder="Search nodes" class="search__input"
3084+ data-ng-model="tabs.nodes.search" data-ng-change="updateFilters('nodes')"
3085+ data-ng-class="{ error: !tabs.nodes.searchValid }"
3086+ data-ng-disabled="tabs.nodes.actionOption" />
3087+ <input type="submit" class="search__submit"
3088+ data-ng-class="{ 'search__submit--close': tabs.nodes.search.length > 0 }"
3089+ data-ng-click="clearSearch('nodes')" />
3090+ </div>
3091+ <table id="nodes-listing">
3092+ <thead>
3093+ <tr>
3094+ <th class="table-col--3">
3095+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
3096+ <input class="checkbox" type="checkbox" data-ng-click="toggleCheckAll('nodes')" data-ng-checked="tabs.nodes.allViewableChecked" id="check-all" data-ng-disabled="hasActionsInProgress('nodes')" />
3097+ <label class="checkbox-label" for="check-all"></label>
3098+ </th>
3099+ <th colspan="2" class="u-align--left">
3100+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
3101+ <a href=""
3102+ data-ng-click="selectColumnOrSort('fqdn', 'nodes')"
3103+ data-ng-class="{'is-active': tabs.nodes.column === 'fqdn', 'is-sorted': tabs.nodes.predicate === 'fqdn', 'sort-asc': tabs.nodes.reverse === false, 'sort-desc': tabs.nodes.reverse === true}"><span title="Fully Qualified Domain Name">FQDN</span></a>
3104+ <span class="divide"></span>
3105+ <a href=""
3106+ data-ng-click="selectColumnOrSort('pxe_mac', 'nodes')"
3107+ data-ng-class="{'is-active': tabs.nodes.column === 'pxe_mac', 'is-sorted': tabs.nodes.predicate === 'pxe_mac', 'sort-asc': tabs.nodes.reverse === false, 'sort-desc': tabs.nodes.reverse === true}"><span title="Media Access Control addresses">MAC</span></a>
3108+ </th>
3109+ <th class="u-align--center">
3110+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
3111+ <a href="" class="u-align--center" data-ng-click="sortTable('power_state', 'nodes')" data-ng-class="{'is-sorted': tabs.nodes.predicate === 'power_state', 'sort-asc': tabs.nodes.reverse === false, 'sort-desc': tabs.nodes.reverse === true}">Power</a>
3112+ </th>
3113+ <th class="table-col--3"></th>
3114+ <th>
3115+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
3116+ <a href="" data-ng-click="sortTable('status', 'nodes')" data-ng-class="{'is-sorted': tabs.nodes.predicate === 'status', 'sort-asc': tabs.nodes.reverse === false, 'sort-desc': tabs.nodes.reverse === true}">Status</a>
3117+ </th>
3118+ <th class="table-col--10">
3119+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
3120+ <a href="" data-ng-click="sortTable('owner', 'nodes')" data-ng-class="{'is-sorted': tabs.nodes.predicate === 'owner', 'sort-asc': tabs.nodes.reverse === false, 'sort-desc': tabs.nodes.reverse === true}">Owner</a>
3121+ </th>
3122+ <th class="u-align--right">
3123+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
3124+ <a href="" data-ng-click="sortTable('cpu_count', 'nodes')" data-ng-class="{'is-sorted': tabs.nodes.predicate=== 'cpu_count', 'sort-asc': tabs.nodes.reverse === false, 'sort-desc': tabs.nodes.reverse === true}">Cores</a>
3125+ </th>
3126+ <th class="u-align--right">
3127+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
3128+ <a href="" data-ng-click="sortTable('memory', 'nodes')" data-ng-class="{'is-sorted': tabs.nodes.predicate === 'memory', 'sort-asc': tabs.nodes.reverse === false, 'sort-desc': tabs.nodes.reverse === true}">RAM (GiB)</a>
3129+ </th>
3130+ <th class="u-align--right">
3131+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
3132+ <a href="" data-ng-click="sortTable('disks', 'nodes')" data-ng-class="{'is-sorted': tabs.nodes.predicate === 'disks', 'sort-asc': tabs.nodes.reverse === false, 'sort-desc': tabs.nodes.reverse === true}">Disks</a>
3133+ </th>
3134+ <th class="u-align--right">
3135+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
3136+ <a href="" data-ng-click="sortTable('storage', 'nodes')" data-ng-class="{'is-sorted': tabs.nodes.predicate === 'storage', 'sort-asc': tabs.nodes.reverse === false, 'sort-desc': tabs.nodes.reverse === true}">Storage (GB)</a>
3137+ </th>
3138+ </tr>
3139+ </thead>
3140+ <tbody>
3141+ <!-- XXX blake_r 2015-02-18 - Need to add e2e test. This really needs lots of tests. -->
3142+ <tr
3143+ data-ng-repeat="node in tabs.nodes.filtered_items = (nodes | nodesFilter:tabs.nodes.search | orderBy:tabs.nodes.predicate:tabs.nodes.reverse) track by node.system_id"
3144+ data-ng-class="{ 'table--error': !supportsAction(node, 'nodes'), selected: node.$selected }">
3145+ <td class="table-col--3">
3146+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
3147+ <input class="checkbox" type="checkbox" data-ng-click="toggleChecked(node, 'nodes')" data-ng-checked="node.$selected" id="{$ node.fqdn $}" data-ng-disabled="hasActionsInProgress('nodes')" />
3148+ <label class="checkbox-label" for="{$ node.fqdn $}"></label>
3149+ </td>
3150+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
3151+ <td class="u-align--left" data-ng-show="tabs.nodes.column === 'fqdn'" colspan="2">
3152+ <a href="#/node/{$ node.system_id $}">{$ node.fqdn $}</a>
3153+ </td>
3154+ <!-- XXX ricgard 2016-06-16 - Need to add e2e test. -->
3155+ <td class="ng-hide u-align--left" data-ng-show="tabs.nodes.column === 'pxe_mac'" colspan="2">
3156+ <a href="#/node/{$ node.system_id $}" title="{$ node.pxe_mac_vendor $}">{$ node.pxe_mac $}</a>
3157+ <a href="#/node/{$ node.system_id $}" class="extra-macs" data-ng-show="node.extra_macs.length">(+{$ node.extra_macs.length $})</a>
3158+ </td>
3159+ <td class="powerstate u-align--center">
3160+ <span title="{$ node.power_state $}" class="icon icon--power-{$ node.power_state $}"></span>
3161+ </td>
3162+ <td class="table-col--3"><i data-ng-if="showSpinner(node)" class="icon icon--loading u-animation--spin"></i></td>
3163+ <td class="status u-text--truncate">{$ getStatusText(node) $}</td>
3164+ <td class="table-col--10">{$ node.owner $}</td>
3165+ <td class="u-align--right">{$ node.cpu_count $}</td>
3166+ <td class="u-align--right">{$ node.memory $}</td>
3167+ <td class="u-align--right">{$ node.physical_disk_count $}</td>
3168+ <td class="u-align--right">{$ node.storage $}</td>
3169+ </tr>
3170+ </tbody>
3171+ </table>
3172+ </form>
3173+ </div>
3174+ <div class="nine-col last-col" class="ng-hide" data-ng-show="currentpage === 'devices'">
3175+ <div class="search nine-col">
3176+ <!-- XXX rvba 2015-02-25 - Need to add e2e test. -->
3177+ <input
3178+ type="search" placeholder="Search devices" class="search__input"
3179+ data-ng-model="tabs.devices.search" data-ng-change="updateFilters('devices')"
3180+ data-ng-class="{ error: !tabs.devices.searchValid }"
3181+ data-ng-disabled="tabs.devices.actionOption" />
3182+ <input type="submit" class="search__submit"
3183+ data-ng-class="{ 'search__submit--close': tabs.devices.search.length > 0 }"
3184+ data-ng-click="clearSearch('devices')" />
3185+ </div>
3186+ <table>
3187+ <thead>
3188+ <tr>
3189+ <th class="table-col--3">
3190+ <!-- XXX rvba 2015-02-25 - Need to add e2e test. -->
3191+ <input type="checkbox" class="checkbox" data-ng-click="toggleCheckAll('devices')" data-ng-checked="tabs.devices.allViewableChecked" id="check-all-devices" data-ng-disabled="hasActionsInProgress('devices')" />
3192+ <label for="check-all-devices" class="checkbox-label"></label>
3193+ </th>
3194+ <th class="table-col--24">
3195+ <!-- XXX rvba 2015-02-25 - Need to add e2e test. -->
3196+ <a href="" data-ng-click="sortTable('fqdn', 'devices')" data-ng-class="{'is-sorted': tabs.devices.predicate === 'fqdn', 'sort-asc': tabs.devices.reverse === false, 'sort-desc': tabs.devices.reverse === true}">
3197+ <span title="Fully Qualified Domain Name">FQDN</span>
3198+ </a>
3199+ </th>
3200+ <th class="table-col--25">
3201+ <a href="" data-ng-click="sortTable('primary_mac', 'devices')" data-ng-class="{'is-sorted': tabs.devices.predicate === 'primary_mac', 'sort-asc': tabs.devices.reverse === false, 'sort-desc': tabs.devices.reverse === true}">
3202+ <span title="Media Access Control addresses">MAC</span>
3203+ </a>
3204+ </th>
3205+ <th class="table-col--15">
3206+ <a href="" data-ng-click="sortTable('ip_assignment', 'devices')" data-ng-class="{'is-sorted': tabs.devices.predicate === 'ip_assignment', 'sort-asc': tabs.devices.reverse === false, 'sort-desc': tabs.devices.reverse === true}">IP Assignment</a>
3207+ </th>
3208+ <th class="table-col--20">
3209+ <a href="" data-ng-click="sortTable('ip_address', 'devices')" data-ng-class="{'is-sorted': tabs.devices.predicate === 'ip_address', 'sort-asc': tabs.devices.reverse === false, 'sort-desc': tabs.devices.reverse === true}">IP Address</a>
3210+ </th>
3211+ <th class="table-col--12">
3212+ <!-- XXX rvba 2015-02-25 - Need to add e2e test. -->
3213+ <a href="" data-ng-click="sortTable('owner', 'devices')" data-ng-class="{'is-sorted': tabs.devices.predicate === 'owner', 'sort-asc': tabs.devices.reverse === false, 'sort-desc': tabs.devices.reverse === true}">Owner</a>
3214+ </th>
3215+ </tr>
3216+ </thead>
3217+ <tbody>
3218+ <!-- XXX rvba 2015-02-25 - Need to add e2e test. This really needs lots of tests. -->
3219+ <tr
3220+ data-ng-repeat="device in tabs.devices.filtered_items = (devices | nodesFilter:tabs.devices.search | orderBy:tabs.devices.predicate:tabs.devices.reverse) track by device.system_id"
3221+ data-ng-class="{ 'table--error': !supportsAction(device, 'devices'), selected: device.$selected }">
3222+ <td class="table-col--3">
3223+ <input type="checkbox" class="checkbox" data-ng-click="toggleChecked(device, 'devices')" data-ng-checked="device.$selected" id="{$ device.fqdn $}" data-ng-disabled="hasActionsInProgress('devices')"/>
3224+ <label for="{$ device.fqdn $}" class="checkbox-label"></label>
3225+ </td>
3226+ <td class="table-col--24">{$ device.fqdn $}</td>
3227+ <td class="table-col--25">
3228+ {$ device.primary_mac $}
3229+ <span class="extra-macs" data-ng-show="device.extra_macs.length">(+{$ device.extra_macs.length $})</span>
3230+ </td>
3231+ <td class="table-col--15">{$ getDeviceIPAssignment(device.ip_assignment) $}</td>
3232+ <td class="table-col--20">{$ device.ip_address $}</td>
3233+ <td class="table-col--12">{$ device.owner $}</td>
3234+ </tr>
3235+ </tbody>
3236+ </table>
3237+ </div>
3238+ <div class="twelve-col last-col" class="ng-hide" data-ng-show="currentpage === 'controllers'">
3239+ <div class="search twelve-col">
3240+ <!-- XXX rvba 2015-02-25 - Need to add e2e test. -->
3241+ <input
3242+ type="search" placeholder="Search controllers" class="search__input"
3243+ data-ng-model="tabs.controllers.search" data-ng-change="updateFilters('controllers')"
3244+ data-ng-class="{ error: !tabs.controllers.searchValid }"
3245+ data-ng-disabled="tabs.controllers.actionOption" />
3246+ <input type="submit" class="search__submit"
3247+ data-ng-class="{ 'search__submit--close': tabs.controllers.search.length > 0 }"
3248+ data-ng-click="clearSearch('controllers')" />
3249+ </div>
3250+ <table>
3251+ <thead>
3252+ <tr>
3253+ <th class="table-col--2">
3254+ <!-- XXX rvba 2015-02-25 - Need to add e2e test. -->
3255+ <input type="checkbox" class="checkbox" data-ng-click="toggleCheckAll('controllers')" data-ng-checked="tabs.controllers.allViewableChecked" id="check-all-controllers" data-ng-disabled="hasActionsInProgress('controllers')" />
3256+ <label for="check-all-controllers" class="checkbox-label"></label>
3257+ </th>
3258+ <th class="table-col--19">
3259+ <a href="" data-ng-click="sortTable('fqdn', 'controllers')" data-ng-class="{'is-sorted': tabs.controllers.predicate === 'fqdn', 'sort-asc': tabs.controllers.reverse === false, 'sort-desc': tabs.controllers.reverse === true}">
3260+ <span title="Fully Qualified Domain Name">Name</span>
3261+ </a>
3262+ </th>
3263+ <th class="table-col--4 u-align--center">
3264+ <span title="Status">Status</span>
3265+ </th>
3266+ <th class="table-col--25">
3267+ <a href="" data-ng-click="sortTable('node_type_display', 'controllers')" data-ng-class="{'is-sorted': tabs.controllers.predicate === 'node_type_display', 'sort-asc': tabs.controllers.reverse === false, 'sort-desc': tabs.controllers.reverse === true}">
3268+ <span title="Controller Type">Type</span>
3269+ </a>
3270+ </th>
3271+ <th class="table-col--15">
3272+ <a href="" data-ng-click="sortTable('updated', 'controllers')" data-ng-class="{'is-sorted': tabs.controllers.predicate === 'updated', 'sort-asc': tabs.controllers.reverse === false, 'sort-desc': tabs.controllers.reverse === true}">Last Image Sync</a>
3273+ </th>
3274+ <th class="table-col--15">
3275+ <a href="" data-ng-click="sortTable('updated', 'controllers')" data-ng-class="{'is-sorted': tabs.controllers.predicate === 'updated', 'sort-asc': tabs.controllers.reverse === false, 'sort-desc': tabs.controllers.reverse === true}">Images Status</a>
3276+ </th>
3277+ </tr>
3278+ </thead>
3279+ <tbody>
3280+ <!-- XXX rvba 2015-02-25 - Need to add e2e test. This really needs lots of tests. -->
3281+ <tr
3282+ data-ng-repeat="controller in tabs.controllers.filtered_items = (controllers | nodesFilter:tabs.controllers.search | orderBy:tabs.controllers.predicate:tabs.controllers.reverse) track by controller.system_id"
3283+ data-ng-class="{ 'table--error': !supportsAction(controller, 'controllers'), selected: controller.$selected }">
3284+ <td class="table-col--2">
3285+ <input type="checkbox" class="checkbox" data-ng-click="toggleChecked(controller, 'controllers')" data-ng-checked="controller.$selected" id="{$ controller.fqdn $}" data-ng-disabled="hasActionsInProgress('controllers')"/>
3286+ <label for="{$ controller.fqdn $}" class="checkbox-label"></label>
3287+ </td>
3288+ <td class="table-col--19">
3289+ <a href="#/node/controller/{$ controller.system_id $}">{$ controller.fqdn $}</a>
3290+ </td>
3291+ <td class="table-col--4 u-align--center" data-maas-controller-status="controller" data-maas-services="services"></td>
3292+ <td class="table-col--25">{$ controller.node_type_display $}</td>
3293+ <td class="table-col--15">{$ controller.last_image_sync || 'Never' $}</td>
3294+ <td class="table-col--15">
3295+ <maas-controller-image-status system-id="controller.system_id"></maas-controller-image-status>
3296+ </td>
3297+ </tr>
3298+ </tbody>
3299+ </table>
3300+ </div>
3301+</div>
3302+</div>
3303+>>>>>>> MERGE-SOURCE
3304
3305=== modified file 'src/maasserver/static/partials/settings.html'
3306--- src/maasserver/static/partials/settings.html 2017-04-18 14:59:13 +0000
3307+++ src/maasserver/static/partials/settings.html 2017-04-25 09:34:40 +0000
3308@@ -1,3 +1,4 @@
3309+<<<<<<< TREE
3310 <div class="wrapper--sticky" sticky media-query="min-width: 769px">
3311 <header class="page-header u-margin--bottom-none">
3312 <div class="wrapper--inner">
3313@@ -8,6 +9,9 @@
3314 </div>
3315 </header>
3316 <div class="page-navigation">
3317+=======
3318+<header class="page-header u-margin--bottom" sticky>
3319+>>>>>>> MERGE-SOURCE
3320 <div class="wrapper--inner">
3321 <nav class="page-navigation__links">
3322 <a role="tab" class="page-navigation__link" href="settings/">General</a>
3323
3324=== modified file 'src/maasserver/static/partials/space-details.html'
3325--- src/maasserver/static/partials/space-details.html 2017-03-27 13:09:56 +0000
3326+++ src/maasserver/static/partials/space-details.html 2017-04-25 09:34:40 +0000
3327@@ -1,12 +1,20 @@
3328 <div data-ng-hide="loaded">
3329+<<<<<<< TREE
3330 <header class="page-header" sticky media-query="min-width: 769px">
3331+=======
3332+ <header class="page-header" sticky>
3333+>>>>>>> MERGE-SOURCE
3334 <div class="wrapper--inner">
3335 <h1 class="page-header__title">Loading...</h1>
3336 </div>
3337 </header>
3338 </div>
3339 <div class="ng-hide" data-ng-show="loaded">
3340+<<<<<<< TREE
3341 <header class="page-header" sticky media-query="min-width: 769px">
3342+=======
3343+ <header class="page-header" sticky>
3344+>>>>>>> MERGE-SOURCE
3345 <div class="wrapper--inner">
3346 <h1 class="page-header__title">{$ space.name $}</h1>
3347 <div class="page-header__controls ng-hide" data-ng-show="isSuperUser() && !isDefaultSpace() && !loading">
3348
3349=== modified file 'src/maasserver/static/partials/ssh-keys.html'
3350--- src/maasserver/static/partials/ssh-keys.html 2017-03-28 14:56:11 +0000
3351+++ src/maasserver/static/partials/ssh-keys.html 2017-04-25 09:34:40 +0000
3352@@ -12,6 +12,7 @@
3353 data-ng-class="{ 'is-active': group.id === openRow }">
3354 <div class="table__data table-col--25" aria-label="Source">{$ sourceTitles[group.source] $}</div>
3355 <div data-ng-if="group.source !== 'upload'">
3356+<<<<<<< TREE
3357 <div class="table__data table-col--35" aria-label="ID">{$ group.authId $}</div>
3358 <div class="table__data table-col--30" aria-label="Number of keys">{$ group.keys.length $}
3359 <button class="icon icon--open tooltip u-margin--top-tiny u-padding--left-large" aria-label="Open"
3360@@ -21,13 +22,29 @@
3361 data-ng-click="close()"
3362 data-ng-if="group.source !== 'upload' && openRow === group.id">Close</button>
3363 </div>
3364+=======
3365+ <div class="table__data table-col--35">{$ group.authId $}</div>
3366+ <div class="table__data table-col--30">{$ group.keys.length $}
3367+ <a class="icon icon--open tooltip u-margin--top-tiny u-padding--left-large" aria-label="Open"
3368+ data-ng-click="open(group, 'view')"
3369+ data-ng-if="group.source !== 'upload' && openRow !== group.id">Open</a>
3370+ <a class="icon icon--close tooltip u-margin--top-tiny u-padding--left-large" aria-label="Close"
3371+ data-ng-click="close()"
3372+ data-ng-if="group.source !== 'upload' && openRow === group.id">Close</a></div>
3373+>>>>>>> MERGE-SOURCE
3374 </div>
3375 <div data-ng-if="group.source === 'upload'">
3376 <div class="table__data table-col--65" data-ng-bind-html="trustAsHtml(group.keys[0].display)"></div>
3377 </div>
3378+<<<<<<< TREE
3379 <div class="table__data table-col--10 u-align--right">
3380 <button class="icon icon--delete tooltip" aria-label="Delete"
3381 data-ng-click="open(group, 'delete')">Delete</button>
3382+=======
3383+ <div class="table__data table-col--10 u-align--right">
3384+ <a class="icon icon--delete tooltip" aria-label="Delete"
3385+ data-ng-click="open(group, 'delete')">Delete</a>
3386+>>>>>>> MERGE-SOURCE
3387 </div>
3388 <div class="table__dropdown">
3389 <div class="table__row u-border--none"
3390
3391=== modified file 'src/maasserver/static/partials/subnet-details.html'
3392--- src/maasserver/static/partials/subnet-details.html 2017-04-18 14:59:13 +0000
3393+++ src/maasserver/static/partials/subnet-details.html 2017-04-25 09:34:40 +0000
3394@@ -1,12 +1,21 @@
3395 <div data-ng-hide="loaded">
3396+<<<<<<< TREE
3397 <header class="page-header" sticky media-query="min-width: 769px">
3398+=======
3399+ <header class="page-header" sticky>
3400+>>>>>>> MERGE-SOURCE
3401 <div class="wrapper--inner">
3402 <h1 class="page-header__title">Loading...</h1>
3403 </div>
3404 </header>
3405 </div>
3406+<<<<<<< TREE
3407 <div class="ng-hide" data-ng-show="loaded" window-width>
3408 <header class="page-header" sticky media-query="min-width: 769px">
3409+=======
3410+<div class="ng-hide" data-ng-show="loaded">
3411+ <header class="page-header" sticky>
3412+>>>>>>> MERGE-SOURCE
3413 <div class="wrapper--inner">
3414 <h1 class="page-header__title">{$ subnet.cidr $}</h1>
3415 <!-- "Take action" dropdown -->
3416@@ -39,8 +48,13 @@
3417 <section class="page-header__section twelve-col u-margin--bottom-none ng-hide" data-ng-show="actionError">
3418 <p class="page-header__message page-header__message--error">{$ actionError $}</p>
3419 <div class="page-header__controls">
3420+<<<<<<< TREE
3421 <button class="button--base button--inline" data-ng-click="cancelAction()">Cancel</button>
3422 <button class="button--secondary button--inline" data-ng-click="actionRetry()">Retry</button>
3423+=======
3424+ <a href="" class="button--base button--inline" data-ng-click="cancelAction()">Cancel</a>
3425+ <button class="button--primary button--inline" data-ng-click="actionRetry()">Retry</button>
3426+>>>>>>> MERGE-SOURCE
3427 </div>
3428 </section>
3429 </div>
3430
3431=== modified file 'src/maasserver/static/partials/vlan-details.html'
3432--- src/maasserver/static/partials/vlan-details.html 2017-03-27 13:09:56 +0000
3433+++ src/maasserver/static/partials/vlan-details.html 2017-04-25 09:34:40 +0000
3434@@ -1,12 +1,22 @@
3435+<<<<<<< TREE
3436 <div data-ng-if="!vlanDetails.loaded">
3437 <header class="page-header" sticky media-query="min-width: 769px">
3438+=======
3439+<div data-ng-hide="vlanDetails.loaded">
3440+ <header class="page-header" sticky>
3441+>>>>>>> MERGE-SOURCE
3442 <div class="wrapper--inner">
3443 <h1 class="page-header__title">Loading...</h1>
3444 </div>
3445 </header>
3446 </div>
3447+<<<<<<< TREE
3448 <div data-ng-if="vlanDetails.loaded">
3449 <header class="page-header" sticky media-query="min-width: 769px">
3450+=======
3451+<div class="ng-hide" data-ng-show="vlanDetails.loaded">
3452+ <header class="page-header" sticky>
3453+>>>>>>> MERGE-SOURCE
3454 <div class="wrapper--inner">
3455 <h1 class="page-header__title">{$ vlanDetails.title $}</h1>
3456 <!-- "Take action" dropdown -->
3457
3458=== added file 'src/maasserver/static/scss/_base.forms.scss.OTHER'
3459--- src/maasserver/static/scss/_base.forms.scss.OTHER 1970-01-01 00:00:00 +0000
3460+++ src/maasserver/static/scss/_base.forms.scss.OTHER 2017-04-25 09:34:40 +0000
3461@@ -0,0 +1,377 @@
3462+////
3463+/// @author Web Team at Canonical Ltd
3464+/// @link http://ubuntudesign.github.io/vanilla-framework/docs/#mixin-maas-forms
3465+/// @since 0.0.3
3466+////
3467+
3468+/// Form element styles
3469+/// @group Forms
3470+@mixin maas-forms {
3471+
3472+ // All input elements
3473+ input {
3474+
3475+ &[type='text'],
3476+ &[type='number'],
3477+ &[type='search'],
3478+ &[type='password'],
3479+ &[type='email'],
3480+ &[type='url'],
3481+ &[type='tel'] {
3482+ @extend %input-elements;
3483+ padding: 7px 10px;
3484+ box-shadow: none;
3485+ width: 100%;
3486+
3487+ &::placeholder {
3488+ color: $warm-grey;
3489+ }
3490+
3491+ &[disabled] {
3492+ color: $warm-grey;
3493+ background-color: $transparent;
3494+ }
3495+ }
3496+
3497+ &[type='number'] {
3498+ padding-right: 15px;
3499+ }
3500+
3501+ &[type='search'] {
3502+ appearance: textfield;
3503+ }
3504+
3505+ &[type='search']::-webkit-search-decoration,
3506+ &[type='search']::-webkit-search-cancel-button {
3507+ appearance: none;
3508+ }
3509+
3510+ &[type='checkbox'] {
3511+ margin: 4px 0 0;
3512+ margin-top: 1px 9;
3513+ line-height: normal;
3514+ }
3515+
3516+ &[type='radio'],
3517+ &[type='image'] {
3518+ display: inline-block;
3519+ margin-right: 10px;
3520+ }
3521+ }
3522+
3523+ // Text area styles
3524+ textarea {
3525+ height: auto;
3526+ min-height: 175px;
3527+ padding: 7px 10px !important;
3528+ box-shadow: none;
3529+ width: 100%;
3530+ line-height: 20px;
3531+
3532+ &::placeholder {
3533+ color: $warm-grey;
3534+ }
3535+
3536+ &[disabled] {
3537+ color: $warm-grey;
3538+ background-color: $transparent;
3539+ }
3540+ }
3541+
3542+ // Select dropdown styles
3543+ select {
3544+ @extend %input-elements;
3545+ display: block;
3546+ clear: both;
3547+ cursor: pointer;
3548+ margin: 0;
3549+ background-image: url('#{$asset-path}images/forms/chevron-down.svg');
3550+ background-repeat: no-repeat;
3551+ background-position: top 14px right 10px;
3552+ background-color: $white;
3553+ padding: 7px 30px 7px 10px !important;
3554+ box-shadow: none;
3555+ width: 100%;
3556+
3557+ // Removes firefox select styles & arrow
3558+ -moz-appearance: none;
3559+ appearance: none;
3560+ text-indent: .01px;
3561+ text-overflow: '';
3562+
3563+ &[multiple],
3564+ &[size] {
3565+ height: auto;
3566+ background-image: none;
3567+ padding-top: 10px;
3568+ }
3569+
3570+ &[disabled] {
3571+ color: $warm-grey;
3572+ background-image: none;
3573+ background-color: $transparent;
3574+ }
3575+
3576+ // Removes firefox dotted outline focusing
3577+ &:-moz-focusring {
3578+ color: transparent;
3579+ text-shadow: 0 0 0 $black;
3580+ }
3581+
3582+ &::-ms-expand {
3583+ display: none;
3584+ }
3585+ }
3586+
3587+ fieldset {
3588+ background: none;
3589+ margin-left: 0;
3590+ padding: 0;
3591+ }
3592+
3593+ label {
3594+ display: inline-block;
3595+ max-width: 100%;
3596+ margin-bottom: 5px;
3597+ }
3598+
3599+ /// Base for label styling
3600+ [type="checkbox"] {
3601+
3602+ &:not(:checked),
3603+ &:checked {
3604+ position: absolute;
3605+ left: -9999px;
3606+ }
3607+
3608+ + label {
3609+ height: 16px;
3610+ position: relative;
3611+ padding-left: 25px;
3612+ cursor: pointer;
3613+
3614+ &:before {
3615+ content: '';
3616+ position: absolute;
3617+ left: 0;
3618+ top: 3px;
3619+ width: 11px;
3620+ height: 11px;
3621+ border: 1px solid $mid-grey;
3622+ background: $white;
3623+ border-radius: 2px;
3624+ }
3625+ }
3626+
3627+ &:checked {
3628+
3629+ + label:before {
3630+ background-color: $input-checked;
3631+ border-color: $input-checked;
3632+ }
3633+
3634+ + label:after {
3635+ content: 'âś”';
3636+ position: absolute;
3637+ line-height: 13px;
3638+ top: 3px;
3639+ left: 3px;
3640+ font-size: 10px;
3641+ color: $white;
3642+ transition: all .2s;
3643+
3644+ @-moz-document url-prefix() {
3645+ font-size: 13px;
3646+ left: 1px;
3647+ }
3648+ }
3649+ }
3650+
3651+ &[disabled] {
3652+ cursor: not-allowed;
3653+
3654+ + label {
3655+ cursor: not-allowed;
3656+
3657+ &:before {
3658+ opacity: .5;
3659+ }
3660+ }
3661+ }
3662+ }
3663+
3664+ [type="radio"] {
3665+
3666+ &:not(:checked),
3667+ &:checked {
3668+ position: absolute;
3669+ left: -9999px;
3670+ }
3671+
3672+ + label {
3673+ position: relative;
3674+ padding-left: 25px;
3675+ cursor: pointer;
3676+
3677+ &:before {
3678+ content: '';
3679+ position: absolute;
3680+ left: 0;
3681+ top: 1px;
3682+ width: 13px;
3683+ height: 13px;
3684+ border: 1px solid $mid-grey;
3685+ background: $white;
3686+ border-radius: 50%;
3687+ }
3688+ }
3689+
3690+ &:checked {
3691+
3692+ + label:after {
3693+ content: '';
3694+ position: absolute;
3695+ left: 3px;
3696+ top: 4px;
3697+ width: 9px;
3698+ height: 9px;
3699+ background: $input-checked;
3700+ border-radius: 50%;
3701+ }
3702+ }
3703+ }
3704+
3705+ .tags {
3706+ width: 100%;
3707+
3708+ .tag-list {
3709+ width: 100%;
3710+ margin: 0;
3711+
3712+ .tag-item {
3713+ display: inline-block;
3714+ float: left;
3715+ line-height: 36px;
3716+ margin-bottom: 0;
3717+ margin-right: 10px;
3718+ word-wrap: break-word;
3719+
3720+ .remove-button {
3721+ border-bottom: 0;
3722+ }
3723+ }
3724+ }
3725+
3726+ .input {
3727+ width: 100% !important;
3728+ }
3729+ }
3730+
3731+ .onoffswitch {
3732+ position: relative;
3733+ display: inline-block;
3734+ vertical-align: middle;
3735+ width: 38px;
3736+ margin: 0 0 4px;
3737+ //scss-lint:disable VendorPrefixes
3738+ -webkit-user-select: none;
3739+ -moz-user-select: none;
3740+ -ms-user-select: none;
3741+ //scss-lint:enable VendorPrefixes
3742+
3743+ &[disabled] {
3744+
3745+ .onoffswitch-checkbox,
3746+ .onoffswitch-label {
3747+ opacity: .5;
3748+ pointer-events: none;
3749+ }
3750+ }
3751+ }
3752+
3753+ .onoffswitch-external-label {
3754+ display: inline-block;
3755+ margin-left: 5px;
3756+ }
3757+
3758+ .onoffswitch-checkbox {
3759+ display: none !important;
3760+ }
3761+
3762+ .onoffswitch-label {
3763+ display: block !important;
3764+ overflow: hidden;
3765+ cursor: pointer;
3766+ border-radius: 2px;
3767+ padding-left: 0 !important;
3768+ margin: 0 !important;
3769+
3770+ &:before,
3771+ &:after {
3772+ display: none;
3773+ }
3774+ }
3775+
3776+ .onoffswitch-inner {
3777+ display: block;
3778+ width: 200%;
3779+ margin-left: -100%;
3780+ transition: margin .3s ease-in 0s;
3781+
3782+ &:before,
3783+ &:after {
3784+ display: block;
3785+ float: left;
3786+ width: 50%;
3787+ height: 18px;
3788+ padding: 0;
3789+ line-height: 18px;
3790+ font-size: 14px;
3791+ color: $white;
3792+ font-family: Trebuchet, Arial, sans-serif;
3793+ font-weight: bold;
3794+ box-sizing: border-box;
3795+ }
3796+
3797+ &:before {
3798+ content: '';
3799+ padding-left: 10px;
3800+ background-color: $success;
3801+ color: $white;
3802+ }
3803+
3804+ &:after {
3805+ content: '';
3806+ padding-right: 10px;
3807+ background-color: $gallery-grey;
3808+ color: $warm-grey;
3809+ text-align: right;
3810+ }
3811+ }
3812+
3813+ .onoffswitch-switch {
3814+ display: block;
3815+ width: 19px;
3816+ height: 16px;
3817+ margin: 0;
3818+ background: $white;
3819+ position: absolute;
3820+ top: 0;
3821+ bottom: 0;
3822+ right: 19px;
3823+ border: 1px solid $outline;
3824+ border-radius: 2px;
3825+ transition: all .3s ease-in 0s;
3826+ box-sizing: border-box;
3827+ }
3828+
3829+ .onoffswitch-checkbox:checked + .onoffswitch-label {
3830+ .onoffswitch-inner {
3831+ margin-left: 0;
3832+ }
3833+
3834+ .onoffswitch-switch {
3835+ right: 0;
3836+ }
3837+ }
3838+}
3839
3840=== added file 'src/maasserver/static/scss/_components.buttons.scss.OTHER'
3841--- src/maasserver/static/scss/_components.buttons.scss.OTHER 1970-01-01 00:00:00 +0000
3842+++ src/maasserver/static/scss/_components.buttons.scss.OTHER 2017-04-25 09:34:40 +0000
3843@@ -0,0 +1,149 @@
3844+////
3845+/// @author Web Team at Canonical Ltd
3846+/// @link http://ubuntudesign.github.io/maas-gui-vanilla-theme/docs/#mixin-maas-buttons
3847+/// @since 0.0.1
3848+////
3849+
3850+/// Buttons element styles
3851+/// @group Forms
3852+@mixin maas-buttons {
3853+ // .button--primary {
3854+ // line-height: 20px;
3855+ // }
3856+
3857+ .button--primary,
3858+ .button--secondary {
3859+ @extend %button-pattern;
3860+ }
3861+
3862+ .button--secondary {
3863+ line-height: 18px;
3864+ }
3865+
3866+ .button--primary,
3867+ .button--destructive,
3868+ .button--positive {
3869+
3870+ &:hover {
3871+ color: $white;
3872+ }
3873+ }
3874+
3875+ .button--base,
3876+ .button--neutral {
3877+
3878+ &:hover {
3879+ color: $cool-grey;
3880+ }
3881+ }
3882+
3883+ .button--large {
3884+ height: auto;
3885+ padding-top: 15px;
3886+ padding-bottom: 15px;
3887+ }
3888+}
3889+
3890+@mixin maas-button-group {
3891+ .button-group {
3892+ position: relative;
3893+ width: 100%;
3894+ vertical-align: middle;
3895+ clear: both;
3896+ min-width: 160px;
3897+
3898+ &.button-group--inline {
3899+ display: inline-block;
3900+ width: auto;
3901+ }
3902+
3903+ .button-group__link {
3904+ display: inline-block;
3905+ float: left;
3906+ text-align: left;
3907+ padding-right: 35px;
3908+
3909+ &::after {
3910+ content: '';
3911+ display: inline-block;
3912+ position: absolute;
3913+ top: 15px;
3914+ right: 15px;
3915+ width: 4px;
3916+ height: 4px;
3917+ vertical-align: middle;
3918+ border-right: 1px solid;
3919+ border-bottom: 1px solid;
3920+ transform: rotate(45deg);
3921+ }
3922+ }
3923+
3924+ .button-group__dropdown {
3925+ border-radius: 3px;
3926+ left: 0;
3927+ margin: 0;
3928+ list-style: none;
3929+ background: $white;
3930+ box-shadow: 0 1px 1px rgba(0, 0, 0, .1);
3931+ z-index: 20;
3932+ max-height: 1000px;
3933+ transition: max-height .3s ease-in;
3934+ position: absolute;
3935+ top: 36px;
3936+ clear: both;
3937+ min-width: 160px;
3938+ }
3939+
3940+ .button-group__item {
3941+ float: left;
3942+ clear: both;
3943+ padding: 5px 10px;
3944+ margin: 0;
3945+ width: 100%;
3946+
3947+ .button-group__item-link {
3948+ color: $cool-grey;
3949+ cursor: pointer;
3950+ width: 100%;
3951+ float: left;
3952+ margin: 0;
3953+ border: 0;
3954+ text-transform: lowercase;
3955+ white-space: nowrap;
3956+
3957+ &:first-letter {
3958+ text-transform: uppercase;
3959+ }
3960+
3961+ &:hover {
3962+ color: $link-hover;
3963+ text-decoration: none;
3964+ }
3965+ }
3966+ }
3967+ }
3968+ // scss-lint:enable SelectorFormat
3969+}
3970+
3971+%button-pattern {
3972+ line-height: 20px;
3973+ white-space: nowrap;
3974+ vertical-align: middle;
3975+ touch-action: manipulation;
3976+ cursor: pointer;
3977+ user-select: none;
3978+ padding: 8px 14px;
3979+ height: 36px;
3980+ box-sizing: border-box;
3981+
3982+ &[disabled],
3983+ &.button--disabled {
3984+ pointer-events: none;
3985+ opacity: .5;
3986+ }
3987+
3988+ &.button--inline {
3989+ display: inline-block;
3990+ width: auto;
3991+ }
3992+}
3993
3994=== added file 'src/maasserver/static/scss/_components.flashmessages.scss.OTHER'
3995--- src/maasserver/static/scss/_components.flashmessages.scss.OTHER 1970-01-01 00:00:00 +0000
3996+++ src/maasserver/static/scss/_components.flashmessages.scss.OTHER 2017-04-25 09:34:40 +0000
3997@@ -0,0 +1,59 @@
3998+////
3999+/// @author Web Team at Canonical Ltd
4000+/// @link http://ubuntudesign.github.io/maas-gui-vanilla-theme/docs/#mixin-tool-tips
4001+/// @since 0.0.1
4002+////
4003+
4004+/// Flash message styles
4005+/// @group maas flash messages
4006+@mixin maas-flash-messages {
4007+ .flash-messages {
4008+ width: 100%;
4009+ float: left;
4010+ margin: 0;
4011+
4012+ .flash-messages__item {
4013+ box-sizing: border-box;
4014+ border-radius: 2px;
4015+ list-style: none;
4016+ padding: 15px 20px;
4017+ margin: 0 0 20px;
4018+ background: $white;
4019+ background-position: top 50% left 15px;
4020+ background-repeat: no-repeat;
4021+ box-shadow: 0 1px 1px rgba(0, 0, 0, .1);
4022+
4023+ &:last-of-type {
4024+ margin-bottom: 0;
4025+ }
4026+
4027+ &.flash-messages__item--error {
4028+ background: $white url('#{$asset-path}images/icons/error.svg') no-repeat;
4029+ background-size: 16px 16px;
4030+ background-position: 15px center;
4031+ padding-left: 45px;
4032+ }
4033+
4034+ &.flash-messages__item--info {
4035+ background: $white url('#{$asset-path}images/icons/info.svg') no-repeat;
4036+ background-size: 16px 16px;
4037+ background-position: 15px center;
4038+ padding-left: 45px;
4039+ }
4040+
4041+ &.flash-messages__item--warning {
4042+ background: $white url('#{$asset-path}images/icons/warning.svg') no-repeat;
4043+ background-size: 16px 16px;
4044+ background-position: 15px center;
4045+ padding-left: 45px;
4046+ }
4047+
4048+ &.flash-messages__item--success {
4049+ background: $white url('#{$asset-path}images/icons/success.svg') no-repeat;
4050+ background-size: 16px 16px;
4051+ background-position: 15px center;
4052+ padding-left: 45px;
4053+ }
4054+ }
4055+ }
4056+}
4057
4058=== added file 'src/maasserver/static/scss/_components.forms.scss.OTHER'
4059--- src/maasserver/static/scss/_components.forms.scss.OTHER 1970-01-01 00:00:00 +0000
4060+++ src/maasserver/static/scss/_components.forms.scss.OTHER 2017-04-25 09:34:40 +0000
4061@@ -0,0 +1,201 @@
4062+////
4063+/// @author Web Team at Canonical Ltd
4064+/// @link http://ubuntudesign.github.io/vanilla-framework/docs/#mixin-vf-forms
4065+/// @since 0.0.3
4066+////
4067+
4068+/// Form layout element styles
4069+/// @group Forms
4070+@mixin maas-form-layouts {
4071+ .form {
4072+
4073+ .form__group {
4074+ margin-bottom: 10px;
4075+
4076+ .form__group-input {
4077+ position: relative;
4078+
4079+ .form__group-remove {
4080+ position: absolute;
4081+ top: 10px;
4082+ right: 10px;
4083+ cursor: pointer;
4084+ height: 16px;
4085+ width: 16px;
4086+ background: url('#{$asset-path}images/icons/remove.svg') no-repeat;
4087+ background-size: 75% 75%;
4088+ background-position: center;
4089+ display: inline-block;
4090+ }
4091+
4092+ .icon {
4093+ position: absolute;
4094+ top: 10px;
4095+ right: 10px;
4096+ display: inline-block;
4097+ }
4098+ }
4099+
4100+ &.form__group--subtle {
4101+
4102+ .form__group-label {
4103+ color: $warm-grey;
4104+ }
4105+
4106+ input,
4107+ select,
4108+ textarea {
4109+ border-color: $mercury-grey;
4110+ background-color: transparent;
4111+
4112+ &:hover {
4113+ border-color: $mid-grey;
4114+ background-color: $white;
4115+ outline: none;
4116+ }
4117+
4118+ &:active,
4119+ &:focus {
4120+ border-color: $warm-grey;
4121+ background-color: $white;
4122+ outline: none;
4123+ }
4124+ }
4125+ }
4126+ }
4127+
4128+ .form__fieldset {
4129+
4130+ .form__group:last-of-type {
4131+ margin-bottom: 0;
4132+ }
4133+ }
4134+
4135+ .form__siblings {
4136+ float: left;
4137+ width: 100%;
4138+ margin-bottom: 10px;
4139+
4140+ &:hover {
4141+
4142+ .form__group--subtle {
4143+
4144+ input,
4145+ select,
4146+ textarea {
4147+ border-color: $mid-grey;
4148+ background-color: $white;
4149+ outline: none;
4150+ }
4151+ }
4152+ }
4153+
4154+ &.is-active {
4155+
4156+ .form__group--subtle {
4157+
4158+ input,
4159+ select,
4160+ textarea {
4161+ border-color: $mid-grey;
4162+ background-color: $white;
4163+ outline: none;
4164+ }
4165+ }
4166+ }
4167+ }
4168+
4169+ &.form--stack {
4170+
4171+ .form__group {
4172+ width: 100%;
4173+ float: left;
4174+
4175+ [class*='-col'] {
4176+ margin-bottom: 0;
4177+ }
4178+
4179+ .form__group-label {
4180+ margin-top: 0;
4181+ margin-bottom: 0;
4182+ line-height: 34px;
4183+ vertical-align: top;
4184+ }
4185+
4186+ .form__group-input {
4187+ min-height: 34px;
4188+
4189+ .onoffswitch {
4190+ margin-top: 9px;
4191+ }
4192+ }
4193+ }
4194+ }
4195+
4196+ &.form--inline {
4197+
4198+ .form__fieldset {
4199+ display: inline-block;
4200+ width: auto;
4201+ margin: 0;
4202+ vertical-align: middle;
4203+ }
4204+
4205+ .form__group {
4206+ display: inline-block;
4207+ margin: 0 20px 0 0;
4208+ vertical-align: top;
4209+
4210+ .form__group-label {
4211+ margin-bottom: 0;
4212+ margin-right: 10px;
4213+ vertical-align: top;
4214+ line-height: 34px;
4215+
4216+ .icon--left {
4217+ position: absolute;
4218+ left: 0;
4219+ top: 12px;
4220+ }
4221+ }
4222+
4223+ input,
4224+ select,
4225+ .form__group-input {
4226+ display: inline-block;
4227+ width: auto;
4228+ min-height: 34px;
4229+ }
4230+
4231+ [type='checkbox'] + label,
4232+ [type='radio'] + label {
4233+ line-height: 34px;
4234+ }
4235+
4236+ .onoffswitch {
4237+ margin: 9px 0 0;
4238+ }
4239+
4240+ .onoffswitch-external-label {
4241+ margin: 0;
4242+ vertical-align: middle;
4243+ line-height: 34px;
4244+ }
4245+ }
4246+ }
4247+
4248+ .form__help-text {
4249+ @include font-size(14px);
4250+ color: $warm-grey;
4251+ }
4252+ }
4253+
4254+ .form__error {
4255+ margin: 0;
4256+ color: $error;
4257+
4258+ .form__error-item {
4259+ margin: 6px 0;
4260+ }
4261+ }
4262+}
4263
4264=== added file 'src/maasserver/static/scss/_components.icons.scss.OTHER'
4265--- src/maasserver/static/scss/_components.icons.scss.OTHER 1970-01-01 00:00:00 +0000
4266+++ src/maasserver/static/scss/_components.icons.scss.OTHER 2017-04-25 09:34:40 +0000
4267@@ -0,0 +1,274 @@
4268+////
4269+/// @author Web Team at Canonical Ltd
4270+/// @link http://ubuntudesign.github.io/maas-gui-vanilla-theme/docs/#mixin-maas-icons
4271+/// @since 0.0.1
4272+////
4273+
4274+/// Icons
4275+/// @group Icons
4276+@mixin maas-icons {
4277+
4278+ .icon {
4279+ @include icon-size(16px);
4280+ padding: 0;
4281+ border-bottom: 0 !important;
4282+ display: inline-block;
4283+ vertical-align: middle;
4284+ text-indent: 999em;
4285+
4286+ &.icon--add {
4287+ background: url('#{$asset-path}images/icons/add.svg') no-repeat;
4288+ background-size: 100% 100%;
4289+ }
4290+
4291+ &.icon--account {
4292+ background: url('#{$asset-path}images/icons/account.svg') no-repeat;
4293+ background-size: 100% 100%;
4294+ }
4295+
4296+ &.icon--cross {
4297+ background: url('#{$asset-path}images/icons/cross.svg') no-repeat;
4298+ background-size: 100% 100%;
4299+ }
4300+
4301+ &.icon--cross-orange {
4302+ background: url('#{$asset-path}images/icons/cross-orange.svg') no-repeat;
4303+ background-size: 100% 100%;
4304+ }
4305+
4306+ &.icon--debug {
4307+ background: url('#{$asset-path}images/icons/debug.svg') no-repeat;
4308+ background-size: 100% 100%;
4309+ }
4310+
4311+ &.icon--delete {
4312+ background: url('#{$asset-path}images/icons/delete.svg') no-repeat;
4313+ background-size: 100% 100%;
4314+ }
4315+
4316+ &.icon--edit {
4317+ background: url('#{$asset-path}images/icons/edit.svg') no-repeat;
4318+ background-size: 100% 100%;
4319+ }
4320+
4321+ &.icon--error {
4322+ background: url('#{$asset-path}images/icons/error.svg') no-repeat;
4323+ background-size: 100% 100%;
4324+ }
4325+
4326+ &.icon--help {
4327+ background: url('#{$asset-path}images/icons/help.svg') no-repeat;
4328+ background-size: 100% 100%;
4329+ }
4330+
4331+ &.icon--info {
4332+ background: url('#{$asset-path}images/icons/info.svg') no-repeat;
4333+ background-size: 100% 100%;
4334+ }
4335+
4336+ &.icon--loading {
4337+ background: url('#{$asset-path}images/icons/loading.png') no-repeat;
4338+ background-size: 100% 100%;
4339+ }
4340+
4341+ &.icon--mount {
4342+ background: url('#{$asset-path}images/icons/mount.svg') no-repeat;
4343+ background-size: 100% 100%;
4344+ }
4345+
4346+ &.icon--unmount {
4347+ background: url('#{$asset-path}images/icons/unmount.svg') no-repeat;
4348+ background-size: 100% 100%;
4349+ }
4350+
4351+ &.icon--partition {
4352+ background: url('#{$asset-path}images/icons/partition.svg') no-repeat;
4353+ background-size: 100% 100%;
4354+ }
4355+
4356+ &.icon--power-error {
4357+ background: url('#{$asset-path}images/icons/power-error.svg') no-repeat;
4358+ background-size: 100% 100%;
4359+ }
4360+
4361+ &.icon--power-off {
4362+ background: url('#{$asset-path}images/icons/power-off.svg') no-repeat;
4363+ background-size: 100% 100%;
4364+ }
4365+
4366+ &.icon--power-on {
4367+ background: url('#{$asset-path}images/icons/power-on.svg') no-repeat;
4368+ background-size: 100% 100%;
4369+ }
4370+
4371+ &.icon--remove {
4372+ background: url('#{$asset-path}images/icons/remove.svg') no-repeat;
4373+ background-size: 100% 100%;
4374+ }
4375+
4376+ &.icon--success {
4377+ background: url('#{$asset-path}images/icons/success.svg') no-repeat;
4378+ background-size: 100% 100%;
4379+
4380+ &-mono {
4381+ background: url('#{$asset-path}images/icons/success-mono.svg') no-repeat;
4382+ background-size: 100% 100%;
4383+ }
4384+
4385+ &-grey {
4386+ background: url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="success"><rect id="rect6708" x="0" y="9.99999989e-06" width="16" height="16"></rect><circle id="circle6710" stroke="#{$warm-grey}" stroke-width="1.5" fill="#{$warm-grey}" cx="8" cy="8.00001" r="7.2500086"></circle><polygon id="path6712" fill="#{$white}" points="11.80029 4.92345 11.73439 4.98115 6.99964 9.12837 4.22407 6.74743 3.38501 7.69631 7.00033 11.50002 12.5 5.71278 11.80029 4.92349"></polygon></g></g></svg>');
4387+ background-size: 100% 100%;
4388+ }
4389+ }
4390+
4391+ &.icon--settings {
4392+ background: url('#{$asset-path}images/icons/settings.svg') no-repeat;
4393+ background-size: 100% 100%;
4394+ }
4395+
4396+ &.icon--sync {
4397+ background: url('#{$asset-path}images/icons/sync.svg') no-repeat;
4398+ background-size: 100% 100%;
4399+ }
4400+
4401+ &.icon--search {
4402+ background: url('#{$asset-path}images/icons/magnifying_glass.svg') no-repeat;
4403+ background-size: 100% 100%;
4404+ }
4405+
4406+ &.icon--system-shutdown {
4407+ background: url('#{$asset-path}images/icons/system-shutdown.svg') no-repeat;
4408+ background-size: 100% 100%;
4409+ }
4410+
4411+ &.icon--tooltip {
4412+ background: url('#{$asset-path}images/icons/tooltip.svg') no-repeat;
4413+ background-size: 100% 100%;
4414+ }
4415+
4416+ &.icon--tags {
4417+ background: url('#{$asset-path}images/icons/tags.svg') no-repeat;
4418+ background-size: 100% 100%;
4419+ }
4420+
4421+ &.icon--tick {
4422+ background: url('#{$asset-path}images/icons/tick.svg') no-repeat;
4423+ background-size: 100% 100%;
4424+ }
4425+
4426+ &.icon--logical-volume {
4427+ background: url('#{$asset-path}images/icons/logical-volume.svg') no-repeat;
4428+ background-size: 100% 100%;
4429+ }
4430+
4431+ &.icon--warning {
4432+ background: url('#{$asset-path}images/icons/warning.svg') no-repeat;
4433+ background-size: 100% 100%;
4434+
4435+ &-mono {
4436+ background: url('#{$asset-path}images/icons/warning-mono.svg') no-repeat;
4437+ }
4438+ }
4439+
4440+ &.icon--open {
4441+ background: url('#{$asset-path}images/forms/chevron-down.svg') no-repeat;
4442+ background-size: 10px 4px;
4443+ background-position: center 4px;
4444+ }
4445+
4446+ &.icon--close {
4447+ background: url('#{$asset-path}images/forms/chevron-up.svg') no-repeat;
4448+ background-size: 10px 4px;
4449+ background-position: center 4px;
4450+ }
4451+
4452+ &--status-failed {
4453+ //scss-lint:disable PlaceholderInExtend
4454+ @extend .icon;
4455+ //scss-link:enable PlaceholderInExtend
4456+ content: url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="status-queued" transform="translate(1, 1)"><g id="Page-1"><g id="status-queued"><g id="Group"><circle id="Oval" stroke="#{$status-failed}" stroke-width="2" cx="6" cy="6" r="6"></circle><circle id="Oval-Copy" class="status-circle" fill="#{$status-failed}" cx="6" cy="6" r="4"></circle></g></g></g></g></g></svg>');
4457+ }
4458+
4459+ &--status-in-progress {
4460+ //scss-lint:disable PlaceholderInExtend
4461+ @extend .icon;
4462+ //scss-link:enable PlaceholderInExtend
4463+ content: url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="status-queued" transform="translate(1, 1)"><g id="Page-1"><g id="status-queued"><g id="Group"><circle id="Oval" stroke="#{$status-in-progress}" stroke-width="2" cx="6" cy="6" r="6"></circle><circle id="Oval-Copy" class="status-circle" fill="#{$status-in-progress}" cx="6" cy="6" r="4"></circle></g></g></g></g></g></svg>');
4464+ }
4465+
4466+ &--status-queued {
4467+ //scss-lint:disable PlaceholderInExtend
4468+ @extend .icon;
4469+ //scss-link:enable PlaceholderInExtend
4470+ content: url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="status-queued" transform="translate(1, 1)"><g id="Page-1"><g id="status-queued"><g id="Group"><circle id="Oval" stroke="#{$status-queued}" stroke-width="2" cx="6" cy="6" r="6"></circle><circle id="Oval-Copy" class="status-circle" fill="#{$status-queued}" cx="6" cy="6" r="4"></circle></g></g></g></g></g></svg>');
4471+ }
4472+
4473+ &--status-succeeded {
4474+ //scss-lint:disable PlaceholderInExtend
4475+ @extend .icon;
4476+ //scss-link:enable PlaceholderInExtend
4477+ content: url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="status-queued" transform="translate(1, 1)"><g id="Page-1"><g id="status-queued"><g id="Group"><circle id="Oval" stroke="#{$status-succeeded}" stroke-width="2" cx="6" cy="6" r="6"></circle><circle id="Oval-Copy" class="status-circle" fill="#{$status-succeeded}" cx="6" cy="6" r="4"></circle></g></g></g></g></g></svg>');
4478+ }
4479+
4480+ &--status-waiting {
4481+ //scss-lint:disable PlaceholderInExtend
4482+ @extend .icon;
4483+ //scss-link:enable PlaceholderInExtend
4484+ content: url('data:image/svg+xml;utf8, <svg width="16px" height="16px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="status-queued" transform="translate(1, 1)"><g id="Page-1"><g id="status-queued"><g id="Group"><circle id="Oval" stroke="#{$status-waiting}" stroke-width="2" cx="6" cy="6" r="6"></circle><circle id="Oval-Copy" class="status-circle" fill="#{$status-waiting}" cx="6" cy="6" r="4"></circle></g></g></g></g></g></svg>');
4485+ }
4486+ }
4487+
4488+ /// Set a specific icon size
4489+ .icon--small {
4490+ @include icon-size(14px);
4491+ }
4492+
4493+ .icon--large {
4494+ @include icon-size(20px);
4495+ }
4496+
4497+ .icon--mega {
4498+ @include icon-size(23px);
4499+ }
4500+
4501+ .icon--gigantic {
4502+ @include icon-size(32px);
4503+ }
4504+
4505+ /// Icon alignment for headings / text
4506+ h1 {
4507+
4508+ .icon {
4509+ margin-top: -6px;
4510+ }
4511+ }
4512+
4513+ h2,
4514+ h3 {
4515+
4516+ .icon {
4517+ margin-top: -5px;
4518+ }
4519+ }
4520+
4521+ h4,
4522+ h5,
4523+ p,
4524+ label,
4525+ button,
4526+ a,
4527+ th,
4528+ td,
4529+ .table__header,
4530+ .table__data {
4531+
4532+ .icon {
4533+ margin-top: -3px;
4534+ }
4535+ }
4536+}
4537+
4538+@mixin icon-size($size) {
4539+ width: $size;
4540+ height: $size;
4541+}
4542
4543=== added file 'src/maasserver/static/scss/_components.tables.scss.OTHER'
4544--- src/maasserver/static/scss/_components.tables.scss.OTHER 1970-01-01 00:00:00 +0000
4545+++ src/maasserver/static/scss/_components.tables.scss.OTHER 2017-04-25 09:34:40 +0000
4546@@ -0,0 +1,668 @@
4547+////
4548+/// @author Web Team at Canonical Ltd
4549+/// @link http://ubuntudesign.github.io/maas-gui-vanilla-theme/docs/#mixin-maas-table
4550+/// @since 0.0.3
4551+////
4552+
4553+/// MAAS table styling
4554+/// @group maas table
4555+@mixin maas-table {
4556+ @include tables($alto-grey, $warm-grey, 16px, 13px);
4557+ @include table-columns(100);
4558+}
4559+
4560+// scss-lint:disable SelectorFormat
4561+@mixin tables($table-border-color, $table-header-color, $table-font-size, $table-header-size) {
4562+
4563+ // scss-lint:disable NestingDepth
4564+
4565+ // Here is the main placeholder styles for tables. All main elements can be
4566+ // changed or amended here and will effect standard table markup / class based
4567+ // div created tables.
4568+ %table {
4569+ border-color: $table-border-color;
4570+ border-spacing: 0;
4571+ overflow-x: scroll;
4572+ margin: 0 0 20px;
4573+ width: 100%;
4574+ text-align: left;
4575+ border-collapse: separate;
4576+
4577+ // Table row styles
4578+ %table-row {
4579+ width: 100%;
4580+ border-color: rgb(178, 178, 178);
4581+ border-bottom-style: dotted;
4582+ border-bottom-width: 1px;
4583+ }
4584+
4585+ // Table cell styles
4586+ %table-cell {
4587+ @include font-size($table-font-size);
4588+ padding: 10px;
4589+ box-sizing: border-box;
4590+ min-height: 21px;
4591+ background: none;
4592+ border: 0;
4593+ text-align: left;
4594+ border-collapse: separate;
4595+ vertical-align: top;
4596+ backface-visibility: hidden;
4597+ position: relative;
4598+ }
4599+
4600+ // Table header row styles
4601+ %table-header-row {
4602+ color: $table-header-color;
4603+ border-bottom: 1px solid;
4604+
4605+ &:hover {
4606+ background-color: transparent;
4607+ }
4608+ }
4609+
4610+ // Table header cell styles
4611+ %table-header {
4612+ @include font-size($table-header-size);
4613+ background: none;
4614+ color: $table-header-color;
4615+ font-size: 13px;
4616+
4617+ input {
4618+
4619+ &[type="radio"],
4620+ &[type="checkbox"] {
4621+
4622+ + label {
4623+ margin: 0;
4624+ top: -3px;
4625+ }
4626+ }
4627+ }
4628+ }
4629+
4630+ // Table header hyperlink styles
4631+ %table-header-link {
4632+ color: $table-header-color;
4633+ border-bottom: 0;
4634+
4635+ &:hover {
4636+ color: $text-color;
4637+ text-decoration: none;
4638+ }
4639+
4640+ // Sorting and active styles when filtering a table
4641+ &.is-active {
4642+ color: $text-color;
4643+ text-decoration: none;
4644+ }
4645+
4646+ &.is-sorted {
4647+ border-bottom: 1px solid $text-color;
4648+ }
4649+ }
4650+
4651+ // Table divide is used for multiple table header options
4652+ %table-divide {
4653+ width: 1px;
4654+ display: inline-block;
4655+ background: $table-header-color;
4656+ height: 10px;
4657+ margin: 0 5px;
4658+ }
4659+
4660+ .numerical {
4661+ text-align: right;
4662+ }
4663+
4664+ // Generic table form elements, covers general alignment of common form
4665+ // elements which can be found in all tables.
4666+ input {
4667+
4668+ &[type="radio"],
4669+ &[type="checkbox"] {
4670+
4671+ + label {
4672+ margin: 0;
4673+ top: -1px;
4674+ }
4675+ }
4676+ }
4677+ }
4678+
4679+ // Generic table styles, this is to be used for simple display of data which
4680+ // doesn't reqire dropdowns or form input interaction. Example would be a
4681+ // listing of machines or generic report information.
4682+ //
4683+ // @example
4684+ // <table>
4685+ // <thead>
4686+ // <tr>
4687+ // <th>...</th>
4688+ // ...
4689+ // </tr>
4690+ // </thead>
4691+ // <tfoot>
4692+ // <tr>
4693+ // <td>...</td>
4694+ // ...
4695+ // </tr>
4696+ // </tfoot>
4697+ // <tbody>
4698+ // <tr>
4699+ // <td>...</td>
4700+ // ...
4701+ // </tr>
4702+ // </tbody>
4703+ // </table>
4704+ table {
4705+ @extend %table;
4706+
4707+ tr {
4708+ @extend %table-row;
4709+ }
4710+
4711+ th,
4712+ td {
4713+ @extend %table-cell;
4714+ }
4715+
4716+ th {
4717+ color: $table-header-color;
4718+ border-bottom: 1px solid;
4719+ }
4720+
4721+ td {
4722+ border-color: rgb(178, 178, 178);
4723+ border-bottom-style: dotted;
4724+ border-bottom-width: 1px;
4725+
4726+ a:link,
4727+ a:visited {
4728+ color: $text-color;
4729+ border-bottom: 1px solid $link-border;
4730+
4731+ &:hover {
4732+ text-decoration: none;
4733+ color: $link-hover;
4734+ }
4735+ }
4736+ }
4737+
4738+ thead {
4739+ width: 100% !important;
4740+ display: table-header-group !important;
4741+
4742+ tr {
4743+ @extend %table-header-row;
4744+ }
4745+
4746+ th {
4747+ @extend %table-header;
4748+
4749+ a:link,
4750+ a:visited {
4751+ @extend %table-header-link;
4752+ }
4753+ }
4754+
4755+ &.table__head--sticky {
4756+ background: $white;
4757+ padding: 0;
4758+ width: 100vw !important;
4759+ left: 0 !important;
4760+ right: 0 !important;
4761+ height: auto;
4762+
4763+ tr {
4764+ max-width: $site-max-width;
4765+ width: 100%;
4766+ margin: 0 auto;
4767+ display: block;
4768+ float: none;
4769+ border-bottom: 0;
4770+ overflow: hidden;
4771+
4772+ th {
4773+ border-bottom: 0;
4774+ float: left;
4775+ }
4776+ }
4777+ }
4778+
4779+ .divide {
4780+ @extend %table-divide;
4781+ }
4782+ }
4783+ }
4784+
4785+ // Table styles used to replicate the table layout but where extra interaction
4786+ // can not be created using standard table elements. This includes in table
4787+ // form editing, dropdown elements and layouts not possibile using tables.
4788+ //
4789+ // @example
4790+ // <div class="table">
4791+ // <header class="table__head">
4792+ // <div class="table__row">
4793+ // <div class="table__header">...</div>
4794+ // ...
4795+ // </div>
4796+ // </div>
4797+ // <footer class="table__footer">
4798+ // <div class="table__row">
4799+ // <div class="table__data>...</div>
4800+ // ...
4801+ // </div>
4802+ // </footer>
4803+ // <section class="table__body">
4804+ // <div class="table__row">
4805+ // <div class="table__data>...</div>
4806+ // ...
4807+ // </div>
4808+ // </section>
4809+ // </div>
4810+ .table {
4811+ @extend %table;
4812+ display: table;
4813+
4814+ // Table row style
4815+ .table__row {
4816+ @extend %table-row;
4817+ float: left;
4818+ display: table-row;
4819+
4820+ // Table row hover style, this can reveal control elements
4821+ &:hover {
4822+ background-color: $white;
4823+
4824+ // Set controls z-index and opacity so it is visible
4825+ .table__controls {
4826+ z-index: 1;
4827+ opacity: 1;
4828+
4829+ &--secondary {
4830+ z-index: 1;
4831+ opacity: 1;
4832+ }
4833+ }
4834+ }
4835+
4836+ // Active state on .table__row
4837+ &.is-active {
4838+ background-color: $white;
4839+
4840+ .table__controls {
4841+ z-index: 1;
4842+ opacity: 1;
4843+
4844+ &--secondary {
4845+ z-index: 1;
4846+ opacity: 1;
4847+ }
4848+ }
4849+
4850+ .table__dropdown {
4851+
4852+ .table__row {
4853+ display: none;
4854+
4855+ &.is-active {
4856+ display: block;
4857+ }
4858+ }
4859+ }
4860+ }
4861+ }
4862+
4863+ .table__header,
4864+ .table__data {
4865+ @extend %table-cell;
4866+ display: table-cell;
4867+ float: left;
4868+ }
4869+
4870+ .table__data {
4871+
4872+ a:link,
4873+ a:visited {
4874+ color: $text-color;
4875+ border-bottom: 1px solid $link-border;
4876+
4877+ &:hover {
4878+ text-decoration: none;
4879+ color: $link-hover;
4880+ }
4881+ }
4882+ }
4883+
4884+ .table__head {
4885+ display: table-head;
4886+ width: 100%;
4887+ box-sizing: border-box;
4888+ width: auto !important;
4889+
4890+ &.table__head--sticky {
4891+ background: $white;
4892+ padding: 0;
4893+ width: 100vw !important;
4894+ left: 0 !important;
4895+ right: 0 !important;
4896+ border-top: 1px dotted $alto-grey;
4897+ box-shadow: 0 1px 1px rgba(0, 0, 0, .1);
4898+ height: auto !important;
4899+
4900+ .table__row {
4901+ max-width: $site-max-width;
4902+ width: 100%;
4903+ margin: 0 auto;
4904+ display: block;
4905+ float: none;
4906+ border-bottom: 0;
4907+ overflow: hidden;
4908+ }
4909+ }
4910+
4911+ .table__row {
4912+ @extend %table-header-row;
4913+ }
4914+
4915+ .table__header {
4916+ @extend %table-header;
4917+
4918+ .table__header-link {
4919+ @extend %table-header-link;
4920+ }
4921+ }
4922+
4923+ .table__header-divide,
4924+ .divide {
4925+ @extend %table-divide;
4926+ }
4927+ }
4928+
4929+ .table__body {
4930+ display: table-row-group;
4931+ }
4932+
4933+ .table__footer {
4934+ display: table-footer-group;
4935+ }
4936+
4937+ // Table label style used as secondary information with in a table cell. Can
4938+ // also be used as a toggle.
4939+ //
4940+ // @example
4941+ // <div class="table__data">
4942+ // ...
4943+ // <span class="table__label">
4944+ // <a href="#">Show more</a>
4945+ // </span>
4946+ // </div>
4947+ //
4948+ // <div class="table__data active">
4949+ // ...
4950+ // <span class="table__label">
4951+ // <a href="#">Hide</a>
4952+ // </span>
4953+ // </div>
4954+ .table__label {
4955+ clear: both;
4956+ display: block;
4957+ margin-top: 5px;
4958+ line-height: 16px;
4959+ color: $pale-grey;
4960+
4961+ a {
4962+ color: $pale-grey;
4963+
4964+ &:hover {
4965+ color: $link-color;
4966+ }
4967+ }
4968+
4969+ &.is-active {
4970+
4971+ a {
4972+ color: $link-color;
4973+ }
4974+ }
4975+ }
4976+
4977+ // Table contol container, hidden unless hovered on the table row. Will have
4978+ // action controls which can effect the parent table row or other actions.
4979+ //
4980+ // @example
4981+ // <div class="table">
4982+ // <div class="table__row">
4983+ // <div class="table__data">
4984+ // ...
4985+ // </div>
4986+ // <div class="table__data">
4987+ // <div class="table__controls">
4988+ // <a href="#">Delete</a>
4989+ // <a href="#">Save</a>
4990+ // </div>
4991+ // </div>
4992+ // </div>
4993+ // </div>
4994+ .table__controls {
4995+ width: 100%;
4996+ text-align: right;
4997+ opacity: 0;
4998+ z-index: -1000;
4999+
5000+ &--secondary {
The diff has been truncated for viewing.